From a5e1c4b509e3c79e265e217fbaf8b5f48d7839c9 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Fri, 23 Sep 2022 13:25:17 +0800 Subject: [PATCH] fix: fix qworker destroy issue --- source/libs/qworker/inc/qwInt.h | 1 + source/libs/qworker/src/qwUtil.c | 2 ++ source/libs/qworker/src/qworker.c | 9 ++++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/source/libs/qworker/inc/qwInt.h b/source/libs/qworker/inc/qwInt.h index 729ac474e4..0cb1bbe6c3 100644 --- a/source/libs/qworker/inc/qwInt.h +++ b/source/libs/qworker/inc/qwInt.h @@ -205,6 +205,7 @@ typedef struct SQWorker { SHashObj *ctxHash; // key: queryId+taskId, value: SQWTaskCtx SMsgCb msgCb; SQWStat stat; + int32_t *destroyed; } SQWorker; typedef struct SQWorkerMgmt { diff --git a/source/libs/qworker/src/qwUtil.c b/source/libs/qworker/src/qwUtil.c index 581eea4a81..9f1a9a3146 100644 --- a/source/libs/qworker/src/qwUtil.c +++ b/source/libs/qworker/src/qwUtil.c @@ -485,6 +485,8 @@ void qwDestroyImpl(void *pMgmt) { } taosHashCleanup(mgmt->schHash); + *mgmt->destroyed = 1; + taosMemoryFree(mgmt); atomic_sub_fetch_32(&gQwMgmt.qwNum, 1); diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c index 4dcc06b470..af9399bbdc 100644 --- a/source/libs/qworker/src/qworker.c +++ b/source/libs/qworker/src/qworker.c @@ -1114,10 +1114,17 @@ void qWorkerDestroy(void **qWorkerMgmt) { return; } + int32_t destroyed = 0; SQWorker *mgmt = *qWorkerMgmt; - + mgmt->destroyed = &destroyed; + if (taosRemoveRef(gQwMgmt.qwRef, mgmt->refId)) { qError("remove qw from ref list failed, refId:%" PRIx64, mgmt->refId); + return; + } + + while (0 == destroyed) { + taosMsleep(2); } } -- GitLab