pgpool2.git / summary / log / commit / refs

commit    13ed37d69fcb990597c070c55cb2f8f17100ca2a
Author:   Tatsuo Ishii <ishii@postgresql.org>
Date:     Thu Aug 03 08:03:12 2017 +0000

    Fix memory leak with streaming replication mode/extended query case.
    
    When Close Complete message arrives, Pgpool-II did not remove sent
    message because at this point the pending message, which includes info
    to remove the sent message, has been already removed by
    read_kind_from_backend(). To fix the problem read_kind_from_backend()
    does not remove the pending message for Close Complete and let
    CloseComplete() to extract and remove the pending message to remove
    the sent message data.
    
    Per bug#324.


src/protocol/pool_process_query.c | 17 +++++++++++++---- src/protocol/pool_proto_modules.c | 20 +++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/protocol/pool_process_query.c b/src/protocol/pool_process_query.c index 92c19ef7d..5eec4a548 100644 --- a/src/protocol/pool_process_query.c +++ b/src/protocol/pool_process_query.c @@ -3628,11 +3628,20 @@ void read_kind_from_backend(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *bac } else { - POOL_PENDING_MESSAGE *pending_message; + POOL_PENDING_MESSAGE *pending_message = NULL; - ereport(DEBUG1, - (errmsg("read_kind_from_backend: pending message was pulled out"))); - pending_message = pool_pending_message_pull_out(); + if (msg->type == POOL_CLOSE) + { + /* Pending message will be pulled out in CloseComplete() */ + ereport(DEBUG1, + (errmsg("read_kind_from_backend: pending message was not pulled out because message type is CloseComplete"))); + } + else + { + ereport(DEBUG1, + (errmsg("read_kind_from_backend: pending message was pulled out"))); + pending_message = pool_pending_message_pull_out(); + } if (pending_message) pool_pending_message_free_pending_message(pending_message); diff --git a/src/protocol/pool_proto_modules.c b/src/protocol/pool_proto_modules.c index a07e1823f..c3fd893d6 100644 --- a/src/protocol/pool_proto_modules.c +++ b/src/protocol/pool_proto_modules.c @@ -2091,12 +2091,22 @@ POOL_STATUS CloseComplete(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backe { POOL_PENDING_MESSAGE *pmsg; - pmsg = pool_pending_message_get(POOL_CLOSE); + pmsg = pool_pending_message_pull_out(); if (pmsg) { - kind = pool_get_close_message_spec(pmsg); - name = pool_get_close_message_name(pmsg); + /* Sanity check */ + if (pmsg->type != POOL_CLOSE) + { + ereport(LOG, + (errmsg("loseComplete: pending messge was not CloseComplete"))); + } + else + { + kind = pool_get_close_message_spec(pmsg); + name = pool_get_close_message_name(pmsg); + kind = kind=='S'?'P':'B'; + } pool_pending_message_free_pending_message(pmsg); } } @@ -2115,11 +2125,11 @@ POOL_STATUS CloseComplete(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backe } } - if (kind == ' ') + if (kind != ' ') { pool_remove_sent_message(kind, name); ereport(DEBUG1, - (errmsg("CloseComplete: remove uncompleted message. kind:%c, name:%s", + (errmsg("CloseComplete: remove sent message. kind:%c, name:%s", kind, name))); } [parent: ff2c41cbd1d6]