分叉时续集会丢失与SSL错误的连接,为什么?

时间:2016-07-31 01:59:19

标签: ruby postgresql nginx database-connection sequel

我一直在查看Hanami并发现我的续集连接因以下错误而死亡:

Sequel::DatabaseDisconnectError: PG::ConnectionBad: PQconsumeInput() SSL error: decryption failed or bad record mac: SELECT NULL

无论服务器(瘦,彪马,webrick)还是环境。经过一些实验,结果发现gem 'shotgun'中的罪魁祸首是Gemfile(hanami没有重新加载代码)。从霰弹枪文档:

  

每次收到请求时,它都会分叉,加载应用程序   子进程,处理请求,退出子进程。

在nginx的生产中使用时,分叉续集会因为同样的原因而丢弃连接。

这可以通过以下代码得到改善,但这意味着每个请求都必须重新连接:

SequelDB.extension :connection_validator
SequelDB.pool.connection_validation_timeout = -1

所以似乎Sefor的分叉后连接池已经损坏。

为什么续集会这样做?

1 个答案:

答案 0 :(得分:1)

当进程分叉时,进程的每个副本共享用于与postgres通信的文件描述符。这不是续集特定的甚至Postgres特定的,虽然有些库检测到分叉并为你重新连接数据库(请参阅续集问题跟踪器上的这个discussion - 简短的版本是它不会发生续集)