diff --git a/src/balance/src/balance.c b/src/balance/src/balance.c index 0fa4b3f34615aad3fb749d44cb27b3feab10f49c..0e9bb85b25defd169fea8711d3e0b40304500de4 100644 --- a/src/balance/src/balance.c +++ b/src/balance/src/balance.c @@ -216,8 +216,8 @@ static bool balanceCheckVgroupReady(SVgObj *pVgroup, SVnodeGid *pRmVnode) { SVnodeGid *pVnode = pVgroup->vnodeGid + i; if (pVnode == pRmVnode) continue; - mTrace("vgId:%d, change vgroup status, dnode:%d status:%d", pVgroup->vgId, pVnode->pDnode->dnodeId, - pVnode->pDnode->status); + mTrace("vgId:%d, check vgroup status, dnode:%d status:%d, vnode role:%s", pVgroup->vgId, pVnode->pDnode->dnodeId, + pVnode->pDnode->status, syncRole[pVnode->role]); if (pVnode->pDnode->status == TAOS_DN_STATUS_DROPPING) continue; if (pVnode->pDnode->status == TAOS_DN_STATUS_OFFLINE) continue; diff --git a/src/vnode/src/vnodeMain.c b/src/vnode/src/vnodeMain.c index 8de0fa43e9aa60906c7f75b7bd78d498539a0658..2d05885c5aaa805bb4650807e8bf690b6a045abc 100644 --- a/src/vnode/src/vnodeMain.c +++ b/src/vnode/src/vnodeMain.c @@ -379,9 +379,15 @@ void vnodeRelease(void *pVnodeRaw) { return; } + vTrace("vgId:%d, vnode will be destroyed, refCount:%d pVnode:%p data:%p", vgId, refCount, pVnode, pVnode->ppVnode); + void **ppVnode = pVnode->ppVnode; + SVnodeObj pTempVnode = *pVnode; + memset(pVnode, 0, sizeof(SVnodeObj)); + pVnode = &pTempVnode; + if (ppVnode != NULL) { - taosCacheRelease(tsDnodeVnodesCache, (void **)(&ppVnode), false); + taosCacheRelease(tsDnodeVnodesCache, (void **)(&ppVnode), true); } if (pVnode->qMgmt) { @@ -436,9 +442,12 @@ void vnodeRelease(void *pVnodeRaw) { } tsem_destroy(&pVnode->sem); - free(pVnode); - int32_t count = taosHashGetSize(tsDnodeVnodesCache->pHashTable); + int32_t count = 0; + if (tsDnodeVnodesCache) { + count = taosHashGetSize(tsDnodeVnodesCache->pHashTable); + } + vDebug("vgId:%d, vnode is released, vnodes:%d", vgId, count); } @@ -1055,5 +1064,5 @@ PARSE_OVER: static void vnodeFreeVnodeObj(void *data) { SVnodeObj *pVnode = *(SVnodeObj **)data; vDebug("vgId:%d, vnode is destroyed, pVnode:%p data:%p", pVnode->vgId, pVnode, pVnode->ppVnode); - //taosTFree(pVnode); + taosTFree(pVnode); } \ No newline at end of file diff --git a/src/vnode/src/vnodeRead.c b/src/vnode/src/vnodeRead.c index 0bed5d52b94d507219cc901dfcdf930ca674c10b..2a39e2e76f3285f6836dcc8793e79f2d45269809 100644 --- a/src/vnode/src/vnodeRead.c +++ b/src/vnode/src/vnodeRead.c @@ -80,12 +80,12 @@ int32_t vnodeProcessRead(void *param, SReadMsg *pRead) { if (code == TSDB_CODE_APP_NOT_READY && pRead->rpcMsg.msgType == TSDB_MSG_TYPE_QUERY) { // After the fetch request enters the vnode queue // If the vnode cannot provide services, the following operations are still required - // Or there will be a deadlock + // Or, there will be a deadlock void **qhandle = (void **)pRead->pCont; vError("QInfo:%p msg:%p will be killed for vstatus is %s", *qhandle, pRead, vnodeStatus[pVnode->status]); - qKillQuery(*qhandle); - qReleaseQInfo(pVnode->qMgmt, (void **)&qhandle, true); + // qKillQuery(*qhandle); + // qReleaseQInfo(pVnode->qMgmt, (void **)&qhandle, true); return TSDB_CODE_APP_NOT_READY; } else { return code;