From 39e303b79b67c87688e9a7db80515fd9c456d5a8 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Wed, 19 Oct 2022 20:07:15 +0800 Subject: [PATCH] enh: show the restore status of vnode when show vgroups --- include/common/tmsg.h | 6 ++++-- source/common/src/tmsg.c | 12 ++++++++---- source/dnode/mnode/impl/inc/mndDef.h | 6 ++++-- source/dnode/mnode/impl/src/mndDb.c | 4 ++-- source/dnode/mnode/impl/src/mndDnode.c | 15 +++++++++------ source/dnode/mnode/impl/src/mndMain.c | 11 ++++++----- source/dnode/mnode/impl/src/mndMnode.c | 14 +++++++------- source/dnode/mnode/impl/src/mndVgroup.c | 24 ++++++++++++++---------- source/dnode/vnode/src/vnd/vnodeQuery.c | 1 + source/libs/monitor/src/monMsg.c | 12 ++++++++---- 10 files changed, 63 insertions(+), 42 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 42bdc3af16..3409071932 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1074,7 +1074,8 @@ typedef struct { typedef struct { int32_t vgId; - int32_t syncState; + int8_t syncState; + int8_t syncRestore; int64_t cacheUsage; int64_t numOfTables; int64_t numOfTimeSeries; @@ -1089,7 +1090,8 @@ typedef struct { } SVnodeLoad; typedef struct { - int32_t syncState; + int8_t syncState; + int8_t syncRestore; } SMnodeLoad; typedef struct { diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 1f0023278f..65541ca9cc 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -993,7 +993,8 @@ int32_t tSerializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { for (int32_t i = 0; i < vlen; ++i) { SVnodeLoad *pload = taosArrayGet(pReq->pVloads, i); if (tEncodeI32(&encoder, pload->vgId) < 0) return -1; - if (tEncodeI32(&encoder, pload->syncState) < 0) return -1; + if (tEncodeI8(&encoder, pload->syncState) < 0) return -1; + if (tEncodeI8(&encoder, pload->syncRestore) < 0) return -1; if (tEncodeI64(&encoder, pload->cacheUsage) < 0) return -1; if (tEncodeI64(&encoder, pload->numOfTables) < 0) return -1; if (tEncodeI64(&encoder, pload->numOfTimeSeries) < 0) return -1; @@ -1003,7 +1004,8 @@ int32_t tSerializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { } // mnode loads - if (tEncodeI32(&encoder, pReq->mload.syncState) < 0) return -1; + if (tEncodeI8(&encoder, pReq->mload.syncState) < 0) return -1; + if (tEncodeI8(&encoder, pReq->mload.syncRestore) < 0) return -1; if (tEncodeI32(&encoder, pReq->qload.dnodeId) < 0) return -1; if (tEncodeI64(&encoder, pReq->qload.numOfProcessedQuery) < 0) return -1; @@ -1063,7 +1065,8 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { for (int32_t i = 0; i < vlen; ++i) { SVnodeLoad vload = {0}; if (tDecodeI32(&decoder, &vload.vgId) < 0) return -1; - if (tDecodeI32(&decoder, &vload.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &vload.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &vload.syncRestore) < 0) return -1; if (tDecodeI64(&decoder, &vload.cacheUsage) < 0) return -1; if (tDecodeI64(&decoder, &vload.numOfTables) < 0) return -1; if (tDecodeI64(&decoder, &vload.numOfTimeSeries) < 0) return -1; @@ -1076,7 +1079,8 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) { } } - if (tDecodeI32(&decoder, &pReq->mload.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &pReq->mload.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &pReq->mload.syncRestore) < 0) return -1; if (tDecodeI32(&decoder, &pReq->qload.dnodeId) < 0) return -1; if (tDecodeI64(&decoder, &pReq->qload.numOfProcessedQuery) < 0) return -1; diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index 48eea7daea..2ee732e797 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -204,7 +204,8 @@ typedef struct { int32_t id; int64_t createdTime; int64_t updateTime; - ESyncState state; + ESyncState syncState; + bool syncRestore; int64_t stateStartTime; SDnodeObj* pDnode; } SMnodeObj; @@ -324,7 +325,8 @@ typedef struct { typedef struct { int32_t dnodeId; - ESyncState role; + ESyncState syncState; + bool syncRestore; } SVnodeGid; typedef struct { diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 3b31873857..654664269d 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -1157,7 +1157,7 @@ static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) { pEp->port = pDnode->port; } mndReleaseDnode(pMnode, pDnode); - if (pVgid->role == TAOS_SYNC_STATE_LEADER) { + if (pVgid->syncState == TAOS_SYNC_STATE_LEADER) { vgInfo.epSet.inUse = gid; } } @@ -1553,7 +1553,7 @@ bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb) { if (pVgroup->dbUid == pDb->uid && pVgroup->replica > 1) { bool hasLeader = false; for (int32_t i = 0; i < pVgroup->replica; ++i) { - if (pVgroup->vnodeGid[i].role == TAOS_SYNC_STATE_LEADER) { + if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER) { hasLeader = true; } } diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index fba1fd94d6..264b8d979b 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -361,10 +361,12 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { bool roleChanged = false; for (int32_t vg = 0; vg < pVgroup->replica; ++vg) { if (pVgroup->vnodeGid[vg].dnodeId == statusReq.dnodeId) { - if (pVgroup->vnodeGid[vg].role != pVload->syncState) { + if (pVgroup->vnodeGid[vg].syncState != pVload->syncState || + pVgroup->vnodeGid[vg].syncRestore != pVload->syncRestore) { + pVgroup->vnodeGid[vg].syncState = pVload->syncState; + pVgroup->vnodeGid[vg].syncRestore = pVload->syncRestore; roleChanged = true; } - pVgroup->vnodeGid[vg].role = pVload->syncState; break; } } @@ -378,10 +380,11 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { SMnodeObj *pObj = mndAcquireMnode(pMnode, pDnode->id); if (pObj != NULL) { - if (pObj->state != statusReq.mload.syncState) { - mInfo("dnode:%d, mnode syncstate from %s to %s", pObj->id, syncStr(pObj->state), - syncStr(statusReq.mload.syncState)); - pObj->state = statusReq.mload.syncState; + if (pObj->syncState != statusReq.mload.syncState || pObj->syncRestore != statusReq.mload.syncRestore) { + mInfo("dnode:%d, mnode syncState from %s to %s, restoreState from %d to %d", pObj->id, syncStr(pObj->syncState), + syncStr(statusReq.mload.syncState), pObj->syncRestore, statusReq.mload.syncRestore); + pObj->syncState = statusReq.mload.syncState; + pObj->syncRestore = statusReq.mload.syncRestore; pObj->stateStartTime = taosGetTimestampMs(); } mndReleaseMnode(pMnode, pObj); diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 4eb2e2978b..a6177fc69f 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -765,7 +765,7 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr // pClusterInfo->master_uptime = (ms - pObj->stateStartTime) / (86400000.0f); tstrncpy(desc.role, syncStr(TAOS_SYNC_STATE_LEADER), sizeof(desc.role)); } else { - tstrncpy(desc.role, syncStr(pObj->state), sizeof(desc.role)); + tstrncpy(desc.role, syncStr(pObj->syncState), sizeof(desc.role)); } taosArrayPush(pClusterInfo->mnodes, &desc); sdbRelease(pSdb, pObj); @@ -795,12 +795,12 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr SVnodeGid *pVgid = &pVgroup->vnodeGid[i]; SMonVnodeDesc *pVnDesc = &desc.vnodes[i]; pVnDesc->dnode_id = pVgid->dnodeId; - tstrncpy(pVnDesc->vnode_role, syncStr(pVgid->role), sizeof(pVnDesc->vnode_role)); - if (pVgid->role == TAOS_SYNC_STATE_LEADER) { + tstrncpy(pVnDesc->vnode_role, syncStr(pVgid->syncState), sizeof(pVnDesc->vnode_role)); + if (pVgid->syncState == TAOS_SYNC_STATE_LEADER) { tstrncpy(desc.status, "ready", sizeof(desc.status)); pClusterInfo->vgroups_alive++; } - if (pVgid->role != TAOS_SYNC_STATE_ERROR) { + if (pVgid->syncState != TAOS_SYNC_STATE_ERROR) { pClusterInfo->vnodes_alive++; } pClusterInfo->vnodes_total++; @@ -845,7 +845,8 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr int32_t mndGetLoad(SMnode *pMnode, SMnodeLoad *pLoad) { pLoad->syncState = syncGetMyRole(pMnode->syncMgmt.sync); - mTrace("mnode current syncstate is %s", syncStr(pLoad->syncState)); + pLoad->syncRestore = pMnode->restored; + mTrace("mnode current syncState is %s, syncRestore:%d", syncStr(pLoad->syncState), pLoad->syncRestore); return 0; } diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index f6ea81c565..1ab0ba8a16 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -187,7 +187,7 @@ static int32_t mndMnodeActionInsert(SSdb *pSdb, SMnodeObj *pObj) { return -1; } - pObj->state = TAOS_SYNC_STATE_ERROR; + pObj->syncState = TAOS_SYNC_STATE_ERROR; mndReloadSyncConfig(pSdb->pMnode); return 0; } @@ -604,19 +604,19 @@ static int32_t mndRetrieveMnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, b1, false); - const char *roles = "offline"; + char role[20] = "offline"; if (pObj->id == pMnode->selfDnodeId) { - roles = syncStr(TAOS_SYNC_STATE_LEADER); + snprintf(role, sizeof(role), "%s%s", syncStr(TAOS_SYNC_STATE_LEADER), pMnode->restored ? "" : "*"); } if (mndIsDnodeOnline(pObj->pDnode, curMs)) { - roles = syncStr(pObj->state); - if (pObj->state == TAOS_SYNC_STATE_LEADER && pObj->id != pMnode->selfDnodeId) { - roles = syncStr(TAOS_SYNC_STATE_ERROR); + tstrncpy(role, syncStr(pObj->syncState), sizeof(role)); + if (pObj->syncState == TAOS_SYNC_STATE_LEADER && pObj->id != pMnode->selfDnodeId) { + tstrncpy(role, syncStr(TAOS_SYNC_STATE_ERROR), sizeof(role)); mError("mnode:%d, is leader too", pObj->id); } } char b2[12 + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(b2, roles, pShow->pMeta->pSchemas[cols].bytes); + STR_WITH_MAXSIZE_TO_VARSTR(b2, role, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)b2, false); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index 4ab80b0a40..47245fa2c4 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -142,7 +142,7 @@ SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) { SVnodeGid *pVgid = &pVgroup->vnodeGid[i]; SDB_GET_INT32(pRaw, dataPos, &pVgid->dnodeId, _OVER) if (pVgroup->replica == 1) { - pVgid->role = TAOS_SYNC_STATE_LEADER; + pVgid->syncState = TAOS_SYNC_STATE_LEADER; } } SDB_GET_RESERVE(pRaw, dataPos, VGROUP_RESERVE_SIZE, _OVER) @@ -485,9 +485,9 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup pVgid->dnodeId = pDnode->id; if (pVgroup->replica == 1) { - pVgid->role = TAOS_SYNC_STATE_LEADER; + pVgid->syncState = TAOS_SYNC_STATE_LEADER; } else { - pVgid->role = TAOS_SYNC_STATE_FOLLOWER; + pVgid->syncState = TAOS_SYNC_STATE_FOLLOWER; } mInfo("db:%s, vgId:%d, vn:%d is alloced, memory:%" PRId64 ", dnode:%d avail:%" PRId64 " used:%" PRId64, @@ -587,7 +587,7 @@ SEpSet mndGetVgroupEpset(SMnode *pMnode, const SVgObj *pVgroup) { SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId); if (pDnode == NULL) continue; - if (pVgid->role == TAOS_SYNC_STATE_LEADER) { + if (pVgid->syncState == TAOS_SYNC_STATE_LEADER) { epset.inUse = epset.numOfEps; } @@ -681,8 +681,12 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p mndReleaseDnode(pMnode, pDnode); } - char buf1[20] = {0}; - const char *role = online ? syncStr(pVgroup->vnodeGid[i].role) : "offline"; + char buf1[20] = {0}; + char role[20] = "offline"; + if (online) { + bool show = (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER && !pVgroup->vnodeGid[i].syncRestore); + snprintf(role, sizeof(role), "%s%s", syncStr(pVgroup->vnodeGid[i].syncState), show ? "*" : ""); + } STR_WITH_MAXSIZE_TO_VARSTR(buf1, role, pShow->pMeta->pSchemas[cols].bytes); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); @@ -809,7 +813,7 @@ static int32_t mndRetrieveVnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->replica, false); char buf[20] = {0}; - STR_TO_VARSTR(buf, syncStr(pVgid->role)); + STR_TO_VARSTR(buf, syncStr(pVgid->syncState)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)buf, false); @@ -887,7 +891,7 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) { } pVgid->dnodeId = pDnode->id; - pVgid->role = TAOS_SYNC_STATE_ERROR; + pVgid->syncState = TAOS_SYNC_STATE_ERROR; mInfo("db:%s, vgId:%d, vn:%d is added, memory:%" PRId64 ", dnode:%d avail:%" PRId64 " used:%" PRId64, pVgroup->dbName, pVgroup->vgId, pVgroup->replica, vgMem, pVgid->dnodeId, pDnode->memAvail, pDnode->memUsed); @@ -1179,7 +1183,7 @@ static int32_t mndAddIncVgroupReplicaToTrans(SMnode *pMnode, STrans *pTrans, SDb SVnodeGid *pGid = &pVgroup->vnodeGid[pVgroup->replica]; pVgroup->replica++; pGid->dnodeId = newDnodeId; - pGid->role = TAOS_SYNC_STATE_ERROR; + pGid->syncState = TAOS_SYNC_STATE_ERROR; if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pGid, true) != 0) return -1; if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, pVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; @@ -1233,7 +1237,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, mInfo("vgId:%d, vgroup info before redistribute, replica:%d", newVg.vgId, newVg.replica); for (int32_t i = 0; i < newVg.replica; ++i) { mInfo("vgId:%d, vnode:%d dnode:%d role:%s", newVg.vgId, i, newVg.vnodeGid[i].dnodeId, - syncStr(newVg.vnodeGid[i].role)); + syncStr(newVg.vnodeGid[i].syncState)); } if (pNew1 != NULL && pOld1 != NULL) { diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c index 64df3aa1eb..6a18ae2fa1 100644 --- a/source/dnode/vnode/src/vnd/vnodeQuery.c +++ b/source/dnode/vnode/src/vnd/vnodeQuery.c @@ -385,6 +385,7 @@ _exit: int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) { pLoad->vgId = TD_VID(pVnode); pLoad->syncState = syncGetMyRole(pVnode->sync); + pLoad->syncRestore = pVnode->restored; pLoad->cacheUsage = tsdbCacheGetUsage(pVnode); pLoad->numOfTables = metaGetTbNum(pVnode->pMeta); pLoad->numOfTimeSeries = metaGetTimeSeriesNum(pVnode->pMeta); diff --git a/source/libs/monitor/src/monMsg.c b/source/libs/monitor/src/monMsg.c index bbee8b1166..dd371f874c 100644 --- a/source/libs/monitor/src/monMsg.c +++ b/source/libs/monitor/src/monMsg.c @@ -509,7 +509,8 @@ int32_t tSerializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo) for (int32_t i = 0; i < taosArrayGetSize(pInfo->pVloads); ++i) { SVnodeLoad *pLoad = taosArrayGet(pInfo->pVloads, i); if (tEncodeI32(&encoder, pLoad->vgId) < 0) return -1; - if (tEncodeI32(&encoder, pLoad->syncState) < 0) return -1; + if (tEncodeI8(&encoder, pLoad->syncState) < 0) return -1; + if (tEncodeI8(&encoder, pLoad->syncRestore) < 0) return -1; if (tEncodeI64(&encoder, pLoad->cacheUsage) < 0) return -1; if (tEncodeI64(&encoder, pLoad->numOfTables) < 0) return -1; if (tEncodeI64(&encoder, pLoad->numOfTimeSeries) < 0) return -1; @@ -544,7 +545,8 @@ int32_t tDeserializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInf for (int32_t i = 0; i < arraySize; ++i) { SVnodeLoad load = {0}; if (tDecodeI32(&decoder, &load.vgId) < 0) return -1; - if (tDecodeI32(&decoder, &load.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &load.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &load.syncRestore) < 0) return -1; if (tDecodeI64(&decoder, &load.cacheUsage) < 0) return -1; if (tDecodeI64(&decoder, &load.numOfTables) < 0) return -1; if (tDecodeI64(&decoder, &load.numOfTimeSeries) < 0) return -1; @@ -575,7 +577,8 @@ int32_t tSerializeSMonMloadInfo(void *buf, int32_t bufLen, SMonMloadInfo *pInfo) if (tStartEncode(&encoder) < 0) return -1; if (tEncodeI8(&encoder, pInfo->isMnode) < 0) return -1; - if (tEncodeI32(&encoder, pInfo->load.syncState) < 0) return -1; + if (tEncodeI8(&encoder, pInfo->load.syncState) < 0) return -1; + if (tEncodeI8(&encoder, pInfo->load.syncRestore) < 0) return -1; tEndEncode(&encoder); int32_t tlen = encoder.pos; @@ -589,7 +592,8 @@ int32_t tDeserializeSMonMloadInfo(void *buf, int32_t bufLen, SMonMloadInfo *pInf if (tStartDecode(&decoder) < 0) return -1; if (tDecodeI8(&decoder, &pInfo->isMnode) < 0) return -1; - if (tDecodeI32(&decoder, &pInfo->load.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &pInfo->load.syncState) < 0) return -1; + if (tDecodeI8(&decoder, &pInfo->load.syncRestore) < 0) return -1; tEndDecode(&decoder); tDecoderClear(&decoder); -- GitLab