Dalli 5へのアップグレード
この変更により、memcachedクライアントライブラリ Dalli がバージョン5にアップグレードされました。これにより、Dalli 4.1.0以降で非推奨とされていたバイナリプロトコルに関する警告が解消されます。
背景
Dalli 4.1.0以降、従来のバイナリプロトコルが非推奨となり、テスト実行時に大量の警告が出力される問題がありました。#56704 では、MemCacheStoreTest の実行時に「The binary protocol is deprecated and will be removed in Dalli 5.0.」という警告が繰り返し表示される状況が報告されています。この警告は、Dalli 5でバイナリプロトコルが削除される予定であることを示していました。
Dalliはmemcached 1.6以降で利用可能なメタプロトコルへの移行を推奨していましたが、Railsの MemCacheStore はバイナリプロトコルをデフォルトとして使用していたため、アップグレード対応が必要でした。
技術的な変更
バージョン制約の撤廃とテストコードの修正が行われました。
依存関係の更新
Gemfile で設定されていたDalliのバージョン制約 ">= 3.0.1", "< 5" が削除され、最新版が使用されるようになりました。
変更前:
gem "dalli", ">= 3.0.1", "< 5"
変更後:
gem "dalli"
この変更により、Gemfile.lock でのDalliバージョンが4.3.2から5.0.0に更新されています。
テストコードのプロトコル対応
activesupport/test/cache/stores/mem_cache_store_test.rb では、Dalliのバージョンに応じて使用するプロトコルクラスを切り替えるロジックが追加されました。
if Dalli::VERSION >= "5."
DALLI_PROTOCOL = Dalli::Protocol::Meta
DALLI_PROTOCOL_NAME = :Meta
else
DALLI_PROTOCOL = Dalli::Protocol::Binary
DALLI_PROTOCOL_NAME = :Binary
end
class UnavailableDalliServer < DALLI_PROTOCOL
def alive?
false
end
end
Dalli 5以降では Dalli::Protocol::Meta が、それ以前では Dalli::Protocol::Binary が使用されます。UnavailableDalliServer クラスはこの定数を継承することで、バージョン間の互換性を保っています。
テストヘルパーメソッドのリファクタリング
テスト用のヘルパーメソッドが stub_const を使用する形に統一されました。
変更前:
def emulating_latency
old_client = Dalli.send(:remove_const, :Client)
Dalli.const_set(:Client, SlowDalliClient)
yield
ensure
Dalli.send(:remove_const, :Client)
Dalli.const_set(:Client, old_client)
end
変更後:
def emulating_latency(&block)
stub_const(Dalli, :Client, SlowDalliClient, &block)
end
手動での定数の付け替えから stub_const メソッドへの移行により、コードが簡潔になり保守性が向上しています。emulating_unavailability メソッドも同様のパターンでリファクタリングされました。
設計判断
当初 #56721 では、メタプロトコルをデフォルトにする段階的な移行が検討されていました。しかし、本PRではDalli 5へのアップグレードを優先し、プロトコルの選択をDalli側のデフォルトに委ねる方針が採用されています。
テストコードでは、バージョン判定による条件分岐を導入することで、Dalli 4との互換性を維持しつつDalli 5への移行を可能にしました。この実装により、Railsのテストスイートは両バージョンで動作可能な状態を保っています。
まとめ
本PRは、Dalli 5へのアップグレードを通じて非推奨警告の解消と将来的な互換性を確保した変更です。バージョン制約の撤廃とテストコードのプロトコル対応により、memcachedクライアントライブラリの最新版を活用できる環境が整いました。