From d7bde54c7a08407513755bed59148e4c03f0df40 Mon Sep 17 00:00:00 2001 From: Hou Zhijie Date: Wed, 4 Dec 2024 15:14:26 +0800 Subject: [PATCH 2/2] Fix memory leak under CacheMemoryContext in pgoutput --- src/backend/replication/pgoutput/pgoutput.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 7a27ee38a0..2d81cd423e 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -222,7 +222,8 @@ static void send_relation_and_attrs(Relation relation, TransactionId xid, static void rel_sync_cache_relation_cb(Datum arg, Oid relid); static void rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue); -static void set_schema_sent_in_streamed_txn(RelationSyncEntry *entry, +static void set_schema_sent_in_streamed_txn(PGOutputData *data, + RelationSyncEntry *entry, TransactionId xid); static bool get_schema_sent_in_streamed_txn(RelationSyncEntry *entry, TransactionId xid); @@ -748,7 +749,7 @@ maybe_send_schema(LogicalDecodingContext *ctx, send_relation_and_attrs(relation, xid, ctx, relentry); if (data->in_streaming) - set_schema_sent_in_streamed_txn(relentry, topxid); + set_schema_sent_in_streamed_txn(data, relentry, topxid); else relentry->schema_sent = true; } @@ -1197,8 +1198,8 @@ init_tuple_slot(PGOutputData *data, Relation relation, TupleDesc indesc = RelationGetDescr(relation); TupleDesc outdesc = RelationGetDescr(ancestor); - /* Map must live as long as the session does. */ - oldctx = MemoryContextSwitchTo(CacheMemoryContext); + /* Map must live as long as the logical decoding context. */ + oldctx = MemoryContextSwitchTo(data->cachectx); entry->attrmap = build_attrmap_by_name_if_req(indesc, outdesc, false); @@ -1991,11 +1992,12 @@ get_schema_sent_in_streamed_txn(RelationSyncEntry *entry, TransactionId xid) * of the relation. */ static void -set_schema_sent_in_streamed_txn(RelationSyncEntry *entry, TransactionId xid) +set_schema_sent_in_streamed_txn(PGOutputData *data, RelationSyncEntry *entry, + TransactionId xid) { MemoryContext oldctx; - oldctx = MemoryContextSwitchTo(CacheMemoryContext); + oldctx = MemoryContextSwitchTo(data->cachectx); entry->streamed_txns = lappend_xid(entry->streamed_txns, xid); -- 2.30.0.windows.2