From f14b13816c3552700616aafc24f6d01fa9fa00d0 Mon Sep 17 00:00:00 2001 From: slguan Date: Tue, 7 Apr 2020 12:20:17 +0800 Subject: [PATCH] [TD-116] add vnodeAccquire vnode --- src/dnode/src/dnodeRead.c | 12 ++++++------ src/inc/vnode.h | 3 ++- src/vnode/main/src/vnodeMain.c | 9 ++++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/dnode/src/dnodeRead.c b/src/dnode/src/dnodeRead.c index 31296e0201..7a57b0a2c0 100644 --- a/src/dnode/src/dnodeRead.c +++ b/src/dnode/src/dnodeRead.c @@ -82,16 +82,17 @@ void dnodeRead(SRpcMsg *pMsg) { dTrace("dnode %s msg incoming, thandle:%p", taosMsg[pMsg->msgType], pMsg->handle); - if (pMsg->msgType == TSDB_MSG_TYPE_RETRIEVE) { - queuedMsgNum = 0; - } - while (leftLen > 0) { SMsgHead *pHead = (SMsgHead *) pCont; pHead->vgId = htonl(pHead->vgId); pHead->contLen = htonl(pHead->contLen); - pVnode = vnodeGetVnode(pHead->vgId); + if (pMsg->msgType == TSDB_MSG_TYPE_RETRIEVE) { + pVnode = vnodeGetVnode(pHead->vgId); + } else { + pVnode = vnodeAccquireVnode(pHead->vgId); + } + if (pVnode == NULL) { leftLen -= pHead->contLen; pCont -= pHead->contLen; @@ -261,7 +262,6 @@ static void dnodeProcessQueryMsg(void *pVnode, SReadMsg *pMsg) { rpcSendResponse(&rpcRsp); dTrace("dnode query msg disposed, thandle:%p", pMsg->rpcMsg.handle); - vnodeRelease(pVnode); } else { pQInfo = pMsg->pCont; } diff --git a/src/inc/vnode.h b/src/inc/vnode.h index b459c2c562..9861d1a2ff 100644 --- a/src/inc/vnode.h +++ b/src/inc/vnode.h @@ -31,7 +31,8 @@ int32_t vnodeOpen(int32_t vgId, char *rootDir); int32_t vnodeClose(int32_t vgId); void vnodeRelease(void *pVnode); -void* vnodeGetVnode(int32_t vgId); +void* vnodeAccquireVnode(int32_t vgId); // add refcount +void* vnodeGetVnode(int32_t vgId); // keep refcount unchanged void* vnodeGetRqueue(void *); void* vnodeGetWqueue(int32_t vgId); diff --git a/src/vnode/main/src/vnodeMain.c b/src/vnode/main/src/vnodeMain.c index 6dc7fd00a9..d0352da3b1 100644 --- a/src/vnode/main/src/vnodeMain.c +++ b/src/vnode/main/src/vnodeMain.c @@ -219,6 +219,13 @@ void *vnodeGetVnode(int32_t vgId) { return NULL; } + return pVnode; +} + +void *vnodeAccquireVnode(int32_t vgId) { + SVnodeObj *pVnode = vnodeGetVnode(vgId); + if (pVnode == NULL) return pVnode; + atomic_add_fetch_32(&pVnode->refCount, 1); dTrace("pVnode:%p vgId:%d, get vnode, refCount:%d", pVnode, pVnode->vgId, pVnode->refCount); @@ -230,7 +237,7 @@ void *vnodeGetRqueue(void *pVnode) { } void *vnodeGetWqueue(int32_t vgId) { - SVnodeObj *pVnode = vnodeGetVnode(vgId); + SVnodeObj *pVnode = vnodeAccquireVnode(vgId); if (pVnode == NULL) return NULL; return pVnode->wqueue; } -- GitLab