https://github.com/rails/solid_queue
コミット408b84cで`select_candidates`の戻り値が`ActiveRecord::Relation`に変わった副作用として、`lock_candidates`内の`none?`が不要な`SELECT ... FOR UPDATE SKIP LOCKED`クエリを発行するようになっていた。`.to_a`を追加してリレーションを即時評価することで余分なロッキングクエリを排除し、高負荷環境でのポーリング性能を改善する。
MySQLのクエリプランナーミスを回避するため、ブロックされたジョブ解放クエリにインデックスヒントを追加。SQLコメント形式を採用し、他のデータベースエンジンとの互換性を維持しながら、並行実行制御の競合状態を解決しています。
ジョブクラスが削除された場合でも並行制御をバイパスし、キュー全体のブロックを防ぐ変更。`concurrency_limited?`に`job_class`の存在チェックを追加することで、削除されたクラスのジョブは通常のジョブとして処理され、`NameError`で失敗して`FailedExecution`として記録されます。
Solid Queueのヘルスチェック処理に安全なナビゲーション演算子を追加し、プロセスレコードの削除と再登録の間に発生するタイミング競合を解決しました。これにより、分散環境での堅牢性が向上します。
Pumaプラグインにおいて、コンテナ環境での fork 失敗時に solid_queue_pid が nil になる場合の早期リターンを追加。これにより、シャットダウン時の TypeError を防ぎ、制約のある環境でも安全に動作するようになった。
ジョブの失敗記録時に`TypeError`が発生してSolid Queueが起動できなくなる問題を修正。`create_or_find_by!`を明示的な`create!`と例外処理に置き換え、既存レコードがある場合は新しいエラー情報で更新する実装に変更した。
Solid Queue 1.3.0以降で発生していた、スレッド終了時のクラッシュを修正。`replace_thread`が`process_instances`からエントリを削除しないため、同じ終了スレッドが繰り返し検出され`NoMethodError`が発生していた問題に対処。`ForkSupervisor`と同じガードパターンを適用し、管理データ構造の一貫性を確立。
Solid Queueで、自然言語のスケジュール設定が複数のCRON式を生成する場合に、最初の式のみが使用され残りが無視される問題を解決。Fugitの `multi: :fail` オプションを使用して複数CRON生成を検出し、ユーザーに適切なエラーメッセージを表示する機能を追加。
環境変数 `SOLID_QUEUE_SUPERVISOR_MODE` がスーパーバイザーモードの制御に使用できない不具合を修正。CLIクラスの `--mode` オプションからデフォルト値を削除し、Configurationクラスで環境変数を参照できるようにした。
Solid Queueの並行実行制御で、ジョブ完了時のブロック解除が新規BlockedExecutionを見逃す競合状態を修正。セマフォ確認時にFOR UPDATEロックを追加し、エンキューとsignal処理の原子性を保証。
Solid Queueの非同期スーパーバイザーでスレッド置換時に未定義変数を参照していたバグを修正。併せて、プロセス登録待機やシャットダウン処理に関する複数のテストの不安定性を解消し、テストスイート全体の信頼性を向上させました。
ワーカープロセスがSIGTERMなどのシグナルで終了した際、status.exitstaがnilを返してNoMethodErrorが発生する問題を修正。演算子の優先順位を括弧で明示し、to_iでnilを安全に0に変換することで、プロセス終了時の安定性を向上させました。
Solid Queueにasyncモードが追加され、workerとdispatcherを同一プロセス内のスレッドとして実行できるようになりました。1GBサーバーでのメモリ使用量が700MBから270MBへ削減され、小規模環境での運用が可能になります。
Rails 7.1〜8.2にかけて `enqueue_after_transaction_commit` 設定が複数回変遷したことを受け、Solid Queueのテストコードをバージョン番号のハードコードから設定値の動的検査へと変更しました。Rails 8.2で遅延エンキューが再びデフォルト有効化されたことへの対応で、将来の挙動変化にも追従できる堅牢なテスト条件分岐を実現しています。