2

最近、Rails(3.0.9)アプリで起き始める問題をデバッグしようとしています。 )を使用して、データベースに非侵入マイグレーションが実行されたときに、これは以前は起こりませんでしたが、最近始まったはずの理由が見つかりません。Railsアプリケーションのエラーがマイグレーション後にスローされて、それに影響しないようにしました

私の実稼働環境にはいくつかのサーバーがあり、それぞれフォークされたUnicornインスタンスを使用しており、すべて単一のMySQLインスタンスを共有しています。各インスタンスは1の接続プールを使用しています。ステージングデータベースに対してテストした後、ライブデータをテストするための最終ステージング環境として使用されるサーバーも1台あります。

これまで、プロダクションUnicornサーバーを再デプロイせずに、プロダクションUnicodeサーバーを再起動せずに、プロダクションデータベースでマイグレーションを実行することができました。たとえば、既存のテーブルに新しいオプションのフィールドを追加すると、ステージングサーバーにデプロイされたコードはデータを書き込むことになりますが、既存のサーバーはそれを無視し、DBを使用し続けます新しいコードをプロダクションにプッシュする準備が整いました。

最近では、移行を実行した後で本番サーバーによって例外が発生していますが、変更された表に新しい行を挿入しようとすると例外が発生しています。アプリの他のすべての部品、および他のすべてのテーブル、影響を受けません、しかし、すぐに挿入がありますように、我々はこれを取得:

NoMethodError: undefined method `name' for nil:NilClass 

[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:56:in `visit_Arel_Nodes_InsertStatement' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:55:in `map' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:55:in `visit_Arel_Nodes_InsertStatement' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:15:in `send' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:15:in `visit' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:5:in `accept' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:18:in `accept' 
[GEM_ROOT]/bundler/gems/rails-83fb5552b6ab/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:111:in `with_connection' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:16:in `accept' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/tree_manager.rb:20:in `to_sql' 
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/select_manager.rb:217:in `insert' 

我々は、彼らが「にもかかわらず、運用サーバーを再起動した場合、問題が消えますまだ古いコードを実行しています。だから、テーブルが変更されたときに接続で何かが壊れているように見えますが、たとえこのエラーが発生しなかったとしても、移行前に何をしていたとしても問題はありません。

私はActiveRecord/ARelを掘り下げましたが、私ができることは、ある時点で、このテーブルのキャッシュされたモデルがどの列を持っているのか知りませんでしたが、なぜそれができるのか分かりませんそれはなぜかこれは突然起こっているのでしょうか?

答えて

2

私はジョーンズの同僚で、後世のためにこれに答えようとしています。

問題はキャッシングの結果でhttps://github.com/rails/rails/blob/v3.0.9/activerecord/lib/active_record/base.rbです。ある種のモデルクラスの本質的に@columnsと@arel_tableは同期していませんでした。後者はアプリの初期化中にキャッシュされ、新しいユニークなワーカーがマスターのユニコーンから継承したからです。

初期化中にモデルの:: scopedまたは:: unscopedへの呼び出しを防止し、後でcould notが呼び出した:: reset_column_informationを呼び出すことで修正しました。

関連する問題