Rescue ハンドラをデフォルトで Ractor 安全にする変更

rails/rails

ActiveSupport::Rescuablerescue_handlers がデフォルトで freeze され、追加時にも freeze された配列を再構築するようになり、Ractor 環境で安全に共有できるようになりました。

背景

Ractor へ移行する際、共有できないオブジェクトが原因で例外ハンドラが正しく機能しないリスクがありました。

rescue_handlers は内部で配列として保持され、ハンドラは Proc オブジェクトで呼び出されますが、Proc はデフォルトでは Ractor 共有不可です。

そのため、デフォルト状態で安全な形に変更することで、Ractor に依存しないコードでも安心して例外処理を利用できるようになります。

技術的な変更

Rescuable モジュールは rescue_handlers の初期化と追加ロジックに freeze を導入し、配列自体と要素を不変にしました。

変更前は class_attribute :rescue_handlers, default: [] と定義され、self.rescue_handlers += [[key, with]] で配列を拡張していました。

class_attribute :rescue_handlers, default: []
self.rescue_handlers += [[key, with]]

変更後はデフォルト配列を [].freeze とし、追加時には既存配列を展開し新要素を freeze した上で全体を再度 freeze しています。

class_attribute :rescue_handlers, default: [].freeze
self.rescue_handlers = [*rescue_handlers, [key, with].freeze].freeze

この実装により、rescue_handlers は Ractor で共有可能な不変オブジェクトとなり、テストでも assert_ractor_shareable が成功することが確認されています。

設計判断

不変オブジェクトを利用して共有可能性を保証する方針が採用され、既存コードへの影響を最小限に抑えています。

freeze を追加しただけで API 変更はなく、rescue_from の呼び出し側は従来通りシンボルやブロックを渡せます。Proc を Ractor 共有にしたい場合は、利用者が ActiveSupport::Ractors.shareable_proc を明示的に使用します。

この設計は後方互換性と安全性のバランスをとり、Ractor 環境での例外ハンドリングを自然に利用できる基盤を提供します。

まとめ

rescue_handlers をデフォルトで freeze し、追加時も不変配列として再構築することで、例外ハンドラが Ractor で安全に共有できるようになりました。既存の使用方法は変わらず、必要に応じて shareable_proc を利用すればプロシージャも安全に扱えます。

記事メタデータ

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

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断、まとめが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックのファイル名付きハイライトは正しいですが、PRリンクの記法が[PR #57850]となっており、指定された[#123](URL)形式になっていません。

対象読者への適合性 ✓ PASS

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

エンジニア向けの技術的記述に留まり、初心者向けの余計な説明はありません。

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

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

各セクションが総論・各論・結論の段落構成になり、トピックセンテンスで始まり、1段落1トピック、長さも適切です。

Diff内容との照合 ✓ PASS

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

記事中のコードブロックはDiffの内容と完全に一致しており、変更点を正確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

freeze、Ractor、shareable_proc 等の用語は正しく使用されています。

説明の技術的正確性 ✓ PASS

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

技術的な説明はDiffとPRの記述と整合し、誤りはありません。

事実の突合 ✓ PASS

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

全ての主張がPR情報およびDiffで裏付けられており、捏造や推測はありません。

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

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

PR番号 #57850 が正しく記載されています。

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

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

記事タイトルはPRタイトルの意味を日本語で正確に伝えており、一致しています。

外部知識の正確性 ✓ PASS

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

外部知識(バージョンやリリース情報等)は含まれておらず、PRに基づく記述のみです。

時間表現の正確性 ✓ PASS

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

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