diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 5a62ab8bbc..324f3f434f 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2978,7 +2978,7 @@ ReorderBufferAddSnapshot(ReorderBuffer *rb, TransactionId xid, * If we know that xid is a subtransaction, set the base snapshot on the * top-level transaction instead. */ -void +bool ReorderBufferSetBaseSnapshot(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Snapshot snap) { @@ -2995,6 +2995,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 +3004,8 @@ 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..f9d7bfa3ee 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -750,7 +750,7 @@ SnapBuildProcessChange(SnapBuild *builder, TransactionId xid, XLogRecPtr lsn) * out to. */ SnapBuildSnapIncRefcount(builder->snapshot); - ReorderBufferSetBaseSnapshot(builder->reorder, xid, lsn, + return ReorderBufferSetBaseSnapshot(builder->reorder, xid, lsn, builder->snapshot); } @@ -1071,8 +1071,13 @@ SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid, if (!ReorderBufferXidHasBaseSnapshot(builder->reorder, xid)) { SnapBuildSnapIncRefcount(builder->snapshot); - ReorderBufferSetBaseSnapshot(builder->reorder, xid, lsn, - builder->snapshot); + if (!ReorderBufferSetBaseSnapshot(builder->reorder, xid, lsn, + builder->snapshot)) + ereport(FATAL, + (errmsg("BaseSnapshot cant't be setup at point %X/%X", + (uint32) (lsn >> 32), (uint32) lsn), + errdetail("Top transaction is running."))); + } /* refcount of the snapshot builder for the new snapshot */ 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);