PostgreSQL 中 libpq 相关代码解析之建立链接 (三)

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 的回复包需要读 socket
  • PGRES_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 相关代码解析之建立链接 (二)

PostgreSQL 中 libpq 相关代码解析之建立链接 (三)

PostgreSQL 中 libpq 相关代码解析之流复制(四)

Advertisements

分类:PostgreSQL

Tagged as: ,

4 replies

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.