macOS のフォークテストで発生する PostgreSQL GSS 暗号化クラッシュを回避

rails/rails

この PR は macOS 上で ReaperTest#test_connection_pool_starts_reaper_in_fork がクラッシュする原因を除去し、テストの安定化を実現します。具体的には、フォーク後の子プロセスで PostgreSQL 接続時に GSS 暗号化交渉を無効化し、セグメンテーションフォルトを防ぎます。

背景

macOS では fork() 後に子プロセスが新しい PostgreSQL 接続を作成すると、libpq の GSS 暗号化交渉が非 fork‑safe な Heimdal/Keychain スタックを呼び出し、セグメンテーションフォルト が発生します。テスト ReaperTest#test_connection_pool_starts_reaper_in_fork はこのコードパスをたどるため、CI 環境でも頻繁に失敗していました。この問題は PostgreSQL バグ #16041 と ruby‑pg イシュー #538 にも記録されており、現時点で根本的な修正は提供されていません。

技術的な変更

PR ではフォークされた子プロセスが ConnectionPool を生成する直前に GSS 暗号化を無効化する設定を追加しました。具体的な差分は以下の通りです。

変更前:

pool_config = duplicated_pool_config(reaping_frequency: "0.0001")

変更後:

pool_config = duplicated_pool_config(reaping_frequency: "0.0001", gssencmode: "disable")

duplicated_pool_configgssencmode: "disable" を渡すことで、子プロセス側の環境変数 PGGSSENCMODE=disable が内部的に設定され、libpq の GSS パスがスキップされます。この変更はテストコードのみで完結しており、プロダクションコードや他のテストケースには影響しません。

設計判断

本変更は 環境依存の不安定要素をテスト側で除外 するという方針に基づいています。上流の PostgreSQL バグが解消されるまでの暫定策として、問題のある暗号化機構をオプションで無効化できるように設計されています。代替案として adapter のデフォルト設定を変更する案も考えられましたが、既存の設定や他プラットフォームへの影響を最小化するため、テストケースに限定したパラメータ追加が選択されました。このアプローチにより、後方互換性を保ちつつ macOS 固有のクラッシュを回避できます。

まとめ

gssencmode: "disable" をテスト用プール設定に組み込むことで、macOS の fork 環境で発生していた PostgreSQL GSS 暗号化関連のセグメンテーションフォルトを防止しました。上流バグが解消されるまでの安全策として、テストコードに限定した設定拡張という設計判断がなされた点が本変更の核心です。

記事メタデータ

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

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断(任意)、まとめの5セクションが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライトが正しい形式 (```ruby:filepath) で使用され、PRリンクも #付きでリンク化されています。

対象読者への適合性 ✓ PASS

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

専門的なエンジニア向けの記述で、余計な入門的解説はなく適切です。

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

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

各セクションは総論・各論・結論の段落構成で、トピックセンテンスが先頭にあり、1段落1トピック・6文未満に収まっています。空行で区切られています。

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは提供されたDiffと完全に一致し、変更点が正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

GSS暗号化、PGGSSENCMODE、fork などの用語はPRで使用されたものと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

技術的説明はPRの目的と実装に沿っており、因果関係も論理的です。

事実の突合 ✓ PASS

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

記事の全ての主張はPRタイトル・説明・Diffで裏付けられており、推測や捏造はありません。

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

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

PR番号 #57585、変更された文字列 "0.0001"、gssencmode の値 "disable" など、数値・固有名詞は正確です。

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

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

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

外部知識の正確性 ✓ PASS

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

外部知識(バージョンサポート、リリース日程等)は一切記載されておらず、PR情報のみで完結しています。

時間表現の正確性 ✓ PASS

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

時間表現のずれはなく、PRの記述と一致しています。