pgpool2.git / summary / log / commit / refs
commit 6b4216d429c4baef294d7b848eca90d406abc49e
Author: Tatsuo Ishii <ishii@postgresql.org>
Date: Fri Sep 01 23:53:19 2017 +0000
Fix Pgpool-II hanging when error occurs in streaming replication mode and extended query.
If backend returns ERROR, Pgpool-II reads message from frontend until
a sync message is sent. Previous code assumed next message is sync.
However it is possible that more message coming before the sync
message, it's a low probability though. Fix it to continue reading
messages until the sync message is read.
src/protocol/pool_proto_modules.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/protocol/pool_proto_modules.c b/src/protocol/pool_proto_modules.c
index 1af53c3ba..6ab0c9dc1 100644
--- a/src/protocol/pool_proto_modules.c
+++ b/src/protocol/pool_proto_modules.c
@@ -3531,9 +3531,30 @@ static void pool_discard_except_sync_and_ready_for_query(POOL_CONNECTION *fronte
pmsg = pool_pending_message_get(POOL_SYNC);
if (pmsg == NULL)
{
- ProcessFrontendResponse(frontend, backend);
+ char kind;
+ int len;
+ POOL_PENDING_MESSAGE *msg;
+ char *contents;
+
+ for(;;)
+ {
+ pool_read(frontend, &kind, sizeof(kind));
+ pool_read(frontend, &len, sizeof(len));
+ len = ntohl(len) - sizeof(len);
+ if (len > 0)
+ contents = pool_read2(frontend, len);
+ if (kind == 'S')
+ {
+ msg = pool_pending_message_create('S', 0, NULL);
+ pool_pending_message_add(msg);
+ pool_pending_message_free_pending_message(msg);
+ SimpleForwardToBackend(kind, frontend, backend, len, contents);
+ break;
+ }
+ }
}
- pool_pending_message_free_pending_message(pmsg);
+ else
+ pool_pending_message_free_pending_message(pmsg);
/* Remove all pending messages except sync message */
do
[parent: f809426aaa41]