Re: Feature: implement NegotiateProtocolVersion message

From: Tatsuo Ishii <ishii(at)postgresql(dot)org>
To: pgpool-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Feature: implement NegotiateProtocolVersion message
Date: 2025-07-09 07:00:04
Message-ID: 20250709.160004.803224268243106375.ishii@postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgpool-hackers

> NegotiateProtocolVersion message is a message sent from backend to
> frontend. After a startup message is sent from frontend to backend,
> and the minor protocol version in the startup message is not supported
> by the backend, the backend sends back a NegotiateProtocolVersion
> message along with the latest minor protocol version it supports.
>
> For example, PostgreSQL 18 client could request a protocol version 3.2
> against PostgreSQL 17 server, then the PG17 server sends back the
> NegotiateProtocolVersion message with protocol version 3.0 since it
> does not support 3.2. If the PG18 client accepts it, then from now on
> the protocol version 3.0 is used for the communication.
>
> At this point, as PG18's psql (or libpq) uses protocol version 3.0 by
> default, PG18 (or before) server will not send back the
> NegotiateProtocolVersion message because the versions support 3.0.
>
> The only case when 3.2 is used, is PG18's psql (or libpq) uses a
> connection option max_protocol_version (or environment variable
> PGMAXPROTOCOLVERSION) being set to "3.2". I don't know if the case
> happen in the wild after PG18 is released, but I would like to prepare
> for the situation by implementing NegotiateProtocolVersion message in
> Pgpool-II 4.7. Attached patch does followings for the purpose.
>
> - Add ProcessNegotiateProtocol() to pool_do_auth() to process the
> message while handling a startup message. It reads the message from
> all backend, then forward it to frontend. The message is saved in
> ConnectionInfo for the case below. It also save the major and minor
> protocol version after negotiation to POOL_CONNECTION_POOL_SLOT for
> later use. The version numbers are also saved to ConnectionInfo so
> that pcp_proc_info shows them.
>
> - When a client connects to pgpool, it looks for cached connections in
> the connection: pgpool tries to match the startup message with the
> one in the connection pool. Since the startup message in the
> connection pool is saved at the time when the client connects to
> pgpool, it is possible that two connection cache are created with
> same user and database. Suppose there's a connection cache with a
> startup message having protocol version 3.0, and a new client tries
> to connect to pgpool using protocol version 3.2. Pgpool looks for a
> connection cache with the startup message having protocol version
> 3.2, not 3.0. As a result a new connection cache entry is created
> with protocol version 3.2.
>
> - When a client uses the connection pool, the saved
> NegotiateProtocolVersion message is sent to frontend to emulate the
> protocol negotiation.
>
> - The frontend/backend protocol 3.2 changes the BackendKeyData message
> format but it's not implemented in this patch yet. I will work on it
> later on.

Attached is the v2 patch fixing bug in v1. Also some protocol related
macros are imported from PostgreSQL.

Best regards,
--
Tatsuo Ishii
SRA OSS K.K.
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp

Attachment Content-Type Size
v2-0001-Feature-implement-NegotiateProtocolVersion-messag.patch application/octet-stream 10.9 KB

In response to

Responses

Browse pgpool-hackers by date

  From Date Subject
Next Message Tatsuo Ishii 2025-07-10 10:38:13 Re: Feature: implement NegotiateProtocolVersion message
Previous Message Koshino Taiki 2025-07-09 01:18:14 Re: Patch for fixing doc about some parameters.