diff options
author | Tatsuo Ishii | 2024-06-12 08:13:47 +0000 |
---|---|---|
committer | Tatsuo Ishii | 2024-06-12 08:13:47 +0000 |
commit | a9d1df446893d88fc8476ca2f0a07ebb3efb5739 (patch) | |
tree | eb0b537f1c6085bcb65ed337ae18cca9d606298d /src | |
parent | 8c307f4bfafc1c92806bfebf75cd628d8952e7a3 (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.c | 6 | ||||
-rw-r--r-- | src/protocol/pool_proto_modules.c | 15 |
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; } |