我不确定这是否是 ActiveRecord、PostgreSQL、Flynn 或我的应用程序的问题,但我最近flynn_process_settings
在我的应用程序中的一个名为environments
and 的表中添加了一个新字段 , 出于某种原因,而 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 之后运行的是旧版本的应用程序。