From 0b7332ef5f65cc412dbf25e514185546cfef34d3 Mon Sep 17 00:00:00 2001 From: zhaosen Date: Fri, 10 May 2024 18:26:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dustore=E8=A7=86=E5=9B=BEgs=5F?= =?UTF-8?q?undo=5Fdump=5Fparsepage=5Fmv=E8=BF=90=E8=A1=8C=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=B8=AD=E6=9C=AA=E8=80=83=E8=99=91xid=E7=9A=84?= =?UTF-8?q?=E7=BA=A6=E6=9D=9F=E6=9D=A1=E4=BB=B6=EF=BC=8C=E5=9C=A8=E9=81=8D?= =?UTF-8?q?=E5=8E=86TD=E9=93=BE=E6=97=B6=E4=BC=9A=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E6=AD=BB=E5=BE=AA=E7=8E=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/storage/page/pageparse.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/gausskernel/storage/page/pageparse.cpp b/src/gausskernel/storage/page/pageparse.cpp index 17f6d1ad6..182d40fa5 100644 --- a/src/gausskernel/storage/page/pageparse.cpp +++ b/src/gausskernel/storage/page/pageparse.cpp @@ -1019,6 +1019,11 @@ static void DumpUndoRecordByUrpFromPage(void *page, ItemPointer ctid, UndoRecPtr int prevTdSlot = tdSlot; int currentTdSlot = tdSlot; UndoRecPtr currUrp = urp; + /*xid is the transaction ID we need for tuple's version when we traverse the TD chain, + for one version of tuple in undo_record, it's correct xid is stored in urec->OldXactId(); + urec->Xid() represents the transaction ID that placed the undo_record into the undo segment. + */ + TransactionId xid = InvalidTransactionId; fetch_undo: VerifyMemoryContext(); UndoRecord *urec = New(CurrentMemoryContext)UndoRecord(); @@ -1048,7 +1053,8 @@ fetch_undo: currentTdSlot = diskTuple->td_id; /* Find matched undo version, and output. */ - if (ItemPointerGetBlockNumber(ctid) == urec->Blkno() && urec->Offset() == ctid->ip_posid) { + if (ItemPointerGetBlockNumber(ctid) == urec->Blkno() && urec->Offset() == ctid->ip_posid + && (!TransactionIdIsValid(xid) || TransactionIdEquals(xid, urec->Xid()))) { rc = snprintf_s(output + (int)strlen(output), MAXOUTPUTLEN, MAXOUTPUTLEN, "\n\t\tUndoRecPtr(%lu): whdr = xid(%lu), cid(%u), reloid(%u), relfilenode(%u), utype(%u), uinfo(%u).\n", urec->Urp(), urec->Xid(), urec->Cid(), urec->Reloid(), urec->Relfilenode(), urec->Utype(), urec->Uinfo()); @@ -1112,9 +1118,22 @@ fetch_undo: "\n\t\tUndo diskTuple: td_id %u, reserved %u, flag %u, flag2 %u, t_hoff %u.\n", diskTuple->td_id, diskTuple->reserved, diskTuple->flag, diskTuple->flag2, diskTuple->t_hoff); securec_check_ss(rc, "\0", "\0"); + }else{ + if (IS_VALID_UNDO_REC_PTR(urec->Blkprev())) { + currUrp = urec->Blkprev(); + DELETE_EX(urec); + CHECK_FOR_INTERRUPTS(); + goto fetch_undo; + }else{ + goto fetch_end; + } } + }else{ + goto fetch_end; } + xid = urec->OldXactId(); + if (prevTdSlot == currentTdSlot) { if (IS_VALID_UNDO_REC_PTR(urec->Blkprev())) { currUrp = urec->Blkprev();