Сеанс Rails 2 застрял через некоторое время после сохранения переменной
Я работаю над существующим приложением Rails 2. Я преобразовал несколько структур хеш-данных в объекты, и если я поместил их в хранилище сеансов, это, похоже, затормажило сеанс, очистив user_id, среди прочего, и заставив другой вход в систему. Я использую dalli_store для сессии.
Следующий код приводит к удалению сеанса:
bug = MyClass.get_an_object()
session[:debug] = bug
Непонятно, ГДЕ это истребляется. Я могу пройти в отладчике до конца рендеринга представления, и сессия в порядке, но когда я нажимаю другую ссылку в пользовательском интерфейсе, session
пуст (Hash[0]), и я перенаправлен на страницу входа.
Если я немного изменю код, то сессия в порядке:
bug = MyClass.get_an_object()
session[:debug] = Marshal::dump(bug)
Однако, если я сохраню фактический объект (даже глубокую копию), сеанс будет потерян. Т.е. даже это не работает
session[:debug] = Marshal::load( Marshal::dump(bug) )
bug.size составляет около 140 КБ при маршалировании, поэтому он не должен быть переполнен memcached. В любом случае, я предполагаю, что сеанс сериализуется Marshal::dump()
, поэтому размер должен быть одинаковым. Не имеет значения, получаю ли я доступ к объекту в сеансе после его сохранения. Достаточно просто поместить его в сессию, чтобы вызвать проблему, но, как я уже сказал, сессия в порядке после сохранения объекта и всего процесса визуализации представления. Только в начале следующего запроса я узнаю, что он был засорен.
Я в тупике.
Есть ли у вас какие-либо рекомендации о том, как это отладить? На данный момент, я полагаю, я могу явно вызвать маршала, чтобы сохранить объект, но мне бы очень хотелось понять, почему сессия затягивается.
Я знаю, что плохо помещать большие объекты в сессию, но решение этой части проблемы выходит за рамки текущего проекта... возможно, позже. Кроме того, мне очень интересно, что здесь происходит.