mirror of
https://github.com/postgres/postgres.git
synced 2025-10-21 02:52:47 +03:00
Immediately WAL-log subtransaction and top-level XID association.
The logical decoding infrastructure needs to know which top-level transaction the subxact belongs to, in order to decode all the changes. Until now that might be delayed until commit, due to the caching (GPROC_MAX_CACHED_SUBXIDS), preventing features requiring incremental decoding. So we also write the assignment info into WAL immediately, as part of the next WAL record (to minimize overhead) only when wal_level=logical. We can not remove the existing XLOG_XACT_ASSIGNMENT WAL as that is required for avoiding overflow in the hot standby snapshot. Bump XLOG_PAGE_MAGIC, since this introduces XLR_BLOCK_ID_TOPLEVEL_XID. Author: Tomas Vondra, Dilip Kumar, Amit Kapila Reviewed-by: Amit Kapila Tested-by: Neha Sharma and Mahendra Singh Thalor Discussion: https://postgr.es/m/688b0b7f-2f6c-d827-c27b-216a8e3ea700@2ndquadrant.com
This commit is contained in:
@@ -428,6 +428,9 @@ extern void UnregisterXactCallback(XactCallback callback, void *arg);
|
||||
extern void RegisterSubXactCallback(SubXactCallback callback, void *arg);
|
||||
extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg);
|
||||
|
||||
extern bool IsSubTransactionAssignmentPending(void);
|
||||
extern void MarkSubTransactionAssigned(void);
|
||||
|
||||
extern int xactGetCommittedChildren(TransactionId **ptr);
|
||||
|
||||
extern XLogRecPtr XactLogCommitRecord(TimestampTz commit_time,
|
||||
|
@@ -237,6 +237,7 @@ extern bool XLOG_DEBUG;
|
||||
*/
|
||||
#define XLOG_INCLUDE_ORIGIN 0x01 /* include the replication origin */
|
||||
#define XLOG_MARK_UNIMPORTANT 0x02 /* record not important for durability */
|
||||
#define XLOG_INCLUDE_XID 0x04 /* include XID of top-level xact */
|
||||
|
||||
|
||||
/* Checkpoint statistics */
|
||||
|
@@ -31,7 +31,7 @@
|
||||
/*
|
||||
* Each page of XLOG file has a header like this:
|
||||
*/
|
||||
#define XLOG_PAGE_MAGIC 0xD106 /* can be used as WAL version indicator */
|
||||
#define XLOG_PAGE_MAGIC 0xD107 /* can be used as WAL version indicator */
|
||||
|
||||
typedef struct XLogPageHeaderData
|
||||
{
|
||||
|
@@ -191,6 +191,8 @@ struct XLogReaderState
|
||||
|
||||
RepOriginId record_origin;
|
||||
|
||||
TransactionId toplevel_xid; /* XID of top-level transaction */
|
||||
|
||||
/* information about blocks referenced by the record. */
|
||||
DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID + 1];
|
||||
|
||||
@@ -304,6 +306,7 @@ extern bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record,
|
||||
#define XLogRecGetRmid(decoder) ((decoder)->decoded_record->xl_rmid)
|
||||
#define XLogRecGetXid(decoder) ((decoder)->decoded_record->xl_xid)
|
||||
#define XLogRecGetOrigin(decoder) ((decoder)->record_origin)
|
||||
#define XLogRecGetTopXid(decoder) ((decoder)->toplevel_xid)
|
||||
#define XLogRecGetData(decoder) ((decoder)->main_data)
|
||||
#define XLogRecGetDataLen(decoder) ((decoder)->main_data_len)
|
||||
#define XLogRecHasAnyBlockRefs(decoder) ((decoder)->max_block_id >= 0)
|
||||
|
@@ -223,5 +223,6 @@ typedef struct XLogRecordDataHeaderLong
|
||||
#define XLR_BLOCK_ID_DATA_SHORT 255
|
||||
#define XLR_BLOCK_ID_DATA_LONG 254
|
||||
#define XLR_BLOCK_ID_ORIGIN 253
|
||||
#define XLR_BLOCK_ID_TOPLEVEL_XID 252
|
||||
|
||||
#endif /* XLOGRECORD_H */
|
||||
|
Reference in New Issue
Block a user