`ActiveSupport::EventReport::LogSubscriber` の `event_log_level` を Ractor セーフに

rails/rails

この PR は、ActiveSupport::EventReport::LogSubscriberevent_log_level API が Ractor 間で安全に共有できるよう、内部ハッシュの構築と凍結方法を変更します。既存の挙動を保ちつつ、共有可能な不変オブジェクトにすることで Ractor 環境での使用を可能にします。

背景

Ractor 安全性 が求められる場面では、ミュータブルなオブジェクトを複数の Ractor で共有すると予期しない競合が起こります。LogSubscriberevent_log_level は以前、log_levels[method_name.to_s] = level と直接ハッシュを変更していたため、同一ハッシュが複数 Ractor に渡された際に安全性が確保できませんでした。PR の目的は、このハッシュを不変(freeze)かつコピーされた形で扱うようにし、Ractor でも問題なく利用できるようにすることです。

技術的な変更

log_levels の更新ロジック が immutable なパターンに置き換えられました。具体的には、ハッシュをその場で上書きする代わりに merge で新しいハッシュを生成し、freeze してから self.log_levels に代入します。

@@
-          log_levels[method_name.to_s] = level
+          self.log_levels = log_levels.merge(method_name.to_s => level).freeze

さらに、クラス属性の初期値も凍結された空ハッシュに変更され、属性そのものが不変となります。

-      class_attribute :log_levels, default: {} # :nodoc:
+      class_attribute :log_levels, default: {}.freeze # :nodoc:

テスト も追加され、log_levels が Ractor で共有可能(shareable)であることを assert_ractor_shareable で検証しています。

+require "active_support/testing/ractors_assertions"
+
+class ActiveSupport::EventReporter::LogSubscriberTest < ActiveSupport::TestCase
+  include ActiveSupport::Testing::RactorsAssertions
@@
+  test "MyLogSubscriber.event_log_level is ractor safe" do
+    assert_ractor_shareable MyLogSubscriber.log_levels
+  end

設計判断

既存 API の維持 を最優先に、実装だけを不変オブジェクトに置き換える方針が取られました。event_log_level の呼び出し側は変更不要で、log_levels が自動的に新しい凍結ハッシュへ置き換わります。これにより、従来の log_levels[method] = level の副作用は排除され、Ractor 環境でも安全に利用できます。

class_attribute のデフォルトを凍結 した選択は、サブクラスが継承したときに同じハッシュインスタンスを共有しないようにするための防御策でもあります。凍結されたハッシュは変更できないため、予期しないミューテーションが発生しません。コード変更は最小限に抑えられ、動作上の後方互換性は維持されています。

まとめ

本変更により、ActiveSupport::EventReport::LogSubscriberevent_log_level が Ractor 安全な不変ハッシュを使用するようになり、共有可能性が確保されました。既存の挙動は変わらず、Ractor を活用したアプリケーションでもログレベルの設定が安全に行えるようになります。

記事メタデータ

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

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

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

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックのファイル名付きシンタックスハイライトは正しい形式です。GitHubリンクは "[PR #57976](URL)" となっており、期待される "[#57976](URL)" 形式から外れています。

対象読者への適合性 ✓ PASS

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

対象はRailsコア開発者向けで、専門用語が適切に使用されており、余計な初心者向け解説はありません。

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

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

各セクションは総論・各論・結論の構成を保ち、段落は1文で要点を示し、6文以下に収まっています。空行で区切られている点も問題ありません。

Diff内容との照合 ✓ PASS

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

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

技術用語の正確性 ✓ PASS

技術用語の正確な使用

Ractor、immutable、freeze、class_attribute、shareable などの用語が正しく使用されています。

説明の技術的正確性 ✓ PASS

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

変更の目的・効果がDiffとPRの記述と合致しており、技術的に誤りはありません。

事実の突合 ✓ PASS

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

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

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

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

PR番号 #57976 が正しく記載されています。その他数値や固有名詞の不一致はなし。

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

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

記事タイトルはPRタイトル「Make `ActiveSupport::EventReport::LogSubscriber` ractor safe」と意味的に一致しています。

外部知識の正確性 ✓ PASS

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

バージョン支援状況やリリース日程等の外部知識は記載されていません。

時間表現の正確性 ✓ PASS

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

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