From ed3d27a228d80d13332efeaef5652f4117d9190a Mon Sep 17 00:00:00 2001 From: dongning12 Date: Thu, 2 Feb 2023 11:09:46 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=85=B1=E4=BA=AB=E5=AD=98=E5=82=A8]=20forbid?= =?UTF-8?q?=20mes=5Ftask=5Fproc=20looping=20infinitely?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ddes/adapter/ss_transaction.cpp | 28 ++++++++++--------- .../storage/access/transam/transam.cpp | 15 ++++++++-- src/gausskernel/storage/ipc/procarray.cpp | 15 ++++++++-- src/include/ddes/dms/ss_transaction.h | 4 +-- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/gausskernel/ddes/adapter/ss_transaction.cpp b/src/gausskernel/ddes/adapter/ss_transaction.cpp index 9e4224e42..708473e75 100644 --- a/src/gausskernel/ddes/adapter/ss_transaction.cpp +++ b/src/gausskernel/ddes/adapter/ss_transaction.cpp @@ -167,7 +167,7 @@ CommitSeqNo SSTransactionIdGetCommitSeqNo(TransactionId transactionId, bool isCo * xid -> clog status * true if given transaction committed */ -bool SSTransactionIdDidCommit(TransactionId transactionId) +bool SSTransactionIdDidCommit(TransactionId transactionId, bool* ret_did_commit) { bool did_commit = false; bool remote_get = false; @@ -191,11 +191,10 @@ bool SSTransactionIdDidCommit(TransactionId transactionId) if (!did_commit) { dms_context_t dms_ctx; InitDmsContext(&dms_ctx); - dms_ctx.xid_ctx.xid = *(uint64 *)(&transactionId); - dms_ctx.xid_ctx.inst_id = (unsigned char)SS_MASTER_ID; do { + dms_ctx.xid_ctx.inst_id = (unsigned char)SS_MASTER_ID; if (dms_request_opengauss_txn_status(&dms_ctx, (uint8)XID_COMMITTED, (uint8 *)&did_commit) == DMS_SUCCESS) { remote_get = true; @@ -206,7 +205,10 @@ bool SSTransactionIdDidCommit(TransactionId transactionId) } else { if (SS_IN_REFORM && (t_thrd.role == WORKER || t_thrd.role == THREADPOOL_WORKER)) { ereport(FATAL, (errmsg("SSTransactionIdDidCommit failed during reform, xid=%lu.", transactionId))); + } else if (SS_IN_REFORM) { + return false; } + pg_usleep(USECS_PER_SEC); continue; } @@ -219,35 +221,35 @@ bool SSTransactionIdDidCommit(TransactionId transactionId) t_thrd.xact_cxt.latestFetchXid = transactionId; t_thrd.xact_cxt.latestFetchXidStatus = CLOG_XID_STATUS_COMMITTED; } - - return did_commit; + *ret_did_commit = did_commit; + return true; } /* xid -> clog status */ /* true if given transaction in progress */ -bool SSTransactionIdIsInProgress(TransactionId transactionId) +bool SSTransactionIdIsInProgress(TransactionId transactionId, bool *in_progress) { - bool in_progress = true; dms_context_t dms_ctx; InitDmsContext(&dms_ctx); - - dms_ctx.xid_ctx.xid = *(uint64 *)(&transactionId); - dms_ctx.xid_ctx.inst_id = (unsigned char)SS_MASTER_ID; + dms_ctx.xid_ctx.xid = *(uint64 *)(&transactionId); do { - if (dms_request_opengauss_txn_status(&dms_ctx, (uint8)XID_INPROGRESS, (uint8 *)&in_progress) == DMS_SUCCESS) { + dms_ctx.xid_ctx.inst_id = (unsigned char)SS_MASTER_ID; + if (dms_request_opengauss_txn_status(&dms_ctx, (uint8)XID_INPROGRESS, (uint8 *)in_progress) == DMS_SUCCESS) { ereport(DEBUG1, (errmsg("SS get txn in_progress success, xid=%lu, in_progress=%d.", - transactionId, in_progress))); + transactionId, *in_progress))); break; } else { if (SS_IN_REFORM && (t_thrd.role == WORKER || t_thrd.role == THREADPOOL_WORKER)) { ereport(FATAL, (errmsg("SSTransactionIdIsInProgress failed during reform, xid=%lu.", transactionId))); + } else if (SS_IN_REFORM) { + return false; } pg_usleep(USECS_PER_SEC); continue; } } while (true); - return in_progress; + return true; } TransactionId SSMultiXactIdGetUpdateXid(TransactionId xmax, uint16 t_infomask, uint16 t_infomask2) diff --git a/src/gausskernel/storage/access/transam/transam.cpp b/src/gausskernel/storage/access/transam/transam.cpp index 21d05d224..d6e9a02c1 100644 --- a/src/gausskernel/storage/access/transam/transam.cpp +++ b/src/gausskernel/storage/access/transam/transam.cpp @@ -393,8 +393,19 @@ Datum pgxc_get_csn(PG_FUNCTION_ARGS) */ bool TransactionIdDidCommit(TransactionId transactionId) /* true if given transaction committed */ { - if (SS_STANDBY_MODE) { - return SSTransactionIdDidCommit(transactionId); + while (ENABLE_DMS) { + if (SS_IN_REFORM && !SS_PRIMARY_DEMOTING) { + pg_usleep(USECS_PER_SEC); + continue; + } else if (SS_NORMAL_STANDBY) { + bool ret_did_commit = true; + if (SSTransactionIdDidCommit(transactionId, &ret_did_commit)) { + return ret_did_commit; + } + continue; + } else { + break; + } } CLogXidStatus xidstatus; diff --git a/src/gausskernel/storage/ipc/procarray.cpp b/src/gausskernel/storage/ipc/procarray.cpp index daa4ece53..df7bc62f5 100755 --- a/src/gausskernel/storage/ipc/procarray.cpp +++ b/src/gausskernel/storage/ipc/procarray.cpp @@ -1295,8 +1295,19 @@ bool TransactionIdIsInProgress(TransactionId xid, uint32* needSync, bool shortcu return false; } - if (SS_STANDBY_MODE) { - return SSTransactionIdIsInProgress(xid); + while (ENABLE_DMS) { + if (SS_IN_REFORM && !SS_PRIMARY_DEMOTING) { + pg_usleep(USECS_PER_SEC); + continue; + } else if (SS_NORMAL_STANDBY) { + bool in_progress = true; + if (SSTransactionIdIsInProgress(xid, &in_progress)) { + return in_progress; + } + continue; + } else { + break; + } } /* diff --git a/src/include/ddes/dms/ss_transaction.h b/src/include/ddes/dms/ss_transaction.h index 4d28b9d4d..0ec812d03 100644 --- a/src/include/ddes/dms/ss_transaction.h +++ b/src/include/ddes/dms/ss_transaction.h @@ -90,8 +90,8 @@ typedef struct SSBroadcasDbBackendsAck { Snapshot SSGetSnapshotData(Snapshot snapshot); CommitSeqNo SSTransactionIdGetCommitSeqNo(TransactionId transactionId, bool isCommit, bool isMvcc, bool isNest, Snapshot snapshot, bool* sync); -bool SSTransactionIdDidCommit(TransactionId transactionId); -bool SSTransactionIdIsInProgress(TransactionId transactionId); +bool SSTransactionIdDidCommit(TransactionId transactionId, bool *ret_did_commit); +bool SSTransactionIdIsInProgress(TransactionId transactionId, bool *in_progress); TransactionId SSMultiXactIdGetUpdateXid(TransactionId xmax, uint16 t_infomask, uint16 t_infomask2); bool SSGetOldestXminFromAllStandby(); int SSGetOldestXmin(char *data, uint32 len, char *output_msg, uint32 *output_msg_len);