diff --git a/source/dnode/vnode/src/inc/meta.h b/source/dnode/vnode/src/inc/meta.h index 300ba515e2b37381ac6da135a2d0781f338b0b6e..9ef61a21d82060cfbf0423635119d3673a13eec2 100644 --- a/source/dnode/vnode/src/inc/meta.h +++ b/source/dnode/vnode/src/inc/meta.h @@ -42,6 +42,8 @@ typedef struct SMetaCache SMetaCache; int32_t metaRLock(SMeta* pMeta); int32_t metaWLock(SMeta* pMeta); int32_t metaULock(SMeta* pMeta); +int32_t metaWaitTxnReadyAndWLock(SMeta* pMeta); +int32_t metaULockAndPostTxnReady(SMeta* pMeta); // metaEntry ================== int metaEncodeEntry(SEncoder* pCoder, const SMetaEntry* pME); @@ -77,7 +79,7 @@ int32_t metaUidFilterCacheGet(SMeta* pMeta, uint64_t suid, const void* pKey, int struct SMeta { TdThreadRwlock lock; - tsem_t txnReady; // if false, we should not write journal + tsem_t txnReady; // vnode-write: wait in 'metaCommit' and post in 'metaBegin' char* path; SVnode* pVnode; diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 85206d082252407afa7d515bc54affd5aaa5eed1..b681597787b4853cbe6fe345ef2b92c327b8d556 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -153,7 +153,7 @@ int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pR int metaDropTable(SMeta* pMeta, int64_t version, SVDropTbReq* pReq, SArray* tbUids, int64_t* tbUid); int32_t metaTrimTables(SMeta* pMeta); int32_t metaTtlSetExpireTime(SMeta* pMeta, int64_t timePointMs); -int metaTtlDropTables(SMeta* pMeta, SArray* tbUids); +int metaTtlDropTables(SMeta* pMeta, SArray* tbUids, bool* pShallAbort); int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq, STableMetaRsp* pMetaRsp); int metaUpdateChangeTimeWithLock(SMeta* pMeta, tb_uid_t uid, int64_t changeTimeMs); SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, int lock); @@ -415,7 +415,8 @@ struct SVnode { TdThreadMutex lock; bool blocked; bool restored; - bool hasTtlTask; + bool ttlTaskProcessing; + bool ttlTaskShallAbort; tsem_t syncSem; int32_t blockSec; int64_t blockSeq; diff --git a/source/dnode/vnode/src/meta/metaOpen.c b/source/dnode/vnode/src/meta/metaOpen.c index fc57816994ca8fca335b6b5f7ad159c1b47d8bad..c15d34f9d8f0aee925bfd6786d5ad774136d8ba4 100644 --- a/source/dnode/vnode/src/meta/metaOpen.c +++ b/source/dnode/vnode/src/meta/metaOpen.c @@ -265,6 +265,24 @@ int32_t metaULock(SMeta *pMeta) { return ret; } +int32_t metaWaitTxnReadyAndWLock(SMeta *pMeta) { + int32_t ret = 0; + + tsem_wait(&pMeta->txnReady); + ret = metaWLock(pMeta); + + return ret; +} + +int32_t metaULockAndPostTxnReady(SMeta *pMeta) { + int32_t ret = 0; + + ret = metaULock(pMeta); + tsem_post(&pMeta->txnReady); + + return ret; +} + static void metaCleanup(SMeta **ppMeta) { SMeta *pMeta = *ppMeta; if (pMeta) { diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 58e2e9f153ac616ac69a641657670c1d5ecff25e..333e3e8a556b84cf1e03713f055c310fda5dc169 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -932,15 +932,13 @@ int metaTtlSetExpireTime(SMeta *pMeta, int64_t timePointMs) { return 0; } -int metaTtlDropTables(SMeta *pMeta, SArray *tbUids) { +int metaTtlDropTables(SMeta *pMeta, SArray *tbUids, bool* pShallAbort) { int ret = 0; int64_t startMs = taosGetTimestampMs(); - tsem_wait(&pMeta->txnReady); - metaWLock(pMeta); + metaWaitTxnReadyAndWLock(pMeta); ttlMgrFlush(pMeta->pTtlMgr, pMeta->txn); - metaULock(pMeta); - tsem_post(&pMeta->txnReady); + metaULockAndPostTxnReady(pMeta); metaRLock(pMeta); ret = ttlMgrFindExpired(pMeta->pTtlMgr, tbUids); @@ -959,16 +957,15 @@ int metaTtlDropTables(SMeta *pMeta, SArray *tbUids) { for (int i = 0; i < TARRAY_SIZE(tbUids); ++i) { tb_uid_t uid = *(tb_uid_t *)taosArrayGet(tbUids, i); - tsem_wait(&pMeta->txnReady); - metaWLock(pMeta); + if (*pShallAbort) break; + metaWaitTxnReadyAndWLock(pMeta); metaDropTableByUid(pMeta, uid, NULL); - metaULock(pMeta); - tsem_post(&pMeta->txnReady); + metaULockAndPostTxnReady(pMeta); taosUsleep(1); } int64_t endMs = taosGetTimestampMs(); - metaInfo("ttl drop table finished, time consumed:%" PRId64 "ms", endMs - startMs); + metaInfo("ttl drop table finished, time consumed:%" PRId64 "ms, isAbort:%d", endMs - startMs, *pShallAbort); return 0; } diff --git a/source/dnode/vnode/src/vnd/vnodeCommit.c b/source/dnode/vnode/src/vnd/vnodeCommit.c index da3d6f3462dbe105fb84a935cfe82ad9b6519f78..bd24ab5eb5187a0ff56f848505d1fc4b7cd74aa5 100644 --- a/source/dnode/vnode/src/vnd/vnodeCommit.c +++ b/source/dnode/vnode/src/vnd/vnodeCommit.c @@ -362,7 +362,7 @@ static int32_t vnodeTtlTask(void *arg) { SVnode *pVnode = pInfo->pVnode; SArray *tbUids = taosArrayInit(8, sizeof(int64_t)); - code = metaTtlDropTables(pVnode->pMeta, tbUids); + code = metaTtlDropTables(pVnode->pMeta, tbUids, &pVnode->ttlTaskShallAbort); if (code) { vFatal("vgId:%d, meta failed to drop table by ttl since %s", TD_VID(pVnode), terrstr()); goto _exit; @@ -373,7 +373,7 @@ static int32_t vnodeTtlTask(void *arg) { } _exit: - pVnode->hasTtlTask = false; + pVnode->ttlTaskProcessing = false; taosArrayDestroy(tbUids); taosMemoryFree(pInfo); return code; diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 8285de75df1e7909eef5636dc2c5e4ccba8c3aa1..a0ab8b85e22e97938e04127aef4fb41a7e2673ba 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -371,7 +371,8 @@ SVnode *vnodeOpen(const char *path, int32_t diskPrimary, STfs *pTfs, SMsgCb msgC pVnode->msgCb = msgCb; taosThreadMutexInit(&pVnode->lock, NULL); pVnode->blocked = false; - pVnode->hasTtlTask = false; + pVnode->ttlTaskProcessing = false; + pVnode->ttlTaskShallAbort = false; tsem_init(&pVnode->syncSem, 0, 0); tsem_init(&(pVnode->canCommit), 0, 1); @@ -476,6 +477,11 @@ void vnodePostClose(SVnode *pVnode) { vnodeSyncPostClose(pVnode); } void vnodeClose(SVnode *pVnode) { if (pVnode) { + pVnode->ttlTaskShallAbort = true; + while (pVnode->ttlTaskProcessing) { + taosMsleep(10); + } + tsem_wait(&pVnode->canCommit); vnodeSyncClose(pVnode); vnodeQueryClose(pVnode); diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 65dbe9c680d10798e97d0460a24c5bb177add9f8..964b8acfa895663609fa18523cfa60b6ded81fc2 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -725,11 +725,11 @@ static int32_t vnodeProcessDropTtlTbReq(SVnode *pVnode, int64_t ver, void *pReq, code = metaTtlSetExpireTime(pVnode->pMeta, ttlExpireTimeMs); if (code) goto end; - if (!pVnode->hasTtlTask) { - pVnode->hasTtlTask = true; + if (!pVnode->ttlTaskProcessing) { + pVnode->ttlTaskProcessing = true; code = vnodeAsyncTtlDropTable(pVnode); if (code) { - pVnode->hasTtlTask = false; + pVnode->ttlTaskProcessing = false; goto end; } }