From cffb27e65afaf3b7b0202f4e14518a424cf52ae3 Mon Sep 17 00:00:00 2001 From: "Chao Li (Evan)" Date: Sat, 9 May 2026 14:00:02 +0800 Subject: [PATCH v1] Avoid unnecessary StringInfo allocation in tablesync COPY buffer copybuf is only used to track the data pointer, length, and cursor for leftover COPY data. The buffer allocated by makeStringInfo() is not used, because copybuf->data is later replaced by the buffer returned from walrcv_receive(). Use a static StringInfoData instead and reset it before starting COPY. Author: Chao Li --- src/backend/replication/logical/tablesync.c | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index eb718114297..1dee2480e2f 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -126,7 +126,7 @@ List *table_states_not_ready = NIL; -static StringInfo copybuf = NULL; +static StringInfoData copybuf = {0}; /* * Wait until the relation sync state is set in the catalog to the expected @@ -649,13 +649,13 @@ copy_read_data(void *outbuf, int minread, int maxread) int avail; /* If there are some leftover data from previous read, use it. */ - avail = copybuf->len - copybuf->cursor; + avail = copybuf.len - copybuf.cursor; if (avail) { if (avail > maxread) avail = maxread; - memcpy(outbuf, ©buf->data[copybuf->cursor], avail); - copybuf->cursor += avail; + memcpy(outbuf, ©buf.data[copybuf.cursor], avail); + copybuf.cursor += avail; maxread -= avail; bytesread += avail; } @@ -680,16 +680,16 @@ copy_read_data(void *outbuf, int minread, int maxread) else { /* Process the data */ - copybuf->data = buf; - copybuf->len = len; - copybuf->cursor = 0; + copybuf.data = buf; + copybuf.len = len; + copybuf.cursor = 0; - avail = copybuf->len - copybuf->cursor; + avail = copybuf.len - copybuf.cursor; if (avail > maxread) avail = maxread; - memcpy(outbuf, ©buf->data[copybuf->cursor], avail); + memcpy(outbuf, ©buf.data[copybuf.cursor], avail); outbuf = (char *) outbuf + avail; - copybuf->cursor += avail; + copybuf.cursor += avail; maxread -= avail; bytesread += avail; } @@ -1199,7 +1199,7 @@ copy_table(Relation rel) lrel.nspname, lrel.relname, res->err))); walrcv_clear_result(res); - copybuf = makeStringInfo(); + memset(©buf, 0, sizeof(copybuf)); pstate = make_parsestate(NULL); (void) addRangeTableEntryForRelation(pstate, rel, AccessShareLock, -- 2.50.1 (Apple Git-155)