Sub-second worker_check_interval を受け入れるように変更
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
既存の整数値は浮動小数点へ自動変換され、互換性が保たれます。例えば 5 は 5.0 として格納され、Time#+、sleep、worker_timeout の比較ロジックはすべて Float を問題なく扱えるため、既存ユーザーへの影響はありません。
設計判断
新しい設定キーを導入せず、既存の worker_check_interval を拡張する方針が採られました。これにより API のシンプルさが維持され、利用者は既存コードを変更せずにサブセカンド間隔を指定できるようになります。
入力検証は Float() に委ねられ、非数値入力は従来通り例外を発生させます。Float("abc") が ArgumentError を投げるため、設定ミスの検出は変わらず安全です。
まとめ
本 PR は worker_check_interval の型変換を Float() に変更しただけで、サブセカンド単位のワーカー監視が可能となり、ハング検知の応答性が向上します。整数値との互換性も保たれ、既存設定への影響はありません。