Merge pull request #29470 from taosdata/fix/TD-33435-main

fix: possible snapshot.py fail
This commit is contained in:
Shengliang Guan 2025-01-04 16:23:50 +08:00 committed by GitHub
commit d148191bf2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 20 additions and 5 deletions

View File

@ -78,6 +78,7 @@ int32_t vnodeAsyncC(SVAChannelID* channelID, EVAPriority priority, int32_t (*exe
void vnodeAWait(SVATaskID* taskID);
int32_t vnodeACancel(SVATaskID* taskID);
int32_t vnodeAsyncSetWorkers(int64_t async, int32_t numWorkers);
bool vnodeATaskValid(SVATaskID* taskID);
const char* vnodeGetATaskName(EVATaskT task);

View File

@ -801,7 +801,6 @@ int32_t tsdbDisableAndCancelAllBgTask(STsdb *pTsdb) {
(void)taosThreadMutexUnlock(&pTsdb->mutex);
return terrno;
}
fset->mergeScheduled = false;
tsdbFSSetBlockCommit(fset, false);
}
@ -945,7 +944,7 @@ int32_t tsdbFSEditCommit(STFileSystem *fs) {
// bool skipMerge = false;
int32_t numFile = TARRAY2_SIZE(lvl->fobjArr);
if (numFile >= sttTrigger && (!fset->mergeScheduled)) {
if (numFile >= sttTrigger && (!vnodeATaskValid(&fset->mergeTask))) {
SMergeArg *arg = taosMemoryMalloc(sizeof(*arg));
if (arg == NULL) {
code = terrno;
@ -957,7 +956,6 @@ int32_t tsdbFSEditCommit(STFileSystem *fs) {
code = vnodeAsync(MERGE_TASK_ASYNC, EVA_PRIORITY_HIGH, tsdbMerge, taosAutoMemoryFree, arg, &fset->mergeTask);
TSDB_CHECK_CODE(code, lino, _exit);
fset->mergeScheduled = true;
}
if (numFile >= sttTrigger * BLOCK_COMMIT_FACTOR) {

View File

@ -95,7 +95,6 @@ struct STFileSet {
TSKEY lastCompact;
TSKEY lastCommit;
bool mergeScheduled;
SVATaskID mergeTask;
SVATaskID compactTask;
SVATaskID retentionTask;

View File

@ -484,7 +484,6 @@ static int32_t tsdbMergeGetFSet(SMerger *merger) {
return code;
}
fset->mergeScheduled = false;
(void)taosThreadMutexUnlock(&merger->tsdb->mutex);
return 0;
}

View File

@ -842,4 +842,22 @@ const char *vnodeGetATaskName(EVATaskT taskType) {
default:
return "unknown";
}
}
bool vnodeATaskValid(SVATaskID *taskID) {
if (taskID == NULL || taskID->async < MIN_ASYNC_ID || taskID->async > MAX_ASYNC_ID || taskID->id <= 0) {
return false;
}
SVAsync *async = GVnodeAsyncs[taskID->async].async;
SVATask task2 = {
.taskId = taskID->id,
};
SVATask *task = NULL;
(void)taosThreadMutexLock(&async->mutex);
int32_t ret = vHashGet(async->taskTable, &task2, (void **)&task);
(void)taosThreadMutexUnlock(&async->mutex);
return ret == 0 && task != NULL;
}