From 7348cbe5ef1394e10fc0784c8570582d06d2367b Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 18 Nov 2024 12:31:38 +0800 Subject: [PATCH] fix/TD-32914-free-vnode-after-lock --- source/dnode/mgmt/mgmt_vnode/src/vmInt.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c index 2ee607949d..17a99c1806 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c @@ -578,16 +578,13 @@ static int32_t vmOpenVnodes(SVnodeMgmt *pMgmt) { } void vmRemoveFromCreatingHash(SVnodeMgmt *pMgmt, int32_t vgId) { - (void)taosThreadRwlockWrlock(&pMgmt->lock); SVnodeObj *pOld = NULL; + + (void)taosThreadRwlockWrlock(&pMgmt->lock); int32_t r = taosHashGetDup(pMgmt->creatingHash, &vgId, sizeof(int32_t), (void *)&pOld); if (r != 0) { dError("vgId:%d, failed to get vnode from creating Hash", vgId); } - if (pOld) { - dTrace("vgId:%d, free vnode pOld:%p", vgId, &pOld); - vmFreeVnodeObj(&pOld); - } dTrace("vgId:%d, remove from creating Hash", vgId); r = taosHashRemove(pMgmt->creatingHash, &vgId, sizeof(int32_t)); if (r != 0) { @@ -595,6 +592,11 @@ void vmRemoveFromCreatingHash(SVnodeMgmt *pMgmt, int32_t vgId) { } (void)taosThreadRwlockUnlock(&pMgmt->lock); + if (pOld) { + dTrace("vgId:%d, free vnode pOld:%p", vgId, &pOld); + vmFreeVnodeObj(&pOld); + } + _OVER: if (r != 0) { dError("vgId:%d, failed to remove vnode from creatingHash since %s", vgId, tstrerror(r));