diff --git a/src/vnode/main/src/vnodeMain.c b/src/vnode/main/src/vnodeMain.c index ea1859729e55ab4ca35e0aa86461164afa7feb51..31004d3033f97b6d1af35be341524791b362fdbd 100644 --- a/src/vnode/main/src/vnodeMain.c +++ b/src/vnode/main/src/vnodeMain.c @@ -41,7 +41,7 @@ static void vnodeInit() { vnodeInitWriteFp(); - tsDnodeVnodesHash = taosInitIntHash(TSDB_MAX_VNODES, sizeof(SVnodeObj), taosHashInt); + tsDnodeVnodesHash = taosInitIntHash(TSDB_MAX_VNODES, sizeof(SVnodeObj *), taosHashInt); if (tsDnodeVnodesHash == NULL) { dError("failed to init vnode list"); } @@ -114,12 +114,12 @@ int32_t vnodeOpen(int32_t vnode, char *rootDir) { char temp[TSDB_FILENAME_LEN]; pthread_once(&vnodeModuleInit, vnodeInit); - SVnodeObj vnodeObj = {0}; - vnodeObj.vgId = vnode; - vnodeObj.status = VN_STATUS_INIT; - vnodeObj.refCount = 1; - vnodeObj.version = 0; - SVnodeObj *pVnode = (SVnodeObj *)taosAddIntHash(tsDnodeVnodesHash, vnodeObj.vgId, (char *)(&vnodeObj)); + SVnodeObj *pVnode = calloc(sizeof(SVnodeObj), 1); + pVnode->vgId = vnode; + pVnode->status = VN_STATUS_INIT; + pVnode->refCount = 1; + pVnode->version = 0; + taosAddIntHash(tsDnodeVnodesHash, pVnode->vgId, (char *)(&pVnode)); pVnode->wqueue = dnodeAllocateWqueue(pVnode); pVnode->rqueue = dnodeAllocateRqueue(pVnode); @@ -155,7 +155,7 @@ int32_t vnodeOpen(int32_t vnode, char *rootDir) { int32_t vnodeClose(int32_t vgId) { - SVnodeObj *pVnode = (SVnodeObj *) taosGetIntHashData(tsDnodeVnodesHash, vgId); + SVnodeObj *pVnode = *(SVnodeObj **)taosGetIntHashData(tsDnodeVnodesHash, vgId); if (pVnode == NULL) return 0; dTrace("pVnode:%p vgId:%d, vnode will be closed", pVnode, pVnode->vgId); @@ -188,6 +188,7 @@ void vnodeRelease(void *pVnodeRaw) { } dTrace("pVnode:%p vgId:%d, vnode is released", pVnode, pVnode->vgId); + free(pVnode); tsOpennedVnodes--; if (tsOpennedVnodes <= 0) { @@ -198,7 +199,7 @@ void vnodeRelease(void *pVnodeRaw) { } void *vnodeGetVnode(int32_t vgId) { - SVnodeObj *pVnode = (SVnodeObj *) taosGetIntHashData(tsDnodeVnodesHash, vgId); + SVnodeObj *pVnode = *(SVnodeObj **) taosGetIntHashData(tsDnodeVnodesHash, vgId); if (pVnode == NULL) { terrno = TSDB_CODE_INVALID_VGROUP_ID; return NULL; @@ -234,7 +235,7 @@ void vnodeBuildStatusMsg(void *param) { } static void vnodeBuildVloadMsg(char *pNode, void * param) { - SVnodeObj *pVnode = (SVnodeObj *) pNode; + SVnodeObj *pVnode = *(SVnodeObj **) pNode; if (pVnode->status == VN_STATUS_DELETING) return; SDMStatusMsg *pStatus = param; @@ -247,8 +248,9 @@ static void vnodeBuildVloadMsg(char *pNode, void * param) { } static void vnodeCleanUp(SVnodeObj *pVnode) { - taosDeleteIntHash(tsDnodeVnodesHash, pVnode->vgId); + taosDeleteIntHash(tsDnodeVnodesHash, pVnode->vgId); + //syncStop(pVnode->sync); tsdbCloseRepo(pVnode->tsdb); walClose(pVnode->wal);