1

我不确定这是否是 ActiveRecord、PostgreSQL、Flynn 或我的应用程序的问题,但我最近flynn_process_settings在我的应用程序中的一个名为environmentsand 的表中添加了一个新字段 , 出于某种原因,而 Environments#update 请求返回 200状态,更新环境的内容包括 的新值flynn_process_settings,发送到数据库的 UPDATE SQL 语句不包括flynn_process_settings

我觉得我已经排除了所有常见的嫌疑人,比如“数据库是否被迁移”等,因为我可以在生产中打开一个 Rails 控制台并更新它,所以看起来大多数东西都设置为故意的。

这是真正奇怪的部分。如果我只是一遍又一遍地发送相同的更新请求,它大约在 20-30 次中起作用。我在请求之间等待一分钟还是两秒似乎并不重要。成功的机会总是大约 5%。

对于上下文:我正在使用 Postgres 在 Flynn 容器环境中运行此应用程序。我最近将更新部署到生产中,在暂存时遇到了同样的问题,我可以通过多次推送给 Flynn 来解决这个问题。所以这可能是某种弗林问题,但我无法想象是什么导致了这种问题......?

在最新版本中运行了 2 个 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 似乎让一个旧的应用程序进程以某种方式运行(应用程序 141),就是有问题的那个(这并不奇怪,尽管我仍然对它如何返回 200 状态感到困惑)。所以现在我的主要问题是为什么在将新版本的应用程序部署到 Flynn 之后运行的是旧版本的应用程序。

4

1 回答 1

0

这可能无法完全回答这个问题,但事实证明,有一个正在运行的流浪乘客进程导致了错误结果。每个工作结果都来自更新的乘客流程。所以我们的主要理论是旧进程在迁移运行之前启动,并且不知何故继续运行而没有异常,但由于某种原因仍然没有更新数据库,即使在迁移运行之后也是如此。

我们使用的是“使用内置引擎运行时导致内存损坏问题的重构错误”的 Passenger 5.1.5 - 所以可能与此有关,尽管我不知道这种可能性有多大。

在任何情况下,主要问题是有一个流氓乘客进程导致错误行为,杀死该进程解决了问题。至于为什么/如何开始这个过程以及为什么它没有引发异常,我还不能说,所以如果有人有更完整的解释,我会留下进一步的答案。

于 2017-08-22T20:23:47.487 回答