Sub-second worker_check_interval を受け入れるように変更

puma/puma

Puma の worker_check_interval が整数のみを受け付けていた制限を緩和し、Float() へ型変換を変更することで、サブセカンド単位のチェック間隔が利用可能になりました。これにより、ワーカーの死活監視がより高速に行えるようになります。

背景

整数への変換が原因で小数秒の指定が拒否されていた点が本変更の発端です。worker_check_interval 0.1 を設定すると ArgumentError が発生し、最小間隔が 1 秒に固定されていました(Integer("0.1") が例外を投げる)。

下流の処理は既に浮動小数点に対応しているため、DSL の型制限だけが障壁となっていました。Cluster#check_workers では Time.now + @options[:worker_check_interval]Cluster::Worker では sleep @options[:worker_check_interval] が呼ばれ、どちらも Float を受け入れます。

より速い障害検知が求められていたことが背景です。ワーカーがハングした際に 1 秒単位でしかチェックできないと、復旧までの遅延が増大します。サブセカンド間隔を設定できれば、ハング状態の検知が数百ミリ秒単位で可能になります。

技術的な変更

worker_check_interval のキャストが Integer() から Float() に変更されました。lib/puma/dsl.rb の該当メソッドは次のように書き換えられています。

@@ -1176,7 +1176,7 @@ def tag(string)
     # @see Puma::Cluster#check_workers
     #
     def worker_check_interval(interval)
-      @options[:worker_check_interval] = Integer(interval)
+      @options[:worker_check_interval] = Float(interval)
     end

文字列からの数値変換も Float() で行われるため、"0.5" のような入力が自動的に浮動小数点に変換されます。これにより、設定ファイルや DSL ブロックで文字列リテラルを使用しても期待通りに動作します。

テストが追加され、浮動小数点の受容が検証されています。test/test_config.rb では worker_check_interval 0.1 および worker_check_interval "0.5" の両方が正しく設定されることを assert しています。

+  def test_worker_check_interval_accepts_float
+    conf = Puma::Configuration.new { |c| c.worker_check_interval 0.1 }
+    conf.clamp
+    assert_equal 0.1, conf.options[:worker_check_interval]
+  end
+
+  def test_worker_check_interval_accepts_float_string
+    conf = Puma::Configuration.new { |c| c.worker_check_interval "0.5" }
+    conf.clamp
+    assert_equal 0.5, conf.options[:worker_check_interval]
+  end

既存の整数値は浮動小数点へ自動変換され、互換性が保たれます。例えば 55.0 として格納され、Time#+sleepworker_timeout の比較ロジックはすべて Float を問題なく扱えるため、既存ユーザーへの影響はありません。

設計判断

新しい設定キーを導入せず、既存の worker_check_interval を拡張する方針が採られました。これにより API のシンプルさが維持され、利用者は既存コードを変更せずにサブセカンド間隔を指定できるようになります。

入力検証は Float() に委ねられ、非数値入力は従来通り例外を発生させます。Float("abc")ArgumentError を投げるため、設定ミスの検出は変わらず安全です。

まとめ

本 PR は worker_check_interval の型変換を Float() に変更しただけで、サブセカンド単位のワーカー監視が可能となり、ハング検知の応答性が向上します。整数値との互換性も保たれ、既存設定への影響はありません。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
1d46b33f

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

対象読者への適合性 ✓ PASS

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

技術者向けの専門的な内容で、過度な初心者向け解説はありません。

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

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

各セクションが総論・各論・結論の段落構成になっており、段落はトピックセンテンスで始まり、1段落1トピック、6文以内に収まっています。空行で区切られています。

Diff内容との照合 ✓ PASS

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

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

技術用語の正確性 ✓ PASS

技術用語の正確な使用

用語(Integer、Float、DSL、worker_check_interval など)は PR と一致し、誤用は見られません。

説明の技術的正確性 ✓ PASS

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

技術的な説明は PR の記述と整合しており、因果関係も論理的です。

事実の突合 ✓ PASS

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

記事の全ての主張は PR タイトル、説明、Diff に裏付けられており、推測や憶測はありません。

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

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

PR 番号やコード中の数値(0.1、0.5 など)は正確です。

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

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

記事タイトルは PR タイトル「Allow sub-second `worker_check_interval`」の意味を正しく日本語化しています。

外部知識の正確性 ✓ PASS

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

外部知識(LTS、リリース日程等)の記載はなく、PR に基づく情報のみです。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はなく、PR の記述と一致しています。