目前在带有 MySQL 数据库的 rails 3.2 应用程序中遇到两个非常奇怪的错误。
有一个模型“事物”属于“父事物”。这是一个可选的关联,大多数情况下预计为零。
在视图中有各种块,如下所示:
if thing.parent_thing then
- show part of the view specific to things with parents
(我们也尝试过 if !thing.parent_thing.nil? 和许多其他变体,但似乎都不会影响以下行为)。
在本地开发模式和 Heroku 上的暂存环境中,这完全符合预期。在运行在 4 个 Dyno 上的 Heroku 生产中,它的工作时间约为 70%,但它似乎时不时地切换到调用 thing.parent_thing 将始终返回父级的模式,显然无论是否已设置。
这种行为在看似随机的时间发生,但一旦开始发生,它通常会在整个系统中持续数小时。然后系统最终将恢复到预期的行为。重新启动所有 Heroku dyno 并不能始终解决问题。使用 rails 控制台登录并检查相关的“事物”条目会产生完全正常的行为。
为了尝试理解这种行为,我们在生产中添加了日志记录,每当发生错误情况时,它都会向我们发送 thing.inspect 和 thing.parent_thing.inspect 的结果。这将 thing.parent_thing_id 显示为 nil (这是正确的),但 thing.parent_thing 无论如何都会返回父级。
除了上述之外,在尝试进行进一步调试时,我们还遇到了以下问题:
在视图的顶部,我们创建了一个变量lines_when_parent_thing_exists = [],这是一个我们用字符串填充的数组,这些字符串指示thing.parent_thing返回父对象的行号
随后调用我们的日志记录函数,如下所示:
send_log_event({:message => "Lines where parent is returned",
:data => lines_when_parent_thing_exists.to_s})
unless lines_when_parent_thing_exists.empty?
上面的 send_log_event 调用是不管数组是否为空的,所以我们有数百个日志条目,其中 data 是 []
这会持续发生,而不仅仅是在第一个问题发生时,我将其包括在内,因为我不确定它是否可以提供有关第一个问题的线索。
有人对可能导致上述情况的原因有任何建议吗?