From 1d8c2fd923dc5fa2dc0096ae0c9e43efb438824a Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 26 Jun 2024 07:42:19 +0000 Subject: [PATCH 1/5] 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 From e47968340d2749346a32830c07a636b4cb2f3ce9 Mon Sep 17 00:00:00 2001 From: dmchen Date: Wed, 26 Jun 2024 09:40:17 +0000 Subject: [PATCH 2/5] fix drop db --- source/dnode/mnode/impl/inc/mndTrans.h | 1 + source/dnode/mnode/impl/src/mndTrans.c | 4 ++++ source/dnode/mnode/impl/src/mndVgroup.c | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/inc/mndTrans.h b/source/dnode/mnode/impl/inc/mndTrans.h index 8008eb76e7..7f039bc21f 100644 --- a/source/dnode/mnode/impl/inc/mndTrans.h +++ b/source/dnode/mnode/impl/inc/mndTrans.h @@ -84,6 +84,7 @@ void mndTransSetParallel(STrans *pTrans); void mndTransSetChangeless(STrans *pTrans); void mndTransSetOper(STrans *pTrans, EOperType oper); int32_t mndTransCheckConflict(SMnode *pMnode, STrans *pTrans); +int32_t mndTransCheckConflictWithCompact(SMnode *pMnode, STrans *pTrans); #ifndef BUILD_NO_CALL static int32_t mndTrancCheckConflict(SMnode *pMnode, STrans *pTrans) { return mndTransCheckConflict(pMnode, pTrans); diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index cecfb1fbf3..111d5b88ce 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -897,6 +897,10 @@ int32_t mndTransCheckConflict(SMnode *pMnode, STrans *pTrans) { return terrno; } + return 0; +} + +int32_t mndTransCheckConflictWithCompact(SMnode *pMnode, STrans *pTrans) { void *pIter = NULL; bool conflict = false; SCompactObj *pCompact = NULL; diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index d2da1f585b..0422bfabff 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -1954,7 +1954,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, if (pTrans == NULL) goto _OVER; mndTransSetDbName(pTrans, pVgroup->dbName, NULL); - if (mndTransCheckConflict(pMnode, pTrans) != 0) goto _OVER; + if (mndTransCheckConflictWithCompact(pMnode, pTrans) != 0) goto _OVER; mndTransSetSerial(pTrans); mInfo("trans:%d, used to redistribute vgroup, vgId:%d", pTrans->id, pVgroup->vgId); From 85e4f092397a8d27c9f688d1d282e48cee16c600 Mon Sep 17 00:00:00 2001 From: Shungang Li Date: Thu, 27 Jun 2024 10:30:58 +0800 Subject: [PATCH 3/5] fix: parseCsvFile reset pTag to NULL --- source/libs/parser/src/parTranslater.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index f699bfb31c..3108089232 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -12894,6 +12894,7 @@ static int32_t parseCsvFile(SMsgBuf* pMsgBuf, SParseContext* pParseCxt, SParseFi taosMemoryFreeClear(pParseFileCtx->pTag); } + pParseFileCtx->pTag = NULL; taosArrayClearEx(pParseFileCtx->aTagVals, clearTagValArrayFp); } From e61c5a40832703b156a1f9512b92c1a386146bfd Mon Sep 17 00:00:00 2001 From: Shungang Li Date: Thu, 27 Jun 2024 14:12:23 +0800 Subject: [PATCH 4/5] fix: parseOneStbRow break if token parse err --- source/libs/parser/src/parTranslater.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 3108089232..6bba947449 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -12819,6 +12819,8 @@ static int32_t parseOneStbRow(SMsgBuf* pMsgBuf, SParseFileContext* pParFileCtx) code = parseTbnameToken(pMsgBuf, pParFileCtx->ctbName.tname, &token, &bFoundTbName); } } + + if (TSDB_CODE_SUCCESS != code) break; } if (TSDB_CODE_SUCCESS == code) { // may fail to handle json From 66312372d6461cc5dd4229ef86354c633560c868 Mon Sep 17 00:00:00 2001 From: dmchen Date: Thu, 27 Jun 2024 09:57:54 +0000 Subject: [PATCH 5/5] remove useless --- source/dnode/mnode/impl/src/mndTrans.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 111d5b88ce..39b9e9c14b 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -904,7 +904,7 @@ int32_t mndTransCheckConflictWithCompact(SMnode *pMnode, STrans *pTrans) { 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);