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/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 2176cf4e39..39b9e9c14b 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -900,6 +900,41 @@ int32_t mndTransCheckConflict(SMnode *pMnode, STrans *pTrans) { return 0; } +int32_t mndTransCheckConflictWithCompact(SMnode *pMnode, STrans *pTrans) { + void *pIter = NULL; + bool conflict = false; + SCompactObj *pCompact = 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; +} + static bool mndTransActionsOfSameType(SArray *pActions) { int32_t size = taosArrayGetSize(pActions); ETrnAct lastActType = TRANS_ACTION_NULL; diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 5322540670..0422bfabff 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 (mndTransCheckConflictWithCompact(pMnode, pTrans) != 0) goto _OVER; + mndTransSetSerial(pTrans); mInfo("trans:%d, used to redistribute vgroup, vgId:%d", pTrans->id, pVgroup->vgId); diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 2f932d8f27..ce57d6f435 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -12822,6 +12822,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 @@ -12897,6 +12899,7 @@ static int32_t parseCsvFile(SMsgBuf* pMsgBuf, SParseContext* pParseCxt, SParseFi taosMemoryFreeClear(pParseFileCtx->pTag); } + pParseFileCtx->pTag = NULL; taosArrayClearEx(pParseFileCtx->aTagVals, clearTagValArrayFp); } 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