From dbdfee4c4137b44dca4f05898e2e68a11fd70677 Mon Sep 17 00:00:00 2001 From: Benguang Zhao Date: Tue, 15 Aug 2023 17:10:54 +0800 Subject: [PATCH] enh: update SVnodeGid of vnode info in mndProcessStatusReq --- source/dnode/mnode/impl/inc/mndDef.h | 3 +++ source/dnode/mnode/impl/src/mndDnode.c | 17 ++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index c83a40c25d..5364267567 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -347,8 +347,11 @@ typedef struct { typedef struct { int32_t dnodeId; ESyncState syncState; + int64_t syncTerm; bool syncRestore; bool syncCanRead; + int64_t roleTimeMs; + int64_t startTimeMs; ESyncRole nodeRole; } SVnodeGid; diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 234e81a670..a52a788304 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -500,17 +500,22 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { for (int32_t vg = 0; vg < pVgroup->replica; ++vg) { SVnodeGid *pGid = &pVgroup->vnodeGid[vg]; if (pGid->dnodeId == statusReq.dnodeId) { - if (pGid->syncState != pVload->syncState || pGid->syncRestore != pVload->syncRestore || - pGid->syncCanRead != pVload->syncCanRead) { + roleChanged = + pGid->syncState != pVload->syncState || (pVload->syncTerm != -1 && pGid->syncTerm != pVload->syncTerm); + if (reboot || roleChanged || pGid->syncRestore != pVload->syncRestore || pGid->syncCanRead != pVload->syncCanRead) { mInfo( "vgId:%d, state changed by status msg, old state:%s restored:%d canRead:%d new state:%s restored:%d " "canRead:%d, dnode:%d", pVgroup->vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead, syncStr(pVload->syncState), pVload->syncRestore, pVload->syncCanRead, pDnode->id); pGid->syncState = pVload->syncState; + pGid->syncTerm = pVload->syncTerm; pGid->syncRestore = pVload->syncRestore; pGid->syncCanRead = pVload->syncCanRead; - roleChanged = true; + pGid->startTimeMs = (pVload->startTimeMs != 0) ? pVload->startTimeMs : statusReq.rebootTime; + } + if (roleChanged) { + pGid->roleTimeMs = (pVload->roleTimeMs != 0) ? pVload->roleTimeMs : taosGetTimestampMs(); } break; } @@ -533,17 +538,15 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) { if (pObj != NULL) { bool roleChanged = pObj->syncState != statusReq.mload.syncState || (statusReq.mload.syncTerm != -1 && pObj->syncTerm != statusReq.mload.syncTerm); - bool restoreChanged = pObj->syncRestore != statusReq.mload.syncRestore; - if (roleChanged || restoreChanged) { + if (roleChanged || pObj->syncRestore != statusReq.mload.syncRestore) { mInfo("dnode:%d, mnode syncState from %s to %s, restoreState from %d to %d, syncTerm from %" PRId64 " to %" PRId64, pObj->id, syncStr(pObj->syncState), syncStr(statusReq.mload.syncState), pObj->syncRestore, statusReq.mload.syncRestore, pObj->syncTerm, statusReq.mload.syncTerm); pObj->syncState = statusReq.mload.syncState; - pObj->syncRestore = statusReq.mload.syncRestore; pObj->syncTerm = statusReq.mload.syncTerm; + pObj->syncRestore = statusReq.mload.syncRestore; } - if (roleChanged) { pObj->roleTimeMs = (statusReq.mload.roleTimeMs != 0) ? statusReq.mload.roleTimeMs : taosGetTimestampMs(); }