Active Record Railtie を Ractor 対応に

rails/rails

Active Record の Railtie が Ractor 環境でも安全に動作できるよう、メッセージ検証用プロックを共有可能に変更しました。これにより、従来の動作を保持しつつ、Ractor の並行実行時に起因するプロックのコピーエラーを防止します。

背景

Active Record の Railtie はアプリケーション起動時にメッセージ検証ロジックを構成しますが、Ractor が導入されるとプロックが複数の Ractor 間で共有できず例外が発生する可能性があります。従来は app.message_verifiers.prependrotate に直接ブロックを渡していたため、Ractor 安全性が確保されていませんでした。今回の変更は、その安全性を確保しつつ機能的な振る舞いを変えないことを目的としています。

技術的な変更

legacy_options の不変化

legacy_options ハッシュに対して .freeze が付与され、変更不可オブジェクトとして扱われるようになりました。これにより、複数の Ractor が同一ハッシュ参照を共有しても予期しないミューテーションが起きません。変更前後は以下の通りです。

- legacy_options = { digest: "SHA256", serializer: JSON, url_safe: true }
+ legacy_options = { digest: "SHA256", serializer: JSON, url_safe: true }.freeze

メッセージ検証プロックの共有化

app.message_verifiers に渡されるブロックが ActiveSupport::Ractors.shareable_proc でラップされ、Ractor 間で安全に共有できるよう変更されました。prependrotate の両方で同様のラップが適用され、ブロックのロジック自体は変更されていません。shareable_proc は Ruby の Ractor 機能に合わせたラッパーで、プロックをコピーせずに共有可能にします。

- app.message_verifiers.prepend { |salt| legacy_options if salt == "active_record/signed_id" }
+ app.message_verifiers.prepend(&ActiveSupport::Ractors.shareable_proc { |salt| legacy_options if salt == "active_record/signed_id" })

- app.message_verifiers.rotate { |salt| legacy_options if salt == "active_record/signed_id" }
+ app.message_verifiers.rotate(&ActiveSupport::Ractors.shareable_proc { |salt| legacy_options if salt == "active_record/signed_id" })

この変更により、Ractor 環境下でもメッセージ検証プロセスが例外なく実行されます。

設計判断

ActiveSupport::Ractors.shareable_proc を利用して既存のブロックを包む方針が採用され、API の公開や呼び出し側のコードを変更する必要がありませんでした。代替案として新しい設定キーやメソッドを導入する案も考えられましたが、後方互換性と最小侵襲を重視して既存ロジックのラップに留める判断が下されました。legacy_options を immutable にした点も同様に、データ共有時の安全性を高めるための設計的配慮です。

まとめ

この PR は、Active Record Railtie のメッセージ検証ロジックを Ractor 安全にするための最小限の変更です。legacy_options の freeze と shareable_proc によるブロック包装により、従来の振る舞いを維持しつつ Ractor 環境での例外を防止します。結果として、Rails アプリケーションは Ractor を活用した並行実行へシームレスに移行できるようになります。

記事メタデータ

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

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断(任意)、まとめの5部構成が明確で、各要素が適切に配置されています。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックのファイル名付きシンタックスハイライトは正しい形式です。PRリンクは "[PR #57602]" となっており、仕様の "[#57602]" 形式と完全に一致していません。コミットIDのリンクは存在しませんが必須ではありません。

対象読者への適合性 ✓ PASS

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

対象はRailsエンジニア向けで、専門用語が中心となっており、初心者向けの過度な説明はありません。

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

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

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

Diff内容との照合 ✓ PASS

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

記事中のコードブロックは提供されたDiffと完全に一致し、ファイル名・変更行も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語はPR情報と合致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

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

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

事実の突合 ✓ PASS

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

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

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

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

PR番号やコード中のリテラルは正確です。

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

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

記事タイトルはPRタイトル「Make Active Record Railtie Ractor safe」の意味を正しく日本語化しています。

外部知識の正確性 ✓ PASS

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

記事に含まれる外部知識(バージョンサポートやリリース情報等)はありません。

時間表現の正確性 ✓ PASS

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

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