Redis アダプタで `id: nil` を尊重するよう修正

rails/rails

ActionCable の Redis アダプタは、接続 ID を自動付与するロジックで id: nil を指定できないバグがありました。本修正により、明示的に id: nil を設定した場合でも CLIENT SETNAME が実行されず、利用者の意図が正しく反映されます。

背景

ActionCable::SubscriptionAdapter::Redis.redis_connector は接続設定ハッシュに対して config[:id] ||= "ActionCable-PID-#{$$}" と記述しており、||=nil を未設定とみなしてデフォルト名で上書きしていました。ドキュメントでは id: nil を指定すると名前付けをプロキシに委任できると説明されているにも関わらず、実装がそれを無視していました。さらに SubscriptionAdapter::Base#identifierunless key?(:id) ガードで nil を保持していたため、二つのロジックが矛盾していました。

技術的な変更

redis_connector の実装を config[:id] = "ActionCable-PID-#{$$}" unless config.key?(:id) に置き換え、キーが存在しない場合のみデフォルトを設定するようにしました。これにより id: nil が明示的に渡されたときは上書きされず、client.idnil のまま保持されます。

cattr_accessor :redis_connector, default: ->(config) do
  config = config.except(:adapter, :channel_prefix)
-  config[:id] ||= "ActionCable-PID-#{$$}"
+  config[:id] = "ActionCable-PID-#{$$}" unless config.key?(:id)

  redis_config = if config.key?(:sentinels)
    ::RedisClient.sentinel(**config)

テスト側も RedisAdapterTest::ConnectorCustomIDNilclient.id を直接検証するよう修正し、id: nil が正しく尊重されることを確認できるようになりました。

test "sets connection id for connection" do
  client = @adapter.send(:redis_connection)
  if connection_id.nil?
-    assert_nil connection_id
+    assert_nil client.id
  else
    assert_equal connection_id, client.id
  end
end

設計判断

この変更は 既存の config[:id] キーを拡張するだけ のシンプルなアプローチで、Base アダプタとロジックを統一しました。新たな設定キーやオプションを導入せず、後方互換性を保ちつつ期待通りの振る舞いを実現しています。ガード条件の統一はコードベース全体の一貫性を高め、将来的なメンテナンス負荷を低減します。

まとめ

id: nil が正しく保持されるようになったことで、プロキシ環境や外部命名管理下で ActionCable の Redis 接続を柔軟に構成できます。最小限の差分で既存動作を壊さずバグを修正した点が本変更の価値です。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
dfd55ded

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文→背景→技術的な変更→設計判断(任意)→まとめの構成が明確に示されており、必須要素が全て揃っています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトが正しい形式で使用され、PRリンクも `[ #57696 ](URL)` 形式で適切に記述されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rails の内部実装に関する記述で、専門エンジニア向けの内容になっており、過度な基礎説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論・結論の流れで構成され、段落はトピックセンテンスで始まり、1段落1トピック・長さも適切です。空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは提供された Diff と完全に一致し、ファイルパス・変更内容ともに合致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語は PR と一致し、誤用や不適切な用語はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な説明は Diff と PR の記述に基づいて正確で、因果関係も論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての主張は PR の情報で裏付けられており、根拠のない推測や数値的な誇張はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #57696 などの数値・固有名詞は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の主旨を正確に日本語化しており、内容と一致しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

外部知識(バージョンサポートやリリース情報等)は含まれておらず、PR 以外の情報はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現に関する記述はなく、PR と矛盾する表現もありません。