ActionDispatch::Http::Session と Utils を起動時にロードし、名前空間を整理

rails/rails

ActionDispatch::Http::SessionActionDispatch::Http::Utils を起動時にロードし、従来の ActionDispatch::Request::Session / Request::Utils から名前空間を変更したことで、Ractor 環境における遅延ロードの問題が解消されます。変更は内部参照の置換に留まり、外部 API の挙動は維持されています。

背景

Ractor 対応作業中に、ActionDispatch::Request::Session が最初のリクエストまでロードされないことがパフォーマンスとスレッド安全性の観点で課題になることが判明しました。元々は循環参照を回避するために 遅延 autoload が採用されていましたが、Ractor ではコードロードのタイミングが重要になるため、起動時に確実にロードできる設計が求められました。この PR はその課題に対し、名前空間を Http に移行しつつ eager_autoload を導入することで解決します。

技術的な変更

ActionDispatch::Http モジュールに eager_autoload ブロックを追加し、SessionUtils を起動時にロードするよう設定しました。

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::UtilsHttp::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 の内部構造を整理し、SessionUtilsHttp 名前空間に移行して起動時に eager load することで、Ractor 互換性とロード確実性を向上させました。挙動の変更はなく、既存コードへの影響を最小限に抑えた設計判断が示されています。

記事メタデータ

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

この記事は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 #57856](URL)` となっており、仕様の `[ #57856](URL)` と異なります。

対象読者への適合性 ✓ PASS

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

対象はRails内部構造を理解しているエンジニア向けで、初心者向けの余計な説明はなく適切です。

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

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

各セクションは総論パラグラフ、具体的な各論、結論パラグラフで構成され、段落はトピックセンテンスで始まり 1段落1トピック、長さも適切です。

Diff内容との照合 ✓ PASS

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

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

技術用語の正確性 ✓ PASS

技術用語の正確な使用

eager_autoload、autoload、Ractor などの用語はPRで使用されているものと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

技術的な主張はDiffとPRの説明に裏付けられており、因果関係も論理的です。

事実の突合 ✓ PASS

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

全ての事実はPRの背景・目的・変更内容に基づいており、数値や外部情報の捏造はありません。

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

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

PR番号 #57856 が正しく記載されており、他の数値・固有名詞の誤りは見られません。

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

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

記事タイトルはPRの内容(Session と Utils の起動時ロードと名前空間整理)を正確に表現しています。

外部知識の正確性 ✓ PASS

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

記事はPRに記載された情報以外のバージョン情報やリリース予定などの外部知識を含んでいません。

時間表現の正確性 ✓ PASS

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

時間表現は使用されておらず、PRの表現と矛盾はありません。