From f506b5bc16802434db1999c3d06a4ec95a3c6f18 Mon Sep 17 00:00:00 2001 From: "Chao Li (Evan)" Date: Sat, 9 May 2026 14:00:02 +0800 Subject: [PATCH v2] Use simple struct for table sync COPY buffer state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit copy_read_data() only needs to track the COPY buffer's data pointer, length, and cursor position. Replace the StringInfo with a small local struct containing just those fields. Author: Chao Li Reviewed-by: Álvaro Herrera Discussion: https://postgr.es/m/5B2C9B4C-EAE6-4F21-AF99-613A561D26DC@gmail.com --- src/backend/replication/logical/tablesync.c | 29 +++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index eb718114297..e2fc37ae2c9 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -126,7 +126,14 @@ List *table_states_not_ready = NIL; -static StringInfo copybuf = NULL; +typedef struct CopyBuf +{ + char *data; + int len; + int cursor; +} CopyBuf; + +static CopyBuf copybuf; /* * Wait until the relation sync state is set in the catalog to the expected @@ -649,13 +656,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 +687,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 +1206,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)