什么原因导致"ArgumentError (dump format error)"?



在对Spree中的一个不当行为进行故障排除时,产品列表没有分页,只列出了前10个左右的产品,我试图在本地开发环境中重现错误,在加载第一页时,我收到了错误:

ArgumentError (dump format error)

和往常一样,我先检查了我的另一个大脑。排名第一的搜索结果是:https://github.com/rails/rails/issues/2509

尽管启动该线程的用户和其他几张海报正在尝试从Rails 3.0.9升级到Rails 3.1,但我认为这不适用于我的情况。我正在运行的Spree 0.60.2应用程序是Rails 3.0.9。

然而,事实证明,简单地清除本地主机cookie就解决了问题。为什么?

我推测,因为我在开发环境中运行多个应用程序,包括同一应用程序的Rails3.1/Spree 0.70版本,并且我通过localhost访问了所有这些应用程序,所以cookie中存在某种冲突,3.1版本设置了一些3.0.9版本无法食用的cookie。这可能与@Fjan在他的帖子中提到的有关(https://github.com/rails/rails/issues/2509):

我跟踪了这个错误,它的发生是因为会话已更改为不再从中的哈希类继承轨道3.1。

我做了一个实验。如果我在两个版本的应用程序上都登录了而不是,我就可以启动一个,关闭它,然后启动另一个,而不会在任何一个版本上遇到这个问题。然而,当我登录3.0.9版本,然后关闭服务器并启动3.1版本时,我再次收到同样的错误。这是一个部分跟踪:

activesupport(3.1.1)lib/active_support/message_verifier.rb:34:inload' activesupport (3.1.1) lib/active_support/message_verifier.rb:34:in验证操作包(3.1.1)lib/action_dispatch/middleware/cookies.rb:280:在中的[]' actionpack (3.1.1) lib/action_dispatch/middleware/session/cookie_store.rb:53:in块中unpacked_cokie_data'操作包(3.1.1)lib/action_dispatch/middleware/session/abstract_store.rb:55:instale_session_check!' actionpack (3.1.1) lib/action_dispatch/middleware/session/cookie_store.rb:51:in unpacked_cookie_data'rack(1.3.6)lib/rrack/session/cookie.rb:96:inextract_session_id' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:51:in块在extract_session_id'actionpack(3.1.1)中lib/action_dispatch/middleware/session/abstract_store.rb:55:instale_session_check!' actionpack (3.1.1) lib/action_dispatch/middleware/session/abstract_store.rb:51:in extract_session_id'机架(1.3.6)lib/rack/session/abstract/id.rb:43:in load_session_id!' rack (1.3.6) lib/rack/session/abstract/id.rb:32:in[]’rack(1.3.6)lib/rack/session/abstract/id.rb:252:在current_session_id' rack (1.3.6) lib/rack/session/abstract/id.rb:258:in会话中是否存在?'支架(1.3.6)lib/rack/session/abstract/id.rb:104:in exists?' rack (1.3.6) lib/rack/session/abstract/id.rb:114:in load_for_read!'机架(1.3.6)lib/rack/session/abstract/id.rb:64:在has_key?' actionpack (3.1.1) lib/action_dispatch/middleware/flash.rb:260:in中确保调用'actionpack(3.1.1)lib/action_dispatch/middleware/flash.rb:261:incall' rack (1.3.6) lib/rack/session/abstract/id.rb:195:in上下文'rack(1.3.6)lib/rack/session/abstract/id.rb:190:在"调用"中

反之亦然当我登录3.1版本,然后关闭服务器并启动3.0.9版本时,我收到了同样的错误。这是一个部分跟踪:

activesupport(3.0.9)lib/active_support/message_verifier.rb:34:inload' activesupport (3.0.9) lib/active_support/message_verifier.rb:34:in验证操作包(3.0.9)lib/action_dispatch/middleware/cookies.rb:253:在中的[]' actionpack (3.0.9) lib/action_dispatch/middleware/session/cookie_store.rb:68:in块中unpacked_cokie_data'操作包(3.0.9)lib/action_dispatch/medleware/session/abstract_store.rb:223:instale_session_check!' actionpack (3.0.9) lib/action_dispatch/middleware/session/cookie_store.rb:66:in unpacked_cookie_data'操作包(3.0.9)lib/action_dispatch/medleware/session/cookie_store.rb:57:inextract_session_id' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:39:in 加载会话_id!'actionpack(3.0.9)lib/action_dispatch/middleware/session/abstract_store.rb:27:in []' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:210:in current_session_id'actionpack(3.0.9)lib/action_dispatch/medleware/session/abstract_store.rb:239:inexists?' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:96:in 是否存在?'actionpack(3.0.9)lib/action_dispatch/middleware/session/abstract_store.rb:113:inload_for_read!' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:53:in[]actionpack(3.0.9)lib/action_dispatch/middleware/flash.rb:178:incall' actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:149:in调用

对我来说值得注意的是,你实际上不必处于升级过程中。为了重现这个问题,你只需要运行两个横跨这两个版本的Rails的应用程序,它们正在设置具有相同名称的cookie。。。大概是按顺序(如在我的实验中)或同时(我没有尝试过)。

希望这里的其他人能提供一个比这更明智的答案,补充这个松散解释所缺乏的细节。与此同时,如果你在开发中遇到这个问题,并且你不关心内部工作,只需清除你的cookie(正如@tscolari在上面引用的线程中所建议的:https://github.com/rails/rails/issues/2509)继续前进。干杯

如果您正在生产,并且无法要求用户清除cookie:)-唯一的方法是在config/initializers/session_store.rb中更改session_store密钥

这个解决方案并不好,用户将不得不重新登录。

我也遇到了同样的问题。清除浏览器cookie解决了问题。发展模式。

清除您的cookie将解决此问题,请尝试使用不同的浏览器打开您的应用程序或在chrome上隐身,这样会很好。

我刚转到轨道3.2,就在生产中遇到了同样的问题。

在我的情况下,按照@povkys的建议更改session_store密钥有点过头了,因为只有一些用户(不到1%)的会话出现了问题。

我最终运行了一个脚本来解析数据库中的所有会话,并删除那些无效的会话。以下是代码,以防对某人有所帮助:

current_id = 0
failed_count = 0
while (sessions = ActiveRecord::Base.connection.select_all("Select id, data from sessions where id > #{current_id} limit 1000")).count > 0 do
  failed_ids = []
  sessions.each do |s|
    begin
      ActiveRecord::SessionStore::Session.unmarshal(s['data'])
    rescue
      failed_count += 1
      failed_ids.push s['id']
    end
  end
  ActiveRecord::Base.connection.execute("DELETE FROM sessions WHERE id in (#{failed_ids.join ','})") unless failed_ids.empty?
  current_id = sessions.last['id']
end
failed_count

最新更新