奇怪的ActiveRecord问题 - 比如生成无效的SQL

bko*_*cik 9 ruby ruby-on-rails rails-activerecord

最近我们部署了一个新版本的应用程序,从那时起我们就一直看到ActiveRecord的一些非常奇怪的问题.例如,这是一个每天生成数百次的查询片段,通常是正确的:

`entries`.`style` AS t1_r25, `entries`.`pdf_visibility` AS       , `entries`.`web_visibility` AS t1_r27
Run Code Online (Sandbox Code Playgroud)

这不是一个错字,t1_r26在那里缺失,虽然它应该是一个空间.但只有那一次.这也不是手工编写的SQL,即ActiveRecord编写查询并决定所有占位符变量.它有类似的拙劣的其他查询留下空白,不应该是空白(甚至不可能),但只是偶尔一次.大部分时间都很好.

我们也看到很多实例抱怨像table_alias或者反射是一个未定义的变量或者假的方法:FalseClass.这是真的......但是FalseClass应该是一个ActiveRecord模型.我们不知道这是怎么发生的,或者我们怎么可能在我们的Rails代码中编写一个错误来完成大部分工作(特别是上面的无效查询).

我们在Rails 4.1.16(我们从4.1.8时开始升级时)升级到乘客5.0.26中的Ruby 2.2.0(接下来是5.0.30).这些错误非常零星,没有任何意义.在每天数千个请求中,只有少数几个请求(5个服务器中少于10个)导致其中一个奇怪的错误,我们不能故意重现它们中的任何一个.

我的整个团队都很难过.我们花了几个小时仔细研究代码更改,看不到任何可能导致任何此类更改的内容.我们甚至不知道我们可能编写的内容会导致ActiveRecord有时以我们不应该影响的方式编写错误的查询.我们不知道如何开始对这种事情进行故障排除.有人在那里有一个提示可能会指出我们有一些有用的方向吗?

更新:这是今天早上扔的一个新的.请注意,LibraryItem是我们非常简单的ActiveRecord模型之一:

NoMethodError: undefined method `__callbacks' for #<LibraryItem:0x007f66cc5b82b0>
Run Code Online (Sandbox Code Playgroud)

我不知道.

bko*_*cik 0

为了为那些试图提供帮助的人和任何陷入这个问题的人关闭循环:我们通过升级 MRI 来治愈它。我们已经在 2.2.0 上运行了大约一年,这就是为什么我们没有立即怀疑它,也是因为这是从一个特定的部署开始的。当我们看到一些关于无法分配内存的错误时,当 MRI 在一台服务器上爆炸成一片弹片(我的意思是它发生了段错误)并导致 Passenger 崩溃时,我得到了消息。

从那时起,我开始查看 MRI 变更日志,并注意到2.2.0 和 2.2.5 之间修复了大量内存和 GC 相关的错误。昨晚我们通过部署升级到 2.2.5,并且(祈祷)我们还没有看到这些奇怪的问题之一。(之前我们每天看到 12-20 个或更多,具体取决于流量)。

那么,为什么在我们部署后就开始发生这种情况呢?我不确定,但我有一个猜测:我认为我们的应用程序在内存中的大小(以字节为单位)最终达到了某个临界值,在该临界值时它开始触发一个或多个在 2.2 之间修复的 MRI bug。 0 和 2.2.5。我能想到的最好的。

非常感谢那些介入并提供帮助的人!