https://github.com/puma/puma
puma/pumaにて、[#3582](https://github.com/puma/puma/pull/3582) で導入された重複コードを整理するリファクタリングが行われました。`setup_body` と `write_chunk` の2箇所に存在した「バッファクリア・ステータスコード設定・例外送出」の重複処理が、新設の `raise_above_http_content_limit` メソッドに一本化されています。
`fork_worker`モードでワーカー0が事前に再起動された状態でフェーズドリスタートを行うと、staleなワーカー0からforkが連鎖し古いコードが残り続けるバグを修正。`@workers`配列へのワーカー追加を末尾追記(`<<`)からインデックス指定挿入(`Array#insert`)に変えるだけの1行修正で、配列の順序とワーカーインデックスの整合性を保証します。
Pumaのシャットダウンデバッグ機能 `shutdown_debug` に `on_force: true` オプションが追加されました。従来はシャットダウン開始直後に全スレッドをダンプしていましたが、新オプションを使うと `force_shutdown_after` のタイムアウト超過後に残存するスレッドのみをダンプするため、シャットダウンをブロックしている原因スレッドを特定しやすくなります。あわせてバックトレースダンプの責務が `Server` から `ThreadPool` に移管されるリファクタリングも行われています。
Pumaのスレッドプールに「IOバウンドスレッド」という概念を導入し、`env["puma.mark_as_io_bound"].call` でリクエストをIO待ち専用スレッドとしてマークできるようになりました。IOバウンドスレッドは `max_threads` のカウントから外れ、新たな `max_io_threads` 設定でその上限を管理できます。ストリーミングやプロキシのような長時間IO待ちが発生するリクエストが通常のCPUバウンドなリクエストのスループットを圧迫しなくなります。
Pumaに `single` と `cluster` 設定フックが追加され、実行モードに応じた条件分岐が可能になりました。フォーク非対応のJVMなどのライブラリ初期化を、単一の設定ファイル内でモード別に記述できます。
client.rbとrequest.rbに分散していたリクエストのenv処理コードをclient_env.rbに集約。ClientEnvモジュールとして切り出すことで、リクエスト検証ロジックを一箇所にまとめ、コードの責務を明確化しました。
pumactlテスト用に設定ファイルベースのヘルパーメソッド `set_pumactl_config` を追加し、バインディングとコントロール用のポート・パス変数の命名を統一。Windows環境でのサーバー停止処理の制約も明示的にエラー化されました。
テストにおける環境変数の保存・復元パターンを `with_temp_env` ヘルパーに集約。`temp_env` と `del_env` の2つのパラメータで「値の一時変更」と「キーの一時追加」に対応し、コードの重複を解消。
Pumaに、サーバー稼働中にスレッド数の最小値・最大値を動的に変更できる新しいAPIが追加されました。既存のスレッド管理ロジックを活用し、最小限の変更で動的調整機能の基盤を提供しています。