From 7662f434a945f3a05e04f1f82bb0d0de3fde835a Mon Sep 17 00:00:00 2001 From: Hou Zhijie Date: Fri, 25 Nov 2022 14:03:53 +0800 Subject: [PATCH] Avoid distributing new catalogsnapshot for the transaction being decoded Currently, when decoding the COMMIT of a transaction containing catalog changes, we add a new snapshot to all transactions including the one being decoded. But since we've already built a new snapshot for the current transaction, there's no need to add a new one. So skip adding a snapshot of the current transaction being decoded to improve this. --- src/backend/replication/logical/snapbuild.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index a1fd1d9..1d02665 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -288,7 +288,8 @@ static void SnapBuildFreeSnapshot(Snapshot snap); static void SnapBuildSnapIncRefcount(Snapshot snap); -static void SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn); +static void SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn, + TransactionId xid); static inline bool SnapBuildXidHasCatalogChanges(SnapBuild *builder, TransactionId xid, uint32 xinfo); @@ -853,7 +854,8 @@ SnapBuildProcessNewCid(SnapBuild *builder, TransactionId xid, * contents). */ static void -SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn) +SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn, + TransactionId xid) { dlist_iter txn_i; ReorderBufferTXN *txn; @@ -870,6 +872,14 @@ SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn) Assert(TransactionIdIsValid(txn->xid)); /* + * We've already done required modifications in snapshot for the + * transaction that just committed, so there's no need to add a new + * snapshot for the transaction again. + */ + if (xid == txn->xid) + continue; + + /* * If we don't have a base snapshot yet, there are no changes in this * transaction which in turn implies we don't yet need a snapshot at * all. We'll add a snapshot when the first change gets queued. @@ -1171,7 +1181,7 @@ SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid, SnapBuildSnapIncRefcount(builder->snapshot); /* add a new catalog snapshot to all currently running transactions */ - SnapBuildDistributeNewCatalogSnapshot(builder, lsn); + SnapBuildDistributeNewCatalogSnapshot(builder, lsn, xid); } } -- 2.7.2.windows.1