ActionMailbox::Callbacks::TERMINATOR を Ractor 共有可能に
ActionMailbox のコールバック終了処理で使用される TERMINATOR ラムダが Ractor 共有可能となり、Ractor 環境でも安全に実行できるようになりました。
背景
Ractor による並行実行を活用するため、ActionMailbox のコールバック機構全体が Ractor 安全になる必要があります。以前の PR #57629 で ActiveSupport::Callbacks 自体が Ractor 共有可能に改修されましたが、TERMINATOR ラムダだけは依然として非共有でした。今回の変更はその残されたギャップを埋め、コールバックの終了処理も Ractor 上で問題なく動作させることを目的としています。
技術的な変更
TERMINATOR 定数 が ActiveSupport::Ractors.shareable_lambda でラップされるよう変更され、Ractor 間で安全に共有できる形にしました。変更前と変更後のコードは以下の通りです。
-TERMINATOR = ->(mailbox, chain) do
- chain.call
- mailbox.finished_processing?
-end
+TERMINATOR = ActiveSupport::Ractors.shareable_lambda(&->(mailbox, chain) do
+ chain.call
+ mailbox.finished_processing?
+end)
define_callbacks の呼び出しは変更されず、更新された TERMINATOR がそのまま利用されています。そのため、実行時の振る舞いは従来と同一で、コールバックチェーンの終了判定ロジックに影響はありません。Ractor 共有可能化は内部表現の変更に留まり、外部 API への破壊的変更は行われていません。
設計判断
ラップ方式を選択したのは、既存の定数名と使用箇所をそのまま保ちつつ、shareable_lambda ヘルパーで共有可能性を付与できる点が最小侵襲であったためです。新たに別の定数や設定項目を導入せず、元のラムダをそのまま包装することで後方互換性を維持しています。
さらに、対象のラムダは mailbox と chain という引数のみを受け取り、外部状態を捕捉しないことが前提です。この性質により shareable_lambda が安全に適用でき、Ractor のコピーオンライトモデルと整合します。設計上のトレードオフはなく、機能追加と安全性向上が同時に実現されています。
まとめ
本 PR は ActionMailbox のコールバック終了処理を Ractor 共有可能にし、ActiveSupport::Callbacks 全体の Ractor 安全性を完結させました。TERMINATOR の実装を変更せずに共有可能化したことで、既存コードへの影響を最小限に抑えつつ、マルチスレッド/マルチプロセス環境での信頼性を高めています。