ActiveSupport JSON エンコーダーの Ractor 共有化実装をリバート

rails/rails

Rails 8.1 で導入された Ractor‑shareable な JSON エンコーダーの実装を取り消し、従来の挙動に戻します。このリバートにより、Ractor 起動時に発生していた CI のフレーク問題が回避されます。

背景

前回の PR(#57814)では、ActiveSupport::JSON のエンコーダーを Ractor から安全に呼び出せるよう Ractor‑shareable 化する変更が加えられましたが、テスト実行順序に依存して "[BUG] should have cvar cache entry" というクラッシュが sporadically 発生しました。PR の説明でも "CI flakiness" と明記されており、安定運用の阻害要因となったため、元の実装に戻す判断が下されました。

技術的な変更

Gemfile.lock のバージョンダウングレード

-    json (2.19.9)
+    json (2.15.2)

json gem のバージョンを 2.19.9 から 2.15.2 に戻すことで、Ractor‑shareable 用に追加された内部 API への依存を排除しました。

activesupport/lib/active_support/json/encoding.rb のロジック復元

  • 定数の freeze 削除正規表現の .freeze 除去 により、以前のシンプルなリテラル定義に戻しています。
  • JSONGemEncoder のコンストラクタでオプションを options.dup.freeze || {}.freeze から options || {} へ変更し、オプションハンドリングを元の形に復元しました。
  • JSONGemCoderEncoderCODER 生成が ActiveSupport::Ractors.shareable_proc ラッパーから外れ、単純なブロック定義に戻されています。
@@ -61,22 +61,22 @@ module Encoding # :nodoc:
-        U2028 => -'\u2028'.b,
-        U2029 => -'\u2029'.b,
-        ">".b => -'\u003e'.b,
-        "<".b => -'\u003c'.b,
-        "&".b => -'\u0026'.b,
+        U2028 => '\u2028'.b,
+        U2029 => '\u2029'.b,
+        ">".b => '\u003e'.b,
+        "<".b => '\u003c'.b,
+        "&".b => '\u0026'.b,
@@ -65,9 +65,9 @@
-      HTML_ENTITIES_REGEX = Regexp.union(*(ESCAPED_CHARS.keys - [U2028, U2029])).freeze
-      FULL_ESCAPE_REGEX = Regexp.union(*ESCAPED_CHARS.keys).freeze
-      JS_SEPARATORS_REGEX = Regexp.union(U2028, U2029).freeze
+      HTML_ENTITIES_REGEX = Regexp.union(*(ESCAPED_CHARS.keys - [U2028, U2029]))
+      FULL_ESCAPE_REGEX = Regexp.union(*ESCAPED_CHARS.keys)
+      JS_SEPARATORS_REGEX = Regexp.union(U2028, U2029)
@@ -144,7 +144,7 @@
-          @options = options.dup.freeze || {}.freeze
+          @options = options || {}
@@ -149,7 +149,7 @@
-          CODER = ::JSON::Coder.new(&ActiveSupport::Ractors.shareable_proc { |value, is_key|
+          CODER = ::JSON::Coder.new do |value, is_key|
@@ -177,7 +177,8 @@
-          }).freeze
+          end
+

テスト削除

activesupport/test/json/encoding_test.rb から Ractor 共有化に関するテストブロックが削除され、Ruby 4.0 以上での条件分岐コードが除かれました。これにより、テストスイートは Ractor に依存しない状態に戻ります。

@@ -582,23 +582,6 @@
-  if RUBY_VERSION >= "4.0"
-    def test_encoders_are_ractor_shareable
-      skip "Missing Ractor-shareable JSON::Coder" unless Gem::Version.new(::JSON::VERSION) >= Gem::Version.new("2.17.0")
-      ...
-    end
-  end
-

設計判断

今回のリバートは 安定性優先 の設計判断を示しています。Ractor 共有化は将来的な機能として残す意図があり、4.0.6 のリリースを待った上で再度導入検討する方針です。その間は従来のシングルスレッド向け実装を維持し、既存のテストと CI の信頼性を確保することが選択されました。実装を元に戻すことで、後方互換性はそのまま保たれ、ユーザーコードへの影響はありません。

まとめ

この PR は、Ractor 環境での JSON エンコーディングを試みた変更を取り消し、CI の不安定化を防止するための 安定化リバート です。json gem のバージョンを 2.15.2 に固定し、エンコーダー内部の Ractor‑shareable ロジックとそれに伴うテストを削除することで、従来の堅牢な実装に戻しました。今後は Ruby 4.0.6 以降で改めて共有化機能を導入する予定です。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
6780b537

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断(任意)、まとめの3部構成が明確に示されており、各要素が欠如していません。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックは正しいdiff形式ですが、ファイル名付きシンタックスハイライトは使用されていません。GitHubリンクは「[PR #57815]」という形で記載されており、仕様の「[#123]」形式と完全には一致していません。

対象読者への適合性 ✓ PASS

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

対象はRails/ActiveSupportに熟知したエンジニアであり、初心者向けの過度な説明はなく適切です。

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

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

各セクションは総論→各論→結論の流れになっており、段落はトピックセンテンスで始まり、1段落1トピックが保たれ、適切な長さで空行で区切られています。

Diff内容との照合 ✓ PASS

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

記事内のdiffブロックは提供されたDiffと一致し、ファイル名や変更内容に不整合はありません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「Ractor‑shareable」「JSONGemEncoder」などの用語はPRやDiffと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

リバートがCIフレーク問題を解消するという説明はPRの記述と整合しており、技術的に正確です。

事実の突合 ✓ PASS

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

記事の主張はすべてPRタイトル、説明、Diffで裏付けられており、推測や憶測は見受けられません。

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

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

PR番号、コミットID(省略)、jsonバージョン番号などの数値は正確です。

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

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

記事タイトルはPRの内容(Revert pull request #57814)を正確に表現しています。

外部知識の正確性 ✓ PASS

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

RailsやRubyのバージョンサポート情報など、PRに記載されていない外部知識は含まれていません。

時間表現の正確性 ✓ PASS

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

「4.0.6 のリリースを待った上で再度導入検討」という時間表現はPRの記述と一致しています。