fix vnode close
This commit is contained in:
parent
6a29bce44e
commit
58ce6a3f26
|
@ -536,10 +536,39 @@ _exit:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbCloseFS(STFileSystem **ppFS) {
|
static void tsdbDoWaitBgTask(STFileSystem *fs, STFSBgTask *task) {
|
||||||
if (ppFS[0] == NULL) return 0;
|
task->numWait++;
|
||||||
close_file_system(ppFS[0]);
|
taosThreadCondWait(task->done, fs->mutex);
|
||||||
destroy_fs(ppFS);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -723,23 +752,27 @@ static int32_t tsdbFSRunBgTask(void *arg) {
|
||||||
taosThreadMutexLock(fs->mutex);
|
taosThreadMutexLock(fs->mutex);
|
||||||
|
|
||||||
// free last
|
// free last
|
||||||
if (fs->bgTaskRunning->numWait > 0) {
|
tsdbDoDoneBgTask(fs, fs->bgTaskRunning);
|
||||||
taosThreadCondBroadcast(fs->bgTaskRunning->done);
|
|
||||||
} else {
|
|
||||||
taosThreadCondDestroy(fs->bgTaskRunning->done);
|
|
||||||
taosMemoryFree(fs->bgTaskRunning);
|
|
||||||
}
|
|
||||||
fs->bgTaskRunning = NULL;
|
fs->bgTaskRunning = NULL;
|
||||||
|
|
||||||
// schedule next
|
// schedule next
|
||||||
if (fs->bgTaskNum > 0) {
|
if (fs->bgTaskNum > 0) {
|
||||||
// pop task from head
|
if (fs->stop) {
|
||||||
fs->bgTaskRunning = fs->bgTaskQueue->next;
|
while (fs->bgTaskNum > 0) {
|
||||||
fs->bgTaskRunning->prev->next = fs->bgTaskRunning->next;
|
STFSBgTask *task = fs->bgTaskQueue->next;
|
||||||
fs->bgTaskRunning->next->prev = fs->bgTaskRunning->prev;
|
task->prev->next = task->next;
|
||||||
fs->bgTaskNum--;
|
task->next->prev = task->prev;
|
||||||
|
fs->bgTaskNum--;
|
||||||
vnodeScheduleTaskEx(1, tsdbFSRunBgTask, arg);
|
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);
|
taosThreadMutexUnlock(fs->mutex);
|
||||||
|
@ -811,14 +844,7 @@ int32_t tsdbFSWaitBgTask(STFileSystem *fs, int64_t taskid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (task) {
|
if (task) {
|
||||||
task->numWait++;
|
tsdbDoWaitBgTask(fs, task);
|
||||||
taosThreadCondWait(task->done, fs->mutex);
|
|
||||||
task->numWait--;
|
|
||||||
|
|
||||||
if (task->numWait == 0) {
|
|
||||||
taosThreadCondDestroy(task->done);
|
|
||||||
taosMemoryFree(task);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taosThreadMutexUnlock(fs->mutex);
|
taosThreadMutexUnlock(fs->mutex);
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct STFileSystem {
|
||||||
|
|
||||||
// background task queue
|
// background task queue
|
||||||
TdThreadMutex mutex[1];
|
TdThreadMutex mutex[1];
|
||||||
|
bool stop;
|
||||||
int64_t taskid;
|
int64_t taskid;
|
||||||
int32_t bgTaskNum;
|
int32_t bgTaskNum;
|
||||||
STFSBgTask bgTaskQueue[1];
|
STFSBgTask bgTaskQueue[1];
|
||||||
|
|
Loading…
Reference in New Issue