ActionDispatch::Http::Session と Utils を起動時にロードし、名前空間を整理
ActionDispatch::Http::Session と ActionDispatch::Http::Utils を起動時にロードし、従来の ActionDispatch::Request::Session / Request::Utils から名前空間を変更したことで、Ractor 環境における遅延ロードの問題が解消されます。変更は内部参照の置換に留まり、外部 API の挙動は維持されています。
背景
Ractor 対応作業中に、ActionDispatch::Request::Session が最初のリクエストまでロードされないことがパフォーマンスとスレッド安全性の観点で課題になることが判明しました。元々は循環参照を回避するために 遅延 autoload が採用されていましたが、Ractor ではコードロードのタイミングが重要になるため、起動時に確実にロードできる設計が求められました。この PR はその課題に対し、名前空間を Http に移行しつつ eager_autoload を導入することで解決します。
技術的な変更
ActionDispatch::Http モジュールに eager_autoload ブロックを追加し、Session と Utils を起動時にロードするよう設定しました。
module ActionDispatch
module Http
autoload :Parameters
autoload :UploadedFile, "action_dispatch/http/upload"
autoload :URL
eager_autoload do
autoload :Session
autoload :Utils
end
end
end
ActionDispatch::Request からの autoload 宣言は削除され、すべての参照が新しい名前空間へ置換されました。具体例として、action_dispatch/http/request.rb 内でセッション設定メソッドが Http::Session に変更されています。
class Request
# ...
def session=(session) # :nodoc:
Http::Session.set self, session
end
def session_options=(options)
Http::Session::Options.set self, options
end
# ...
end
関連ファイル全般で Request::Utils も Http::Utils に置換され、パラメータエンコードやデープミュンス処理が同等に機能します。たとえば action_dispatch/http/param_builder.rb のエンコード呼び出しが以下のように変更されました。
hash = Http::Utils::CustomParamEncoder.encode_for_template(hash, encoding_template)
Http::Utils.check_param_encoding(hash)
テストコードも同様にリネームと参照変更が行われ、action_dispatch/test/dispatch/http/session_test.rb ではモジュール名が Http に統一されています。
module ActionDispatch
module Http
class SessionTest < ActiveSupport::TestCase
# ...
end
end
end
さらに、action_dispatch/railtie.rb の初期化フックで Http::Utils.perform_deep_munge が設定され、起動時に Http 名前空間全体が eager load されるようになっています。
ActiveSupport.on_load(:action_dispatch_request) do
Http::Utils.perform_deep_munge = app.config.action_dispatch.perform_deep_munge
end
設計判断
名前空間を Http に集約した主な設計判断は、モジュールの責務を明確化しつつ、起動時ロードを保証する点にあります。ActionDispatch::Request が担当するリクエスト処理と、HTTP 周辺ユーティリティ・セッション管理を同一モジュールにまとめることで、循環依存のリスクが低減し、Ractor 環境でのコードロードが確実になります。変更は内部参照の置換に留まり、外部 API(例: request.session)のシグネチャは変わらないため、既存アプリケーションへの破壊的影響はありません。さらに、eager_autoload によってロード順序が固定化され、テスト環境でも同様の挙動が保証されます。
まとめ
この PR は ActionDispatch の内部構造を整理し、Session と Utils を Http 名前空間に移行して起動時に eager load することで、Ractor 互換性とロード確実性を向上させました。挙動の変更はなく、既存コードへの影響を最小限に抑えた設計判断が示されています。