From 0bff078c95126072a3bdc0cb275b98b857c3a81b Mon Sep 17 00:00:00 2001 From: dmchen Date: Fri, 2 Aug 2024 04:46:30 +0000 Subject: [PATCH] fix/TD-30742 --- source/dnode/mnode/impl/inc/mndCompact.h | 1 + source/dnode/mnode/impl/inc/mndDb.h | 1 + source/dnode/mnode/impl/src/mndCompact.c | 55 +++++++++++++++--------- source/dnode/mnode/impl/src/mndDb.c | 11 +++++ 4 files changed, 47 insertions(+), 21 deletions(-) diff --git a/source/dnode/mnode/impl/inc/mndCompact.h b/source/dnode/mnode/impl/inc/mndCompact.h index 43cf78a90e..43996705d2 100644 --- a/source/dnode/mnode/impl/inc/mndCompact.h +++ b/source/dnode/mnode/impl/inc/mndCompact.h @@ -47,6 +47,7 @@ int32_t mndProcessQueryCompactRsp(SRpcMsg *pReq); SCompactObj *mndAcquireCompact(SMnode *pMnode, int64_t compactId); void mndReleaseCompact(SMnode *pMnode, SCompactObj *pCompact); +int32_t mndCompactGetDbName(SMnode *pMnode, int32_t compactId, char *dbname, int32_t len); void mndCompactSendProgressReq(SMnode *pMnode, SCompactObj *pCompact); #ifdef __cplusplus diff --git a/source/dnode/mnode/impl/inc/mndDb.h b/source/dnode/mnode/impl/inc/mndDb.h index 8704286826..b72d1386c1 100644 --- a/source/dnode/mnode/impl/inc/mndDb.h +++ b/source/dnode/mnode/impl/inc/mndDb.h @@ -30,6 +30,7 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs, int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUseDbReq *pReq); bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb); void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList); +bool mndDbIsExist(SMnode *pMnode, const char *db); SSdbRaw *mndDbActionEncode(SDbObj *pDb); const char *mndGetDbStr(const char *src); diff --git a/source/dnode/mnode/impl/src/mndCompact.c b/source/dnode/mnode/impl/src/mndCompact.c index da01a4b2f6..6b7ed2f730 100644 --- a/source/dnode/mnode/impl/src/mndCompact.c +++ b/source/dnode/mnode/impl/src/mndCompact.c @@ -224,6 +224,21 @@ SCompactObj *mndAcquireCompact(SMnode *pMnode, int64_t compactId) { void mndReleaseCompact(SMnode *pMnode, SCompactObj *pCompact) { SSdb *pSdb = pMnode->pSdb; sdbRelease(pSdb, pCompact); + pCompact = NULL; +} + +int32_t mndCompactGetDbName(SMnode *pMnode, int32_t compactId, char *dbname, int32_t len) { + int32_t code = 0; + SCompactObj *pCompact = mndAcquireCompact(pMnode, compactId); + if (pCompact == NULL) { + code = TSDB_CODE_MND_RETURN_VALUE_NULL; + if (terrno != 0) code = terrno; + TAOS_RETURN(code); + } + + (void)strncpy(dbname, pCompact->dbname, len); + mndReleaseCompact(pMnode, pCompact); + TAOS_RETURN(code); } // compact db @@ -488,7 +503,7 @@ _OVER: } tFreeSKillCompactReq(&killCompactReq); - sdbRelease(pMnode->pSdb, pCompact); + mndReleaseCompact(pMnode, pCompact); TAOS_RETURN(code); } @@ -636,16 +651,12 @@ static int32_t mndSaveCompactProgress(SMnode *pMnode, int32_t compactId) { sdbRelease(pMnode->pSdb, pDetail); } - SCompactObj *pCompact = mndAcquireCompact(pMnode, compactId); - if (pCompact == NULL) TAOS_RETURN(code); + char dbname[TSDB_TABLE_FNAME_LEN] = {0}; + TAOS_CHECK_RETURN(mndCompactGetDbName(pMnode, compactId, dbname, TSDB_TABLE_FNAME_LEN)); - SDbObj *pDb = mndAcquireDb(pMnode, pCompact->dbname); - if (pDb == NULL) { + if (!mndDbIsExist(pMnode, dbname)) { needSave = true; - mWarn("compact:%" PRId32 ", no db exist, set needSave:%s", compactId, pCompact->dbname); - } else { - mndReleaseDb(pMnode, pDb); - pDb = NULL; + mWarn("compact:%" PRId32 ", no db exist, set needSave:%s", compactId, dbname); } if (!needSave) { @@ -662,7 +673,7 @@ static int32_t mndSaveCompactProgress(SMnode *pMnode, int32_t compactId) { } mInfo("compact:%d, trans:%d, used to update compact progress.", compactId, pTrans->id); - mndTransSetDbName(pTrans, pCompact->dbname, NULL); + mndTransSetDbName(pTrans, dbname, NULL); pIter = NULL; while (1) { @@ -730,24 +741,20 @@ static int32_t mndSaveCompactProgress(SMnode *pMnode, int32_t compactId) { sdbRelease(pMnode->pSdb, pDetail); } - pDb = mndAcquireDb(pMnode, pCompact->dbname); - if (pDb == NULL) { + if (!mndDbIsExist(pMnode, dbname)) { allFinished = true; - mWarn("compact:%" PRId32 ", no db exist, set all finished:%s", compactId, pCompact->dbname); - } else { - mndReleaseDb(pMnode, pDb); - pDb = NULL; + mWarn("compact:%" PRId32 ", no db exist, set all finished:%s", compactId, dbname); } if (allFinished) { - mInfo("compact:%d, all finished", pCompact->compactId); + mInfo("compact:%d, all finished", compactId); pIter = NULL; while (1) { SCompactDetailObj *pDetail = NULL; pIter = sdbFetch(pMnode->pSdb, SDB_COMPACT_DETAIL, pIter, (void **)&pDetail); if (pIter == NULL) break; - if (pDetail->compactId == pCompact->compactId) { + if (pDetail->compactId == compactId) { SSdbRaw *pCommitRaw = mndCompactDetailActionEncode(pDetail); if (pCommitRaw == NULL) { mndTransDrop(pTrans); @@ -770,7 +777,15 @@ static int32_t mndSaveCompactProgress(SMnode *pMnode, int32_t compactId) { sdbRelease(pMnode->pSdb, pDetail); } + SCompactObj *pCompact = mndAcquireCompact(pMnode, compactId); + if (pCompact == NULL) { + mndTransDrop(pTrans); + code = TSDB_CODE_MND_RETURN_VALUE_NULL; + if (terrno != 0) code = terrno; + TAOS_RETURN(code); + } SSdbRaw *pCommitRaw = mndCompactActionEncode(pCompact); + mndReleaseCompact(pMnode, pCompact); if (pCommitRaw == NULL) { mndTransDrop(pTrans); code = TSDB_CODE_MND_RETURN_VALUE_NULL; @@ -789,11 +804,9 @@ static int32_t mndSaveCompactProgress(SMnode *pMnode, int32_t compactId) { if ((code = mndTransPrepare(pMnode, pTrans)) != 0) { mError("compact:%d, trans:%d, failed to prepare since %s", compactId, pTrans->id, terrstr()); mndTransDrop(pTrans); - sdbRelease(pMnode->pSdb, pCompact); TAOS_RETURN(code); } - sdbRelease(pMnode->pSdb, pCompact); mndTransDrop(pTrans); return 0; } @@ -823,8 +836,8 @@ void mndCompactPullup(SMnode *pMnode) { if ((code = mndSaveCompactProgress(pMnode, pCompact->compactId)) != 0) { mError("compact:%d, failed to save compact progress since %s", pCompact->compactId, tstrerror(code)); } + mndReleaseCompact(pMnode, pCompact); } - mndReleaseCompact(pMnode, pCompact); } taosArrayDestroy(pArray); } diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 5a7831ac0e..dd3f89c9d0 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -398,6 +398,17 @@ void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) { sdbRelease(pSdb, pDb); } +bool mndDbIsExist(SMnode *pMnode, const char *db) { + SDbObj *pDb = mndAcquireDb(pMnode, db); + if (pDb == NULL) { + return false; + } else { + mndReleaseDb(pMnode, pDb); + pDb = NULL; + return true; + } +} + static int32_t mndCheckDbName(const char *dbName, SUserObj *pUser) { char *pos = strstr(dbName, TS_PATH_DELIMITER); if (pos == NULL) {