我不确定这是否是ActiveRecord、PostgreSQL、Flynn或我的应用程序的问题,但我最近在我的应用程序中添加了一个名为environments的新字段flynn_process_settings,由于某种原因,当Environments#update请求返回200状态时,更新环境的内容包括flynn_process_settings的新值,发送到数据库的UPDATE SQL语句不包括flynn_process_settings。
我觉得我已经排除了所有常见的嫌疑,比如“数据库被迁移了”等等,因为我可以在生产中打开一个rails控制台并对其进行很好的更新,所以看起来大多数事情都是按预期设置的。
这才是真正奇怪的地方。如果我一次又一次地发送相同的更新请求,它的工作时间大约是20-30次。无论我是在请求之间等待一分钟还是2秒,似乎都不重要。成功的几率总是在5%左右。
对于上下文:我运行这个应用程序在一个Flynn容器环境,与Postgres。我最近将更新部署到生产中,因为我在准备过程中遇到了同样的问题,我可以通过多次推到Flynn来修复这个问题。所以这可能是弗林的问题,但我无法想象是什么引起了这样的问题.?
在最新版本中有两个rails进程实例正在运行。失败/成功似乎并不对应于任何一个特定的实例(它似乎被配置为使我的客户端绑定到特定的实例)。
更新:--看起来参数哈希在它实际工作的请求上包含了自动包装的参数"environment" => { "flynn_process_settings" => "..." },所以这可能是参数解析/包装的问题!虽然我不知道为什么需要这个嵌套参数,因为访问参数的代码如下所示:
def update
if environment.update(environment_params)
render ...
else
render ...
end
end
def environment_params
setup_step_keys = [An Array]
params.permit(setup_step_keys + [:flynn_process_settings]) #This should be at the root of params, right?
end更新2: --看起来Flynn以某种方式运行了一个旧的应用程序进程(App141),而这个进程存在问题(这并不令人惊讶,尽管我仍然对它如何返回200状态感到困惑)。所以现在我的主要问题是为什么在将新版本的应用程序部署到Flynn之后会有一个旧版本的应用程序在运行。
发布于 2017-08-22 20:23:47
这可能没有完全回答这个问题,但结果发现,有一个偏离乘客的过程,是导致错误的结果。每一个工作结果都来自一个较新的乘客过程。因此,我们的主要理论是,旧进程是在迁移运行之前启动的,并且在某种程度上没有异常地继续运行,但是由于某些原因,即使在迁移运行之后,仍然没有更新数据库。
我们使用的是乘客5.1.5,它具有“重构错误,在使用内置引擎运行时会导致内存损坏问题”--所以可能与此相关,尽管我不知道这有多大的可能性。
在任何情况下,主要的问题是,有一个流氓乘客过程导致错误行为,并杀死该过程解决了问题。至于为什么/如何开始这个过程,以及为什么它没有引起异常,我还不能说,所以我将留待进一步的答案,以防任何人有一个更完整的解释。
https://stackoverflow.com/questions/45822310
复制相似问题