From: Tatsuo Ishii Date: Tue, 30 Jul 2024 09:17:57 +0000 (+0900) Subject: Fix hang after a flush message received. X-Git-Tag: V4_5_3~9 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=0f0883740b732cc9cfe6d08604233423c226f2ef;p=pgpool2.git Fix hang after a flush message received. Previously pgpool could hang after a flush message arrives. Consider following scenario: (1) backend sends a portal suspend message. (2) pgool write it in the frontend write buffer. But not flush it. (3) The frontend sends a flush message to pgpool. (4) pgpool fowards the flush message to backend. (5) Since there's no pending message in backend, nothing happen. (6) The frontend waits for the portal suspend message from pgpool in vain. To fix this, at (4) pgpool flushes data in the frontend write buffer if some data remains (in this case the portal suspend message). Then the frontend will send next request message to pgpool. Discussion: https://github.com/pgpool/pgpool2/issues/59 Backpatch-through: master, 4.5, 4.4, 4.3, 4.2 and 4.1. --- diff --git a/src/protocol/pool_proto_modules.c b/src/protocol/pool_proto_modules.c index de5ea195f..43beb2725 100644 --- a/src/protocol/pool_proto_modules.c +++ b/src/protocol/pool_proto_modules.c @@ -2925,6 +2925,13 @@ ProcessFrontendResponse(POOL_CONNECTION * frontend, { if (fkind == 'H') { + /* + * If data remains in the frontend write buffer, flush it + * now. + */ + pool_flush(frontend); + elog(DEBUG5, + "pending data flushed to frontend due to a flush message"); pool_set_doing_extended_query_message(); pool_pending_message_set_flush_request(); }