diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 5a62ab8bbc..e3a7c038ca 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2977,8 +2977,9 @@ ReorderBufferAddSnapshot(ReorderBuffer *rb, TransactionId xid, * * If we know that xid is a subtransaction, set the base snapshot on the * top-level transaction instead. + * Returns true if base snapshot is set up. Returns false otherwise. */ -void +bool ReorderBufferSetBaseSnapshot(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Snapshot snap) { @@ -2995,6 +2996,8 @@ ReorderBufferSetBaseSnapshot(ReorderBuffer *rb, TransactionId xid, if (rbtxn_is_known_subxact(txn)) txn = ReorderBufferTXNByXid(rb, txn->toplevel_xid, false, NULL, InvalidXLogRecPtr, false); + if (txn == NULL) + return false; Assert(txn->base_snapshot == NULL); txn->base_snapshot = snap; @@ -3002,6 +3005,7 @@ ReorderBufferSetBaseSnapshot(ReorderBuffer *rb, TransactionId xid, dlist_push_tail(&rb->txns_by_base_snapshot_lsn, &txn->base_snapshot_node); AssertTXNLsnOrder(rb); + return true; } /* diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index e903e561af..d4380fe0f6 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -750,8 +750,9 @@ SnapBuildProcessChange(SnapBuild *builder, TransactionId xid, XLogRecPtr lsn) * out to. */ SnapBuildSnapIncRefcount(builder->snapshot); - ReorderBufferSetBaseSnapshot(builder->reorder, xid, lsn, - builder->snapshot); + if (!ReorderBufferSetBaseSnapshot(builder->reorder, xid, lsn, + builder->snapshot)) + return false; } return true; diff --git a/src/include/replication/reorderbuffer.h b/src/include/replication/reorderbuffer.h index bab31bf7af..926d1dc049 100644 --- a/src/include/replication/reorderbuffer.h +++ b/src/include/replication/reorderbuffer.h @@ -654,7 +654,7 @@ void ReorderBufferAbortOld(ReorderBuffer *, TransactionId xid); void ReorderBufferForget(ReorderBuffer *, TransactionId, XLogRecPtr lsn); void ReorderBufferInvalidate(ReorderBuffer *, TransactionId, XLogRecPtr lsn); -void ReorderBufferSetBaseSnapshot(ReorderBuffer *, TransactionId, XLogRecPtr lsn, struct SnapshotData *snap); +bool ReorderBufferSetBaseSnapshot(ReorderBuffer *, TransactionId, XLogRecPtr lsn, struct SnapshotData *snap); void ReorderBufferAddSnapshot(ReorderBuffer *, TransactionId, XLogRecPtr lsn, struct SnapshotData *snap); void ReorderBufferAddNewCommandId(ReorderBuffer *, TransactionId, XLogRecPtr lsn, CommandId cid);