From 94e1cd63954616f81953950aaf712fa2acf78913 Mon Sep 17 00:00:00 2001 From: Baji Shaik Date: Fri, 5 Jun 2026 18:42:08 -0500 Subject: [PATCH 2/2] Allocate progress message buffer once per parallel worker The static StringInfoData declared in pgstat_progress_parallel_incr_param() was clearly intended to be allocated once per process and reused across calls, but the buggy double-initStringInfo() pattern (fixed in the previous commit) defeated that intent: each call still allocated and freed a fresh buffer via pq_beginmessage() / pq_endmessage(). Restore the original intent by initializing the static buffer only on the first call and switching to pq_beginmessage_reuse() and pq_endmessage_reuse(), which reset and reuse the existing buffer without (re)allocating. Author: Baji Shaik --- src/backend/utils/activity/backend_progress.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/activity/backend_progress.c b/src/backend/utils/activity/backend_progress.c index 6d2049105ab..0483741a80e 100644 --- a/src/backend/utils/activity/backend_progress.c +++ b/src/backend/utils/activity/backend_progress.c @@ -99,11 +99,23 @@ pgstat_progress_parallel_incr_param(int index, int64 incr) if (IsParallelWorker()) { static StringInfoData progress_message; - - pq_beginmessage(&progress_message, PqMsg_Progress); + static bool progress_message_initialized = false; + + /* + * Initialize the message buffer once per process; pq_beginmessage_reuse() + * and pq_endmessage_reuse() reset and reuse it on each call to avoid + * palloc overhead. + */ + if (!progress_message_initialized) + { + initStringInfo(&progress_message); + progress_message_initialized = true; + } + + pq_beginmessage_reuse(&progress_message, PqMsg_Progress); pq_sendint32(&progress_message, index); pq_sendint64(&progress_message, incr); - pq_endmessage(&progress_message); + pq_endmessage_reuse(&progress_message); } else pgstat_progress_incr_param(index, incr); -- 2.50.1 (Apple Git-155)