summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuo Ishii2024-06-12 08:13:47 +0000
committerTatsuo Ishii2024-06-12 08:13:47 +0000
commita9d1df446893d88fc8476ca2f0a07ebb3efb5739 (patch)
treeeb0b537f1c6085bcb65ed337ae18cca9d606298d /src
parent8c307f4bfafc1c92806bfebf75cd628d8952e7a3 (diff)
Eliminate unnecessary memory allocation in extended query protocol.
When pending messages are created, Pgpool-II did like: (1) pmsg = pool_pending_message_create(); /* create a pending message */ (2) pool_pending_message_dest_set(pmsg, query_context) /* set PostgreSQL node ids to be sent */ (3) pool_pending_message_query_set(pmsg, query_context); /* add query context */ (4) pool_pending_message_add(pmsg); /* add the pending message to the list */ (5) pool_pending_message_free_pending_message(pmsg); /* free memory allocated by pool_pending_message_create(); The reason why pool_pending_message_free_pending_message(pmsg) is called here is, pool_pending_message_add() creates a copy of the pending message then add it to the list. This commit modifies pool_pending_message_add() so that it does not create a copy of the object and adds it to the pending messages list. This way, we can eliminate (5) as well and it should reduce memory footprint and CPU cycle.
Diffstat (limited to 'src')
-rw-r--r--src/context/pool_session_context.c6
-rw-r--r--src/protocol/pool_proto_modules.c15
2 files changed, 2 insertions, 19 deletions
diff --git a/src/context/pool_session_context.c b/src/context/pool_session_context.c
index 708277191..f25d501df 100644
--- a/src/context/pool_session_context.c
+++ b/src/context/pool_session_context.c
@@ -1255,12 +1255,11 @@ pool_pending_message_query_set(POOL_PENDING_MESSAGE * message, POOL_QUERY_CONTEX
}
/*
- * Add one message to the tail of the list
+ * Add one message to the tail of the list.
*/
void
pool_pending_message_add(POOL_PENDING_MESSAGE * message)
{
- POOL_PENDING_MESSAGE *msg;
MemoryContext old_context;
if (!session_context)
@@ -1312,8 +1311,7 @@ pool_pending_message_add(POOL_PENDING_MESSAGE * message)
(errmsg("pool_pending_message_add: message type: sync")));
old_context = MemoryContextSwitchTo(session_context->memory_context);
- msg = copy_pending_message(message);
- session_context->pending_messages = lappend(session_context->pending_messages, msg);
+ session_context->pending_messages = lappend(session_context->pending_messages, message);
MemoryContextSwitchTo(old_context);
}
diff --git a/src/protocol/pool_proto_modules.c b/src/protocol/pool_proto_modules.c
index de5ea195f..7cba9776a 100644
--- a/src/protocol/pool_proto_modules.c
+++ b/src/protocol/pool_proto_modules.c
@@ -1178,7 +1178,6 @@ Execute(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend,
pool_pending_message_dest_set(pmsg, query_context);
pool_pending_message_query_set(pmsg, query_context);
pool_pending_message_add(pmsg);
- pool_pending_message_free_pending_message(pmsg);
/* Various take care at the transaction start */
handle_query_context(backend);
@@ -1580,9 +1579,6 @@ Parse(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend,
* deadlock
*/
pool_set_query_in_progress();
-#ifdef NOT_USED
- pool_clear_sync_map();
-#endif
pool_extended_send_and_wait(query_context, "P", len, contents, 1, MAIN_NODE_ID, true);
pool_extended_send_and_wait(query_context, "P", len, contents, -1, MAIN_NODE_ID, true);
pool_add_sent_message(session_context->uncompleted_message);
@@ -1591,7 +1587,6 @@ Parse(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend,
pmsg = pool_pending_message_create('P', len, contents);
pool_pending_message_dest_set(pmsg, query_context);
pool_pending_message_add(pmsg);
- pool_pending_message_free_pending_message(pmsg);
pool_unset_query_in_progress();
}
@@ -1759,7 +1754,6 @@ Bind(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend,
pool_pending_message_dest_set(pmsg, query_context);
pool_pending_message_query_set(pmsg, query_context);
pool_pending_message_add(pmsg);
- pool_pending_message_free_pending_message(pmsg);
}
if (rewrite_msg)
@@ -1852,7 +1846,6 @@ Describe(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend,
pool_pending_message_dest_set(pmsg, query_context);
pool_pending_message_query_set(pmsg, query_context);
pool_pending_message_add(pmsg);
- pool_pending_message_free_pending_message(pmsg);
pool_unset_query_in_progress();
}
@@ -1971,7 +1964,6 @@ Close(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend,
pool_pending_message_dest_set(pmsg, query_context);
pool_pending_message_query_set(pmsg, query_context);
pool_pending_message_add(pmsg);
- pool_pending_message_free_pending_message(pmsg);
if (session_context->load_balance_node_id != PRIMARY_NODE_ID)
{
@@ -1979,9 +1971,6 @@ Close(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend,
memcpy(query_context->where_to_send, where_to_send_save, sizeof(where_to_send_save));
}
-#ifdef NOT_USED
- dump_pending_message();
-#endif
pool_unset_query_in_progress();
/*
@@ -2865,7 +2854,6 @@ ProcessFrontendResponse(POOL_CONNECTION * frontend,
pool_unset_query_in_progress();
msg = pool_pending_message_create('S', 0, NULL);
pool_pending_message_add(msg);
- pool_pending_message_free_pending_message(msg);
}
else if (!pool_is_query_in_progress())
pool_set_query_in_progress();
@@ -3787,7 +3775,6 @@ static POOL_STATUS parse_before_bind(POOL_CONNECTION * frontend,
pmsg->not_forward_to_frontend = true;
pool_pending_message_dest_set(pmsg, new_qc);
pool_pending_message_add(pmsg);
- pool_pending_message_free_pending_message(pmsg);
}
/* Send parse message to primary node */
@@ -3802,7 +3789,6 @@ static POOL_STATUS parse_before_bind(POOL_CONNECTION * frontend,
pmsg->not_forward_to_frontend = true;
pool_pending_message_dest_set(pmsg, new_qc);
pool_pending_message_add(pmsg);
- pool_pending_message_free_pending_message(pmsg);
/* Replace the query context of bind message */
bind_message->query_context = new_qc;
@@ -4266,7 +4252,6 @@ pool_discard_except_sync_and_ready_for_query(POOL_CONNECTION * frontend,
{
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;
}