повреждение сеанса rails ArgumentError (ошибка формата дампа) - PullRequest
0 голосов
/ 19 июня 2019

Мы используем redis для хранения наших сессий в Rails 5.2, и недавно мы переключили наш редис-хостинг, и начали видеть некоторые странные ошибки для некоторых сессий, но не все:

puma 002 debug_exceptions.rb:9 exception=[ArgumentError: dump format error(0x37): /app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.2.1/lib/active_suppo
rt/core_ext/marshal.rb:6:in `load'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.2.1/lib/active_support/core_ext/marshal.rb:6:in `load'
/app/vendor/bundle/ruby/2.5.0/gems/redis-store-1.5.0/lib/redis/store/serialization.rb:44:in `_unmarshal'
/app/vendor/bundle/ruby/2.5.0/gems/redis-store-1.5.0/lib/redis/store/serialization.rb:17:in `get'
/app/vendor/bundle/ruby/2.5.0/gems/redis-store-1.5.0/lib/redis/store/namespace.rb:23:in `block in get'
/app/vendor/bundle/ruby/2.5.0/gems/redis-store-1.5.0/lib/redis/store/namespace.rb:89:in `namespace'
/app/vendor/bundle/ruby/2.5.0/gems/redis-store-1.5.0/lib/redis/store/namespace.rb:23:in `get'
/app/vendor/bundle/ruby/2.5.0/gems/redis-rack-2.0.4/lib/rack/session/redis.rb:50:in `block (2 levels) in get_session'
/app/vendor/bundle/ruby/2.5.0/gems/redis-rack-2.0.4/lib/rack/session/redis.rb:94:in `with'
/app/vendor/bundle/ruby/2.5.0/gems/redis-rack-2.0.4/lib/rack/session/redis.rb:50:in `block in get_session'
/app/vendor/bundle/ruby/2.5.0/gems/redis-rack-2.0.4/lib/rack/session/redis.rb:79:in `with_lock'
/app/vendor/bundle/ruby/2.5.0/gems/redis-rack-2.0.4/lib/rack/session/redis.rb:49:in `get_session'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/session/abstract/id.rb:425:in `find_session'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/session/abstract/id.rb:280:in `load_session'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-5.2.2.1/lib/action_dispatch/middleware/session/abstract_store.rb:46:in `block in load_session'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-5.2.2.1/lib/action_dispatch/middleware/session/abstract_store.rb:54:in `stale_session_check!'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-5.2.2.1/lib/action_dispatch/middleware/session/abstract_store.rb:46:in `load_session'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-5.2.2.1/lib/action_dispatch/request/session.rb:221:in `load!'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-5.2.2.1/lib/action_dispatch/request/session.rb:217:in `load_for_write!'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-5.2.2.1/lib/action_dispatch/request/session.rb:118:in `[]='
...

Когда мы проверяем сеанс и пытаемся вручную использовать Marshal.load в данных, мы получаем ту же ошибку.

У нас есть пара вопросов, связанных с этим:

  1. Если загрузка сеанса не удалась, не должен ли Rails сделать сеанс недействительным и отменить его? Есть ли какая-либо конфигурация или опция для этого?
  2. Вероятно, мы не сможем "исправить" данные сеанса, но нам все еще любопытно понять, что конкретно не удалось загрузить ... Есть ли способ получить более точную информацию из Marshal.load или отладки (де) сериализация точнее?
...