From a31a6ed9a56a4741f95e67a45cb8cfcf68f280c6 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 12 Nov 2020 05:39:22 +0000 Subject: [PATCH] TD-2072 --- src/inc/tsdb.h | 2 ++ src/tsdb/src/tsdbCommitQueue.c | 14 +++++++++++++- src/vnode/src/vnodeMain.c | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/inc/tsdb.h b/src/inc/tsdb.h index d7515a1495..499aedfeed 100644 --- a/src/inc/tsdb.h +++ b/src/inc/tsdb.h @@ -324,6 +324,8 @@ void tsdbReportStat(void *repo, int64_t *totalPoints, int64_t *totalStorage, int int tsdbInitCommitQueue(int nthreads); void tsdbDestroyCommitQueue(); int tsdbSyncCommit(TSDB_REPO_T *repo); +int tsdbIncCommitRef(int vgId); +void tsdbDecCommitRef(int vgId); #ifdef __cplusplus } diff --git a/src/tsdb/src/tsdbCommitQueue.c b/src/tsdb/src/tsdbCommitQueue.c index 3c158a2201..ad4e433274 100644 --- a/src/tsdb/src/tsdbCommitQueue.c +++ b/src/tsdb/src/tsdbCommitQueue.c @@ -15,6 +15,7 @@ #include "os.h" #include "tlist.h" +#include "tref.h" #include "tsdbMain.h" typedef struct { @@ -22,6 +23,7 @@ typedef struct { pthread_mutex_t lock; pthread_cond_t queueNotEmpty; int nthreads; + int refCount; SList * queue; pthread_t * threads; } SCommitQueue; @@ -123,7 +125,7 @@ static void *tsdbLoopCommit(void *arg) { while (true) { pNode = tdListPopHead(pQueue->queue); if (pNode == NULL) { - if (pQueue->stop) { + if (pQueue->stop && pQueue->refCount == 0) { pthread_mutex_unlock(&(pQueue->lock)); goto _exit; } else { @@ -145,3 +147,13 @@ static void *tsdbLoopCommit(void *arg) { _exit: return NULL; } + +int tsdbIncCommitRef(int vgId) { + int refCount = atomic_add_fetch_32(&tsCommitQueue.refCount, 1); + tsdbDebug("vgId:%d, inc commit queue ref to %d", refCount); +} + +void tsdbDecCommitRef(int vgId) { + int refCount = atomic_sub_fetch_32(&tsCommitQueue.refCount, 1); + tsdbDebug("vgId:%d, dec commit queue ref to %d", refCount); +} \ No newline at end of file diff --git a/src/vnode/src/vnodeMain.c b/src/vnode/src/vnodeMain.c index 199619e851..7813c5217b 100644 --- a/src/vnode/src/vnodeMain.c +++ b/src/vnode/src/vnodeMain.c @@ -355,6 +355,7 @@ int32_t vnodeOpen(int32_t vnode, char *rootDir) { pVnode->status = TAOS_VN_STATUS_READY; vDebug("vgId:%d, vnode is opened in %s, pVnode:%p", pVnode->vgId, rootDir, pVnode); + tsdbIncCommitRef(pVnode->vgId); taosHashPut(tsVnodesHash, (const char *)&pVnode->vgId, sizeof(int32_t), (char *)(&pVnode), sizeof(SVnodeObj *)); return TSDB_CODE_SUCCESS; @@ -446,6 +447,7 @@ void vnodeRelease(void *pVnodeRaw) { tsem_destroy(&pVnode->sem); free(pVnode); + tsdbDecCommitRef(vgId); int32_t count = taosHashGetSize(tsVnodesHash); vDebug("vgId:%d, vnode is destroyed, vnodes:%d", vgId, count); -- GitLab