NoMethodError: неопределенный метод `delete'для nil:NilClass; Rails 3.2.21, Spree 2.0.13.beta; использование хранилища Active Record Session

Я вижу необычный сбой, связанный с хранилищем Active Record Session, который происходит периодически (и я не могу воспроизвести локально):

NoMethodError: неопределенный метод `delete'для nil:NilClass

Рельсы: 3.2.21

Я использую active_record_store, и трассировка стека не проходит через мое приложение. Интересно, что трассировка стека проходит через код active_record / session_store.rb Полная трассировка стека:

y/2.0.0/gems/activerecord-3.2.21/lib/active_record/attribute_methods/write.rb:28 :in `write_attribute`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/attribute_methods/dirty.rb:67 :in `write_attribute`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/attribute_methods.rb:31 :in `[]=`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_association.rb:413 :in `block (2 levels) in merge_target_lists`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_association.rb:412 :in `each`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_association.rb:412 :in `block in merge_target_lists`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_association.rb:404 :in `map!`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_association.rb:404 :in `merge_target_lists`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_association.rb:335 :in `load_target`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_proxy.rb:44 :in `load_target`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/associations/collection_proxy.rb:73 :in `respond_to?`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/session_store.rb:56 :in `dump`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/session_store.rb:56 :in `marshal`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/session_store.rb:150 :in `marshal_data!`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:407 :in `_run__823684787928912900__save__1569062307686968059__callbacks`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:405 :in `__run_callback`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:385 :in `_run_save_callbacks`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:81 :in `run_callbacks`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/callbacks.rb:264 :in `create_or_update`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/persistence.rb:84 :in `save`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/validations.rb:50 :in `save`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/attribute_methods/dirty.rb:22 :in `save`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/transactions.rb:259 :in `block (2 levels) in save`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/transactions.rb:313 :in `block in with_transaction_returning_status`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/database_statements.rb:192 :in `transaction`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/transactions.rb:208 :in `transaction`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/method_tracer.rb:343 :in `block in transaction_with_trace_ActiveRecord_self_name_transaction`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/method_tracer_helpers.rb:82 :in `trace_execution_scoped`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/method_tracer.rb:341 :in `transaction_with_trace_ActiveRecord_self_name_transaction`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/transactions.rb:311 :in `with_transaction_returning_status`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/transactions.rb:259 :in `block in save`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/transactions.rb:270 :in `rollback_active_record_state!`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/transactions.rb:258 :in `save`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/session_store.rb:323 :in `block in set_session`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/benchmarkable.rb:50 :in `silence`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/session_store.rb:320 :in `set_session`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/session/abstract/id.rb:327 :in `commit_session`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/session/abstract/id.rb:211 :in `context`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/session/abstract/id.rb:205 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/cookies.rb:341 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/query_cache.rb:64 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:479 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/callbacks.rb:28 :in `block in call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:405 :in `_run__2585645259320754309__call__1569062307686968059__callbacks`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:405 :in `__run_callback`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:385 :in `_run_call_callbacks`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/callbacks.rb:81 :in `run_callbacks`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/callbacks.rb:27 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/remote_ip.rb:31 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/debug_exceptions.rb:16 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/show_exceptions.rb:56 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-3.2.21/lib/rails/rack/logger.rb:32 :in `call_app`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-3.2.21/lib/rails/rack/logger.rb:16 :in `block in call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/tagged_logging.rb:22 :in `tagged`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-3.2.21/lib/rails/rack/logger.rb:16 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/request_id.rb:22 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/methodoverride.rb:21 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/runtime.rb:17 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.21/lib/active_support/cache/strategy/local_cache.rb:72 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-1.4.5/lib/rack/lock.rb:15 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionpack-3.2.21/lib/action_dispatch/middleware/static.rb:83 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-cache-1.2/lib/rack/cache/context.rb:136 :in `forward`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-cache-1.2/lib/rack/cache/context.rb:245 :in `fetch`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-cache-1.2/lib/rack/cache/context.rb:185 :in `lookup`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-cache-1.2/lib/rack/cache/context.rb:66 :in `call!`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-cache-1.2/lib/rack/cache/context.rb:51 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/rack-timeout-0.1.0/lib/rack/timeout.rb:104 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-3.2.21/lib/rails/engine.rb:484 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-3.2.21/lib/rails/application.rb:231 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/railties-3.2.21/lib/rails/railtie/configurable.rb:30 :in `method_missing`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/newrelic_rpm-3.9.8.273/lib/new_relic/agent/instrumentation/middleware_tracing.rb:57 :in `call`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:576 :in `process_client`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:670 :in `worker_loop`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:525 :in `spawn_missing_workers`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:140 :in `start`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/unicorn-4.8.3/bin/unicorn:126 :in `<top (required)>`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/bin/unicorn:23 :in `load`
[PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/bin/unicorn:23 :in `<main>

Некоторые наблюдения:

• Я попытался войти в систему под этим пользователем, а также угнать сеанс пользователя по идентификатору записи (перемещая поддельный идентификатор сеанса в поля идентификатора sessin и данных сеанса, где присутствует симптом) - я не смог полностью воспроизвести это в dev.

• Это происходит с разными пользователями в разных местах в моем приложении (вероятность равна 1 из нескольких тысяч просмотров).

• Похоже, что это происходит для одного и того же пользователя пару раз подряд (имеет смысл, если они загружают более 1 страницы с одной и той же проблемой сеанса)

• Изучая таблицу сеансов для сеансов, в которых возникает проблема, я вижу, что поле "данные" очень велико для этих записей, например: https://gist.github.com/jasonfb/109af1b7f1595c115c85

Все записи с плохими сеансами содержат очень большой объем данных, в то время как другие мои записи сеансов содержат всего несколько строк данных.

Любые предложения для решения здесь?

1 ответ

Эта проблема была исправлена ​​путем обновления до Rails 4. Я никогда не находил решения в Rails 3.2, но я изолировал проблему глубоко внутри активной записи.

Другие вопросы по тегам