環境変数によるスーパーバイザーモード指定が機能しない問題を修正

rails/solid_queue

Solid Queueのドキュメントには SOLID_QUEUE_SUPERVISOR_MODE 環境変数でスーパーバイザーモードを制御できると記載されていましたが、実際には環境変数が無視される不具合がありました。#709 は、CLIオプションのデフォルト値設定を削除することでこの問題を解決しています。

背景

Solid Queueのスーパーバイザーモードには、ワーカーとディスパッチャーを別プロセスで起動する fork モードと、スーパーバイザーと同じプロセス内で実行する async モードの2種類があります。READMEには環境変数でモードを切り替えられると記載されていましたが、SOLID_QUEUE_SUPERVISOR_MODE=async bin/jobs を実行してもforkモードで起動されるという問題が報告されました。

この不具合の原因は、CLIクラスとConfigurationクラスの間でのデフォルト値の優先順位にありました。Cli クラスが --mode オプションに "fork" をデフォルト値として設定していたため、環境変数が参照される前にオプション値が確定してしまっていました。

技術的な変更

lib/solid_queue/cli.rbclass_option :mode からデフォルト値の指定が削除されました。

変更前:

class_option :mode, type: :string, default: "fork", enum: %w[ fork async ],
  desc: "Whether to fork processes for workers and dispatchers (fork) or to run these in the same process as the supervisor (async) (default: fork).",
  banner: "SOLID_QUEUE_SUPERVISOR_MODE"

変更後:

class_option :mode, type: :string, enum: %w[ fork async ],
  desc: "Whether to fork processes for workers and dispatchers (fork) or to run these in the same process as the supervisor (async) (default: fork).",
  banner: "SOLID_QUEUE_SUPERVISOR_MODE"

これにより、Configuration クラスの初期化時に optionsmode キーが含まれなくなり、default_options メソッドで環境変数 SOLID_QUEUE_SUPERVISOR_MODE が参照されるようになりました。Configuration クラスでは以下のようにオプションとデフォルト値がマージされています:

def initialize(**options)
  @mode = SupervisorMode.new(options.fetch(:mode, default_options[:mode]))
end

private
  def default_options
    {
      mode: ENV.fetch("SOLID_QUEUE_SUPERVISOR_MODE", "fork")
    }
  end

新たに追加された test/unit/cli_test.rb では、4つのシナリオがテストされています:

  • 環境変数もオプションも指定しない場合はforkモードになること
  • SOLID_QUEUE_SUPERVISOR_MODE=async でasyncモードになること
  • オプション指定が環境変数より優先されること
  • 環境変数なしでもオプション指定が機能すること

テストは with_env ヘルパーで環境変数を制御し、Cli クラスから Configuration を生成して期待されるモードになることを検証しています。

設計判断

CLIクラスからデフォルト値を削除する方式 が採用されました。

デフォルト値の設定箇所を Cli から Configuration に一本化することで、環境変数・CLIオプション・コードレベルのデフォルト値という3層の優先順位が明確になりました。Thorライブラリの class_optiondefault を指定すると、オプションが未指定でも必ず値が設定されてしまうため、fetch の第2引数によるデフォルト値適用が機能しなくなります。

この修正により、「CLIオプション > 環境変数 > ハードコードされたデフォルト値」という直感的な優先順位が実現されています。descriptionには依然として "(default: fork)" の記載が残されており、デフォルト動作は変更されていません。

まとめ

本PRは、CLIクラスのデフォルト値設定を削除することで、環境変数によるスーパーバイザーモード制御を機能させる修正です。Thorの class_option の仕様を考慮し、デフォルト値の設定箇所を Configuration クラスに集約することで、ドキュメントに記載された動作を実現しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)→セクション群(各論)→まとめ(結論)の3部構成が記事全体で明確に適用されており、各セクションも必須要素をすべて満たしています。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```言語:ファイルパス)とGitHubのPR番号リンク記法([#709](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

Solid Queueの内部実装に関する内容であり、専門知識を持つエンジニアという対象読者に適した技術レベルと表現が用いられています。

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

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

各セクションが総論→各論で構成され、各段落がトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が徹底されており、非常に高い可読性を実現しています。

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは、提供されたDiff情報を正確に反映しています。また、文脈説明のために引用された既存コードも妥当です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「スーパーバイザーモード」「CLIクラス」「class_option」などの技術用語が、PRの文脈に沿って正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

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

CLIのデフォルト値設定が環境変数の読み込みを妨げていたという原因と、その解決策に関する説明は、技術的に正確で論理的です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのDescriptionやDiff内のコードによって裏付けられており、ハルシネーション(捏造)は見られません。

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

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

PR番号(#709)、ファイルパス、環境変数名などの数値・固有名詞はすべて正確に記載されています。

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

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

記事のタイトルは、PRのタイトル「Fix application of `SOLID_QUEUE_SUPERVISOR_MODE` environment variable」の内容を的確に要約しています。

外部知識の正確性 ✓ PASS

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

PR情報に基づかない外部知識(バージョンのサポート状況など)の追記はなく、PRの範囲内で事実に基づいた解説が行われています。

時間表現の正確性 ✓ PASS

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

「不具合がありました」といった過去形の表現がPRの状況と一致しており、時間表現の歪曲は見られません。