connectDBComplete()
会阻塞一直等待一个 Ready 的链接的建立完成,若所有配置的 host 都无法正常链接,则异常退出;若建立好了一个可以使用的链接,那么之前存储的多个 host 的信息会被删除掉。
概览
connectDBComplete()
这个函数维护了两个状态机的变化,一个是函数内部 flag PostgresPollingStatusType
,另一个是 conn->status
。通过这两个状态的变化,完成链接的建立,链接建立 OK 的标准是该 socket 可读可写,已经完成了 Startup 和 用户认证,backend 回复了 ReadyForQuery。接下来就可以直接通过该链接发送查询,接收查询结果了。
下图是一个简略的状态转换图:
内部状态
该 PostgresPollingStatusType
其实是用于 poll()
或者 select()
函数设置 socket 的读写模式的。简单介绍一下各个状态的含义:
PGRES_POLLING_WRITING
socket 已经建好,需要设置可写模式,可写之后就可以发送 Startup 数据包了PGRES_POLLING_READING
socket 已经支持写模式,需要设置可读模式,接收 Startup 的回复包需要读 socketPGRES_POLLING_OK
socket 可读可写,可以进行正常的 traffic 了
conn->status
状态
conn->status
表明了链接的具体状态信息,简要介绍如下:
CONNECTION_OK
链接建立成功,可用于收发信息了CONNECTION_BAD
链接建立过程中失败了,需要销毁该链接,尝试与其他 host 建立链接CONNECTION_STARTED
开始建立链接CONNECTION_MADE
socket 建好了,准备配置可读模式CONNECTION_AWAITING_RESPONSE
发送了 Startup,等待 backend 的回复CONNECTION_AUTH_OK
完成认证CONNECTION_NEEDED
需要connect()
超时的处理
若 conn->connect_timeout
不为空,则设置超时时间,若在该预定时间内无法完成链接的建立,那么就会销毁该链接,然后尝试与其他 host 建立链接。
总结
至此,链接建立部分算是基本解释完毕,如果后续有时间就针对几个具体的函数做更详细的说明。
相关推荐
PostgreSQL 中 libpq 相关代码解析之建立链接 (一)
PostgreSQL 中 libpq 相关代码解析之建立链接 (二)
“PostgreSQL 中 libpq 相关代码解析之建立链接 (三)”的一个响应