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]