aboutsummaryrefslogtreecommitdiff
path: root/src/include/replication/reorderbuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/replication/reorderbuffer.h')
-rw-r--r--src/include/replication/reorderbuffer.h22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/include/replication/reorderbuffer.h b/src/include/replication/reorderbuffer.h
index 13a4a5d5b22..dd49af9dff2 100644
--- a/src/include/replication/reorderbuffer.h
+++ b/src/include/replication/reorderbuffer.h
@@ -141,10 +141,9 @@ typedef struct ReorderBufferTXN
/* did the TX have catalog changes */
bool has_catalog_changes;
- /*
- * Do we know this is a subxact?
- */
+ /* Do we know this is a subxact? Xid of top-level txn if so */
bool is_known_as_subxact;
+ TransactionId toplevel_xid;
/*
* LSN of the first data carrying, WAL record with knowledge about this
@@ -190,10 +189,13 @@ typedef struct ReorderBufferTXN
TimestampTz commit_time;
/*
- * Base snapshot or NULL.
+ * The base snapshot is used to decode all changes until either this
+ * transaction modifies the catalog, or another catalog-modifying
+ * transaction commits.
*/
Snapshot base_snapshot;
XLogRecPtr base_snapshot_lsn;
+ dlist_node base_snapshot_node; /* link in txns_by_base_snapshot_lsn */
/*
* How many ReorderBufferChange's do we have in this txn.
@@ -260,7 +262,7 @@ typedef struct ReorderBufferTXN
* Position in one of three lists:
* * list of subtransactions if we are *known* to be subxact
* * list of toplevel xacts (can be an as-yet unknown subxact)
- * * list of preallocated ReorderBufferTXNs
+ * * list of preallocated ReorderBufferTXNs (if unused)
* ---
*/
dlist_node node;
@@ -302,6 +304,15 @@ struct ReorderBuffer
dlist_head toplevel_by_lsn;
/*
+ * Transactions and subtransactions that have a base snapshot, ordered by
+ * LSN of the record which caused us to first obtain the base snapshot.
+ * This is not the same as toplevel_by_lsn, because we only set the base
+ * snapshot on the first logical-decoding-relevant record (eg. heap
+ * writes), whereas the initial LSN could be set by other operations.
+ */
+ dlist_head txns_by_base_snapshot_lsn;
+
+ /*
* one-entry sized cache for by_txn. Very frequently the same txn gets
* looked up over and over again.
*/
@@ -389,6 +400,7 @@ bool ReorderBufferXidHasCatalogChanges(ReorderBuffer *, TransactionId xid);
bool ReorderBufferXidHasBaseSnapshot(ReorderBuffer *, TransactionId xid);
ReorderBufferTXN *ReorderBufferGetOldestTXN(ReorderBuffer *);
+TransactionId ReorderBufferGetOldestXmin(ReorderBuffer *rb);
void ReorderBufferSetRestartPoint(ReorderBuffer *, XLogRecPtr ptr);