From e8d079313a0b5f45e2e382ca77572fc780cad0ba Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 19 Aug 2026 11:32:55 +0900 Subject: [PATCH] Fix relcache reference leak when decoding TRUNCATE ReorderBufferProcessTXN() opens every relation referenced by a TRUNCATE change. When RelationIsLogicallyLogged() returns false, it skips the relation without releasing the reference acquired by RelationIdGetRelation(). Looking at the in-core code paths building XLOG_HEAP_TRUNCATE records, no relation OIDs would be included if they do not satisfy RelationIsLogicallyLogged(). One pattern that could go through is if a table is switched to SET UNLOGGED, but that would not be reachable in practice as the decoding happens after a historical snapshot is taken, so the relation should still be valid. This is a defense-in-depth measure in practice, and we tend to be careful about how Relations are handled when sending changes to output plugins, so backpatch all the way down. Author: Chao Li Reviewed-by: Xuneng Zhou Discussion: https://postgr.es/m/7DD65D03-3B5A-43B2-99AD-8E6AF5372BAB@gmail.com Backpatch-through: 14 --- src/backend/replication/logical/reorderbuffer.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 11a131eab70..cd0e83284ac 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2376,7 +2376,10 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, elog(ERROR, "could not open relation with OID %u", relid); if (!RelationIsLogicallyLogged(rel)) + { + RelationClose(rel); continue; + } relations[nrelations++] = rel; }