From 07d7a0eb5b7147b4d6bd4bec91bc39ecc6a87d22 Mon Sep 17 00:00:00 2001 From: congzhou2603 Date: Fri, 21 Jun 2024 15:51:26 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90bugfix=E3=80=91=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=BB=E6=9C=BA=E9=87=8D=E5=90=AF=E5=9C=BA=E6=99=AF=EF=BC=8C?= =?UTF-8?q?=E4=B8=A4=E9=98=B6=E6=AE=B5=E4=BA=8B=E5=8A=A1=E5=8D=A1=E4=BD=8F?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/ddes/adapter/ss_transaction.cpp | 6 ++++-- src/gausskernel/storage/access/transam/twophase.cpp | 12 +++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/gausskernel/ddes/adapter/ss_transaction.cpp b/src/gausskernel/ddes/adapter/ss_transaction.cpp index 62a763a6e..789bf69bf 100644 --- a/src/gausskernel/ddes/adapter/ss_transaction.cpp +++ b/src/gausskernel/ddes/adapter/ss_transaction.cpp @@ -1019,6 +1019,10 @@ bool SSCanFetchLocalSnapshotTxnRelatedInfo() return false; } + if (SS_IN_REFORM && t_thrd.role == STARTUP) { + return true; + } + if (SS_NORMAL_PRIMARY) { return true; } else if (SS_PERFORMING_SWITCHOVER) { @@ -1033,8 +1037,6 @@ bool SSCanFetchLocalSnapshotTxnRelatedInfo() bool snap_available = xmin_info->snapshot_available; SpinLockRelease(&xmin_info->snapshot_available_lock); return snap_available; - } else if (SS_STANDBY_FAILOVER && t_thrd.role == STARTUP) { - return true; } return false; diff --git a/src/gausskernel/storage/access/transam/twophase.cpp b/src/gausskernel/storage/access/transam/twophase.cpp index 51b090f9d..9b6b6f355 100644 --- a/src/gausskernel/storage/access/transam/twophase.cpp +++ b/src/gausskernel/storage/access/transam/twophase.cpp @@ -3121,6 +3121,9 @@ TransactionId PrescanPreparedTransactions(TransactionId **xids_p, int *nxids_p) char *buf = NULL; GlobalTransaction gxact = currentStatePtr->prepXacts[i]; + if (!gxact->inredo && SS_PERFORMING_SWITCHOVER) { + continue; + } Assert(gxact->inredo); xid = gxact->xid; @@ -3238,6 +3241,10 @@ void RecoverPreparedTransactions(void) TransactionId xid; char *buf = NULL; GlobalTransaction gxact = currentStatePtr->prepXacts[i]; + + if (!gxact->inredo && SS_PERFORMING_SWITCHOVER) { + continue; + } char *bufptr = NULL; TwoPhaseFileHeader *hdr = NULL; TransactionId *subxids = NULL; @@ -3698,7 +3705,7 @@ void PrepareRedoAdd(char *buf, XLogRecPtr start_lsn, XLogRecPtr end_lsn) /* unfortunately we can't check if the lock is held exclusively */ Assert(LWLockHeldByMe(TwoPhaseStateMappingPartitionLock(hdr->xid))); - Assert(RecoveryInProgress()); + Assert(RecoveryInProgress() || SS_PERFORMING_SWITCHOVER); gid = hdr->gid; @@ -3708,6 +3715,9 @@ void PrepareRedoAdd(char *buf, XLogRecPtr start_lsn, XLogRecPtr end_lsn) gxact = currentStatePtr->prepXacts[i]; if (gxact->xid == hdr->xid) { + if (!gxact->inredo && SS_PERFORMING_SWITCHOVER) { + return; + } Assert(gxact->inredo); ereport(LOG, (errmsg("2PC data xid : " XID_FMT " has already existed", gxact->xid))); return;