From 58ce6a3f264b819e139fa09ea7758c1b4e3fe775 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Jun 2023 16:28:33 +0800 Subject: [PATCH] fix vnode close --- source/dnode/vnode/src/tsdb/tsdbFS2.c | 76 ++++++++++++++++++--------- source/dnode/vnode/src/tsdb/tsdbFS2.h | 1 + 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.c b/source/dnode/vnode/src/tsdb/tsdbFS2.c index 5cc2771565..bdcfae4d43 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.c @@ -536,10 +536,39 @@ _exit: return 0; } -int32_t tsdbCloseFS(STFileSystem **ppFS) { - if (ppFS[0] == NULL) return 0; - close_file_system(ppFS[0]); - destroy_fs(ppFS); +static void tsdbDoWaitBgTask(STFileSystem *fs, STFSBgTask *task) { + task->numWait++; + taosThreadCondWait(task->done, fs->mutex); + task->numWait--; + + if (task->numWait == 0) { + taosThreadCondDestroy(task->done); + taosMemoryFree(task); + } +} + +static void tsdbDoDoneBgTask(STFileSystem *fs, STFSBgTask *task) { + if (task->numWait > 0) { + taosThreadCondBroadcast(task->done); + } else { + taosThreadCondDestroy(task->done); + taosMemoryFree(task); + } +} + +int32_t tsdbCloseFS(STFileSystem **fs) { + if (fs[0] == NULL) return 0; + + taosThreadMutexLock(fs[0]->mutex); + fs[0]->stop = true; + + if (fs[0]->bgTaskRunning) { + tsdbDoWaitBgTask(fs[0], fs[0]->bgTaskRunning); + } + taosThreadMutexUnlock(fs[0]->mutex); + + close_file_system(fs[0]); + destroy_fs(fs); return 0; } @@ -723,23 +752,27 @@ static int32_t tsdbFSRunBgTask(void *arg) { taosThreadMutexLock(fs->mutex); // free last - if (fs->bgTaskRunning->numWait > 0) { - taosThreadCondBroadcast(fs->bgTaskRunning->done); - } else { - taosThreadCondDestroy(fs->bgTaskRunning->done); - taosMemoryFree(fs->bgTaskRunning); - } + tsdbDoDoneBgTask(fs, fs->bgTaskRunning); fs->bgTaskRunning = NULL; // schedule next if (fs->bgTaskNum > 0) { - // pop task from head - fs->bgTaskRunning = fs->bgTaskQueue->next; - fs->bgTaskRunning->prev->next = fs->bgTaskRunning->next; - fs->bgTaskRunning->next->prev = fs->bgTaskRunning->prev; - fs->bgTaskNum--; - - vnodeScheduleTaskEx(1, tsdbFSRunBgTask, arg); + if (fs->stop) { + while (fs->bgTaskNum > 0) { + STFSBgTask *task = fs->bgTaskQueue->next; + task->prev->next = task->next; + task->next->prev = task->prev; + fs->bgTaskNum--; + tsdbDoDoneBgTask(fs, task); + } + } else { + // pop task from head + fs->bgTaskRunning = fs->bgTaskQueue->next; + fs->bgTaskRunning->prev->next = fs->bgTaskRunning->next; + fs->bgTaskRunning->next->prev = fs->bgTaskRunning->prev; + fs->bgTaskNum--; + vnodeScheduleTaskEx(1, tsdbFSRunBgTask, arg); + } } taosThreadMutexUnlock(fs->mutex); @@ -811,14 +844,7 @@ int32_t tsdbFSWaitBgTask(STFileSystem *fs, int64_t taskid) { } if (task) { - task->numWait++; - taosThreadCondWait(task->done, fs->mutex); - task->numWait--; - - if (task->numWait == 0) { - taosThreadCondDestroy(task->done); - taosMemoryFree(task); - } + tsdbDoWaitBgTask(fs, task); } taosThreadMutexUnlock(fs->mutex); diff --git a/source/dnode/vnode/src/tsdb/tsdbFS2.h b/source/dnode/vnode/src/tsdb/tsdbFS2.h index 8dff77a6bc..24966a7127 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS2.h +++ b/source/dnode/vnode/src/tsdb/tsdbFS2.h @@ -94,6 +94,7 @@ struct STFileSystem { // background task queue TdThreadMutex mutex[1]; + bool stop; int64_t taskid; int32_t bgTaskNum; STFSBgTask bgTaskQueue[1];