Как исправить переполнение стека после обновления рельсов 2.0.2 до 2.3.5 (или даже 2.1.0) => в ActiveRecord :: SessionStore - PullRequest
0 голосов
/ 23 февраля 2010

Хорошо, поэтому мы обновляем устаревший код клиента с 2.0.2 до последних версий. Большинство основ было легко исправить, но я не могу добраться до экранов администратора. Каждый раз, когда мы нажимаем «current_user», мы получаем ошибку «слишком большой уровень стека».

Я глубоко копался в коде (читай: много чего происходило случайным образом) и наконец сузил его до хранилища ActiveRecord :: Session.

Код берется в строке, включающей «session [: user]».

Когда я спулингую скрипт / консоль, я могу повторить переполнение стека следующей строкой:

s = ActiveRecord::SessionStore::Session.new(:session_id => '42', :data => {})

трассировка стека, чтобы следовать.

Чтобы убедиться, что это не какая-то странная несовместимость, я сдул таблицу сеансов в базе данных и перезагрузил ее с помощью rake db: session: create, и она все еще находится в этой строке.

SystemStackError: stack level too deep
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/schema_definitions.rb:68:in `type_cast'
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:161:in `field_changed?'
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:132:in `write_attribute_without_dirty'
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:139:in `write_attribute'
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/attribute_methods.rb:211:in `session_id='
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2746:in `send'
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2746:in `attributes='
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2742:in `each'
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2742:in `attributes='
 from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2438:in `initialize'
 from (irb):10:in `new'

Я вошел в active_record и вставил кучу строк пут. Вот краткая версия: последние две строки постоянно повторяются и явно переполняют стек ... но почему column_for_attribute (session_id) вызывает переполнение?

"in respond_to? method: session_id="
"in respond_to? session_id= - there are no generated methods. generating..."
"in respond_to? session_id= - methods generated"
"responds to session_id=? y"
"in respond_to? method: session_id="
"in respond_to? session_id= - super is true"
"in read_attribute: session_id about to fetch value"
"fetched attr value: nil"
"read attr: session_id - value nil"
"column for attribute: session_id"
"c_for_a got col hash - accessing for name: session_id"
"column for attribute: session_id"
"c_for_a got col hash - accessing for name: session_id"
"column for attribute: session_id"
"c_for_a got col hash - accessing for name: session_id"
"column for attribute: session_id"
"c_for_a got col hash - accessing for name: session_id"

Примечание: мы также попытались обновить только до 2.1.0, и возникает та же ошибка (при попытке входа в систему - очевидно, что сессионный класс менял имена между ними, поэтому проблема scipt / console зависит от имени класса). На этот раз он бесконечно пытается просто «id» вместо «session_id».

Ниже приведены текущие настройки сеанса environment.rb (для версии 2.1.0):

# Use the database for sessions instead of the file system
# (create the session table with 'rake db:sessions:create')
config.action_controller.session_store = :active_record_store
config.action_controller.session = { :session_key => "_our_session_id",
    :secret=> "some random secret key of your choosing over 30 characters" } 

Если я вернусь к v2.0.2, он снова заработает.

Таким образом, я предполагаю, что вопрос: что изменилось в сеансе ActiveRecord между v 2.0.2 и 2.1.0 и как я могу заставить его работать?

1 Ответ

1 голос
/ 23 февраля 2010

Хорошо, похоже, проблема в том, что был старый back-port / monkey-patch.В каталоге плагинов у нас был бэк-порт с «грязной» функциональностью, которая, я думаю, должна была появиться в Rails 2.1.0.Все, что я знаю, это то, что удаление этого плагина, по-видимому, устранило проблему «слишком большого уровня стека» (на данный момент).:)

...