From: Tatsuo Ishii Date: Wed, 12 Jun 2024 08:13:47 +0000 (+0900) Subject: Eliminate unnecessary memory allocation in extended query protocol. X-Git-Tag: V4_6_0_BETA1~86 X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=a9d1df446893d88fc8476ca2f0a07ebb3efb5739;p=pgpool2.git 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. --- 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; }