From 568c6269dcbb57483f47a400d576b3934d76d7f8 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 19 May 2022 14:59:55 +0800 Subject: [PATCH] fix: acquire vnode on restart may deadlock --- source/dnode/mgmt/mgmt_vnode/src/vmInt.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c index 8c3b8576a8..41c0b3086b 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c @@ -334,19 +334,23 @@ static int32_t vmRequire(const SMgmtInputOpt *pInput, bool *required) { } static int32_t vmStart(SVnodeMgmt *pMgmt) { - taosRLockLatch(&pMgmt->latch); + int32_t numOfVnodes = 0; + SVnodeObj **pVnodes = vmGetVnodeListFromHash(pMgmt, &numOfVnodes); - void *pIter = taosHashIterate(pMgmt->hash, NULL); - while (pIter) { - SVnodeObj **ppVnode = pIter; - if (ppVnode == NULL || *ppVnode == NULL) continue; - - SVnodeObj *pVnode = *ppVnode; + for (int32_t i = 0; i < numOfVnodes; ++i) { + SVnodeObj *pVnode = pVnodes[i]; vnodeStart(pVnode->pImpl); - pIter = taosHashIterate(pMgmt->hash, pIter); } - taosRUnLockLatch(&pMgmt->latch); + for (int32_t i = 0; i < numOfVnodes; ++i) { + SVnodeObj *pVnode = pVnodes[i]; + vmReleaseVnode(pMgmt, pVnode); + } + + if (pVnodes != NULL) { + taosMemoryFree(pVnodes); + } + return 0; }