2

최근에 내 Rails (3.0.9) 응용 프로그램에서 다시 시작해야하는 문제를 디버깅하려고합니다. 응용 프로그램의 인스턴스를 다시 배포해야합니다 (다시 배포하지 않음). 데이터베이스에서 비 중단 이주가 수행 될 때). 이것은 이전에는 발생하지 않았고 최근에 시작해야하는 이유를 찾을 수 없습니다.레일즈 응용 프로그램이 이전에 오류가 발생해서 오류가 발생했습니다.

내 프로덕션 환경에는 각각 하나의 MySQL 인스턴스를 공유하는 fork 된 Unicorn 인스턴스를 사용하는 서버가 몇 개 있습니다. 각 인스턴스는 1의 연결 풀을 사용하고 있습니다. 또한 준비 데이터베이스를 테스트 한 후 실제 데이터를 테스트하기위한 최종 준비 환경으로 사용되는 서버가 하나 있습니다.

이전에는 이전 코드가 전혀 필요하지 않은 마이그레이션 인 경우 프로덕션 유니콘 서버를 다시 배포하거나 다시 시작하지 않고도 프로덕션 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

나는 Jon 's의 동료이며, 후손을 위해이 질문에 답변 할 예정입니다.

문제는 캐싱의 결과로 https://github.com/rails/rails/blob/v3.0.9/activerecord/lib/active_record/base.rb입니다. 어떤 모델 클래스의 @columns와 @arel_table은 동기화되지 않았습니다. 왜냐하면 후자는 앱 초기화 중에 캐싱되어 새로운 유니콘에 의해 마스터 유니콘으로부터 상속 받았기 때문입니다.

초기화 할 때 모델의 :: scoped 또는 unscoped에 대한 호출을 방지하고 나중에 호출 할 수있는 :: reset_column_information을 호출하여 문제를 해결했습니다.

관련 문제