diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 7be3af0c25..1f4a46e887 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -22,7 +22,7 @@ extern SConfig *tsCfg; -SMonVloadInfo vinfo = {0}; +SMonVloadInfo tsVinfo = {0}; static void dmUpdateDnodeCfg(SDnodeMgmt *pMgmt, SDnodeCfg *pCfg) { int32_t code = 0; @@ -165,7 +165,11 @@ void dmSendStatusReq(SDnodeMgmt *pMgmt) { (void)taosThreadRwlockUnlock(&pMgmt->pData->lock); dDebug("send status req to mnode, statusSeq:%d, begin to get vnode loads", pMgmt->statusSeq); - req.pVloads = vinfo.pVloads; + (void)taosThreadRwlockRdlock(&pMgmt->pData->statusInfolock); + req.pVloads = taosArrayDup(tsVinfo.pVloads, NULL); + taosArrayDestroy(tsVinfo.pVloads); + tsVinfo.pVloads = NULL; + (void)taosThreadRwlockUnlock(&pMgmt->pData->statusInfolock); dDebug("send status req to mnode, statusSeq:%d, begin to get mnode loads", pMgmt->statusSeq); SMonMloadInfo minfo = {0}; @@ -232,8 +236,13 @@ void dmSendStatusReq(SDnodeMgmt *pMgmt) { } void dmUpdateStatusInfo(SDnodeMgmt *pMgmt) { + SMonVloadInfo vinfo = {0}; dDebug("begin to get vnode loads"); (*pMgmt->getVnodeLoadsFp)(&vinfo); + (void)taosThreadRwlockWrlock(&pMgmt->pData->statusInfolock); + if (tsVinfo.pVloads == NULL) tsVinfo.pVloads = taosArrayDup(vinfo.pVloads, NULL); + taosArrayDestroy(vinfo.pVloads); + (void)taosThreadRwlockWrlock(&pMgmt->pData->statusInfolock); } void dmSendNotifyReq(SDnodeMgmt *pMgmt, SNotifyReq *pReq) { diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c index 277dd2e02a..4fc618379c 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c @@ -214,6 +214,7 @@ int32_t dmInitVars(SDnode *pDnode) { } (void)taosThreadRwlockInit(&pData->lock, NULL); + (void)taosThreadRwlockInit(&pData->statusInfolock, NULL); (void)taosThreadMutexInit(&pDnode->mutex, NULL); return 0; } diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h index b5842acbad..2374c45c2d 100644 --- a/source/dnode/mgmt/node_util/inc/dmUtil.h +++ b/source/dnode/mgmt/node_util/inc/dmUtil.h @@ -144,6 +144,7 @@ typedef struct { char machineId[TSDB_MACHINE_ID_LEN + 1]; EEncryptAlgor encryptAlgorigthm; EEncryptScope encryptScope; + TdThreadRwlock statusInfolock; } SDnodeData; typedef struct {