From 1d8c2fd923dc5fa2dc0096ae0c9e43efb438824a Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 26 Jun 2024 07:42:19 +0000 Subject: [PATCH] fix/TD-30768 --- include/util/taoserror.h | 1 + source/dnode/mnode/impl/src/mndTrans.c | 31 +++++++++++++++++++++++++ source/dnode/mnode/impl/src/mndVgroup.c | 4 ++++ source/util/src/terror.c | 1 + 4 files changed, 37 insertions(+) diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 231b1ef8e7..2de336d036 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -387,6 +387,7 @@ int32_t taosGetErrSize(); #define TSDB_CODE_MND_LAST_TRANS_NOT_FINISHED TAOS_DEF_ERROR_CODE(0, 0x03D6) //internal #define TSDB_CODE_MND_TRANS_SYNC_TIMEOUT TAOS_DEF_ERROR_CODE(0, 0x03D7) #define TSDB_CODE_MND_TRANS_CTX_SWITCH TAOS_DEF_ERROR_CODE(0, 0x03D8) +#define TSDB_CODE_MND_TRANS_CONFLICT_COMPACT TAOS_DEF_ERROR_CODE(0, 0x03D9) #define TSDB_CODE_MND_TRANS_UNKNOW_ERROR TAOS_DEF_ERROR_CODE(0, 0x03DF) // mnode-mq diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 2176cf4e39..cecfb1fbf3 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -897,6 +897,37 @@ int32_t mndTransCheckConflict(SMnode *pMnode, STrans *pTrans) { return terrno; } + void *pIter = NULL; + bool conflict = false; + SCompactObj *pCompact = NULL; + pIter = NULL; + while (1) { + bool thisConflict = false; + pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT, pIter, (void **)&pCompact); + if (pIter == NULL) break; + + if (pTrans->conflict == TRN_CONFLICT_GLOBAL || pTrans->conflict == TRN_CONFLICT_DB || + pTrans->conflict == TRN_CONFLICT_DB_INSIDE) { + if (strcasecmp(pTrans->dbname, pCompact->dbname) == 0) thisConflict = true; + } + + if (thisConflict) { + mError("trans:%d, db:%s stb:%s type:%d, can't execute since conflict with compact:%d db:%s", pTrans->id, + pTrans->dbname, pTrans->stbname, pTrans->conflict, pCompact->compactId, pCompact->dbname); + conflict = true; + } else { + mInfo("trans:%d, db:%s stb:%s type:%d, not conflict with compact:%d db:%s", pTrans->id, pTrans->dbname, + pTrans->stbname, pTrans->conflict, pCompact->compactId, pCompact->dbname); + } + sdbRelease(pMnode->pSdb, pCompact); + } + + if (conflict) { + terrno = TSDB_CODE_MND_TRANS_CONFLICT_COMPACT; + mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); + return terrno; + } + return 0; } diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 5322540670..d2da1f585b 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -1952,6 +1952,10 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "red-vgroup"); if (pTrans == NULL) goto _OVER; + + mndTransSetDbName(pTrans, pVgroup->dbName, NULL); + if (mndTransCheckConflict(pMnode, pTrans) != 0) goto _OVER; + mndTransSetSerial(pTrans); mInfo("trans:%d, used to redistribute vgroup, vgId:%d", pTrans->id, pVgroup->vgId); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index bcbc31ecc7..c5bba6fa53 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -303,6 +303,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_NETWORK_UNAVAILL, "Unable to establish c TAOS_DEFINE_ERROR(TSDB_CODE_MND_LAST_TRANS_NOT_FINISHED, "Last Transaction not finished") TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_SYNC_TIMEOUT, "Sync timeout While execute transaction and will continue in the background") TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CTX_SWITCH, "Transaction context switch") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_CONFLICT_COMPACT, "Transaction not completed due to conflict with compact") TAOS_DEFINE_ERROR(TSDB_CODE_MND_TRANS_UNKNOW_ERROR, "Unknown transaction error") // mnode-mq