From 72e373cd4eb3e5451be4dcd975b1e4b87cec9167 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Mon, 24 May 2021 12:29:14 +0300 Subject: [PATCH] Fix maintaining of next multixact --- pageserver/src/basebackup.rs | 1 - pageserver/src/waldecoder.rs | 16 ++++++++-------- vendor/postgres | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pageserver/src/basebackup.rs b/pageserver/src/basebackup.rs index d0067f3890..36cb0e2ab5 100644 --- a/pageserver/src/basebackup.rs +++ b/pageserver/src/basebackup.rs @@ -158,7 +158,6 @@ fn add_pgcontrol_file( let mut checkpoint = postgres_ffi::decode_checkpoint(checkpoint_bytes)?; checkpoint.redo = lsn.0; - checkpoint.nextXid.value += 1; // TODO: When we restart master there are no active transaction and oldestXid is // equal to nextXid if there are no prepared transactions. // Let's ignore them for a while... diff --git a/pageserver/src/waldecoder.rs b/pageserver/src/waldecoder.rs index b94a471a66..8edfe0bcc7 100644 --- a/pageserver/src/waldecoder.rs +++ b/pageserver/src/waldecoder.rs @@ -574,10 +574,10 @@ pub fn decode_wal_record(checkpoint: &mut CheckPoint, record: Bytes) -> DecodedW xlogrec.xl_rmid, xlogrec.xl_info ); - if xlogrec.xl_xid > checkpoint.nextXid.value as u32 { + if xlogrec.xl_xid >= checkpoint.nextXid.value as u32 { // TODO: handle XID wraparound checkpoint.nextXid = FullTransactionId { - value: (checkpoint.nextXid.value & 0xFFFFFFFF00000000) | xlogrec.xl_xid as u64, + value: (checkpoint.nextXid.value & 0xFFFFFFFF00000000) | (xlogrec.xl_xid+1) as u64, }; } let remaining = xlogrec.xl_tot_len - SizeOfXLogRecord; @@ -1080,18 +1080,18 @@ pub fn decode_wal_record(checkpoint: &mut CheckPoint, record: Bytes) -> DecodedW blk.blkno = blkno; blocks.push(blk); } - if xlrec.mid > checkpoint.nextMulti { - checkpoint.nextMulti = xlrec.mid; + if xlrec.mid >= checkpoint.nextMulti { + checkpoint.nextMulti = xlrec.mid+1; } - if xlrec.moff > checkpoint.nextMultiOffset { - checkpoint.nextMultiOffset = xlrec.moff; + if xlrec.moff+xlrec.nmembers > checkpoint.nextMultiOffset { + checkpoint.nextMultiOffset = xlrec.moff+xlrec.nmembers; } let max_xid = xlrec .members .iter() .fold(checkpoint.nextXid.value as u32, |acc, mbr| { - if mbr.xid > acc { - mbr.xid + if mbr.xid >= acc { + mbr.xid+1 } else { acc } diff --git a/vendor/postgres b/vendor/postgres index 1ac4f5b6b1..fd9de093b0 160000 --- a/vendor/postgres +++ b/vendor/postgres @@ -1 +1 @@ -Subproject commit 1ac4f5b6b1fe7a4e4cc5b0c5e209999fdc2310ba +Subproject commit fd9de093b0e115459c8816895d2ac37da2599aca