現在、MySQL データベースを使用する Rails 3.2 アプリケーションで 2 つの非常に奇妙なバグが発生しています。
「parent_thing」に属するモデル「things」があります。これはオプションの関連付けであり、ほとんどの場合、nil であると予想されます。
ビューには、次のようなさまざまなブロックがあります。
if thing.parent_thing then
- show part of the view specific to things with parents
( if !thing.parent_thing.nil? や他の多くのバリアントも試しましたが、以下の動作に影響を与えるものはないようです)。
ローカル開発モードと Heroku のステージング環境では、これは期待どおりに機能します。4 つの Dyno で実行されている Heroku の本番環境では、約 70% の時間で動作しますが、設定されているかどうかに関係なく、thing.parent_thing への呼び出しが常に親を返すモードに切り替わるようです。
この動作はランダムに発生するように見えますが、一度発生し始めると、通常、システム全体で数時間発生します。その後、システムは最終的に期待される動作に戻ります。すべての Heroku dyno を再起動しても、一貫して問題が解決するわけではありません。Rails コンソールでログインし、関連する「モノ」エントリを検査すると、完全に正常な動作が得られます。
この動作を試して理解するために、エラー状態が発生するたびに、thing.inspect と thing.parent_thing.inspect の結果を送信するログを本番環境に追加しました。これは、thing.parent_thing_id を nil (正しい) として表示しますが、thing.parent_thing は関係なく親を返します。
上記に加えて、さらにデバッグを実装しようとすると、次のような問題が発生しました。
ビューの上部に変数 lines_when_parent_thing_exists = [] を作成しました。これは、thing.parent_thing が親を返す行番号を示す文字列を入力する配列です。
これに続いて、次のようなロギング関数が呼び出されます。
send_log_event({:message => "Lines where parent is returned",
:data => lines_when_parent_thing_exists.to_s})
unless lines_when_parent_thing_exists.empty?
上記の send_log_event 呼び出しは、配列が空であるかどうかに関係なく行われるため、データが [] である数百のログ エントリがあります。
これは、最初の問題が発生したときだけでなく、継続的に発生します。最初の問題に関する手がかりが得られるかどうかわからないため、これを含めます。
上記の原因について何か提案はありますか?