disconnect後もピン留めされたコネクションをプールに保持

rails/rails

disconnect! 実行後もピン留めされたコネクションが @connections 配列に残るようになります。これにより、コネクション状態の不整合が解消され、クエリキャッシュが正常に機能するようになります。

背景

QueryCacheTest#test_cache_is_available_when_connection_is_connected が特定の実行順序で失敗する問題が #56796 で報告されました。PostgresqlByteaWithDecoderTest の teardown で disconnect! が呼ばれた後、次のテストでクエリキャッシュが機能しなくなっていました。

原因は disconnect! がすべてのコネクションを切断する際に @connections を空配列で初期化 していたことです。unpin_connection!@available に戻されたピン留めコネクションを checkout_and_verify が取得しても、@connections に追加されない状態が発生していました。その結果、connected?false を返し、クエリキャッシュが無効化されてしまう不整合が生じていました。

技術的な変更

activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rbdisconnect メソッドが修正され、@connections の初期化時にピン留めコネクションを保持するようになりました。

変更前:

@connections = []

変更後:

@connections = @pinned_connection ? [@pinned_connection] : []

この変更により、以下の不変条件が維持されます:

  • pin_connection! でピン留めされたコネクションは @connections に含まれる
  • checkout でチェックアウトされたコネクションは @connections に含まれる
  • checkout_and_verify で取得されたコネクションも @connections に含まれる

disconnect! 後の状態でもこの不変条件が保たれるようになりました。

設計判断

ピン留めコネクションを特別扱いする方式 が採用されました。

@pinned_connection の存在確認を三項演算子で行い、存在する場合のみ配列に含める実装です。これは disconnect! がすべてのコネクションを切断する処理の中で、唯一ピン留めコネクションだけは状態を保持する必要があるという設計判断を反映しています。#56799 では checkout_and_verify 側での対処も検討されましたが、根本原因である disconnect! での状態管理を修正する現行のアプローチが採用されました。

空配列への初期化は一見シンプルですが、ピン留めという例外的な状態を考慮していませんでした。条件分岐を加えることで、コネクションプールの状態管理の整合性を保つトレードオフです。

まとめ

本PRは、disconnect! 実行時の状態管理を修正することで、コネクションプールの不変条件を維持した変更です。1行の条件分岐追加により、ピン留めコネクションが存在する場合の connected? 判定が正常化し、クエリキャッシュの動作が安定します。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)、背景・技術詳細・設計判断(各論)、まとめ(結論)という「総論→各論→結論」の3部構成が明確に適用されており、非常に分かりやすい記事構成です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライトやGitHubのIssue/PRへのリンク記法が、ガイドラインに沿って正しく使用されています。

対象読者への適合性 ✓ PASS

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

Active Recordのコネクションプールに関する専門的な内容を、冗長な説明を省いて記述しており、対象読者である専門知識を持つエンジニアに完全に適合しています。

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

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

各セクションが総論・各論・結論で構成され、各パラグラフはトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が徹底されており、極めて高い可読性を実現しています。

Diff内容との照合 ✓ PASS

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

提供されたDiffの内容を、ファイルパスを含めて正確に引用できています。コードの改変や省略もありません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`@connections`, `@pinned_connection`, `query cache` など、Railsの内部実装に関する技術用語を正確かつ適切な文脈で使用できています。

説明の技術的正確性 ✓ PASS

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

コネクションプールの不整合が発生する原因と、今回の変更によってそれがどのように解決されるかの説明が、技術的に正確かつ論理的です。

事実の突合 ✓ PASS

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

記事内の主張はすべて、PRのDescriptionや関連するIssue/PR、Diffのコード変更によって裏付けられており、ハルシネーションや根拠のない推測は一切見られません。

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

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

PR番号(#56898)、Issue番号(#56796)、関連PR番号(#56799)がすべて正確に記載されています。

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

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

記事のタイトル「disconnect後もピン留めされたコネクションをプールに保持」は、元のPRタイトル「Keep pinned connections in the pool after disconnect」を的確に和訳し、内容を正確に反映しています。

外部知識の正確性 ✓ PASS

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

バージョン情報やリリース予定など、PR情報に記載のない外部知識の持ち込みはなく、提供された情報源に忠実な記事となっています。

時間表現の正確性 ✓ PASS

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

「近い将来」や「既に」といった時間表現の誤用や歪曲はなく、事実関係が正確に記述されています。