diff --git a/src/mnode/inc/mnodeDef.h b/src/mnode/inc/mnodeDef.h index e974251d2ef024cb5977378d31c26c31fa718dcd..5521267841f06d139ef8b4ac7a0c8883774e667f 100644 --- a/src/mnode/inc/mnodeDef.h +++ b/src/mnode/inc/mnodeDef.h @@ -80,6 +80,7 @@ typedef struct SMnodeObj { int8_t updateEnd[4]; int32_t refCount; int8_t role; + int64_t roleTime; int8_t reserved2[3]; } SMnodeObj; diff --git a/src/mnode/src/mnodeMnode.c b/src/mnode/src/mnodeMnode.c index bccad221574d49f770bebb61822609c2138f258e..13dd06bcac733694475eee7be718afdc6c17466e 100644 --- a/src/mnode/src/mnodeMnode.c +++ b/src/mnode/src/mnodeMnode.c @@ -122,6 +122,7 @@ static int32_t mnodeMnodeActionRestored() { void *pIter = mnodeGetNextMnode(NULL, &pMnode); if (pMnode != NULL) { pMnode->role = TAOS_SYNC_ROLE_MASTER; + pMnode->roleTime = taosGetTimestampMs(); mnodeDecMnodeRef(pMnode); } mnodeCancelGetNextMnode(pIter); @@ -496,7 +497,13 @@ static int32_t mnodeGetMnodeMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pC strcpy(pSchema[cols].name, "role"); pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; - + + pShow->bytes[cols] = 8; + pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP; + strcpy(pSchema[cols].name, "role_time"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + pShow->bytes[cols] = 8; pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP; strcpy(pSchema[cols].name, "create_time"); @@ -552,6 +559,10 @@ static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, vo STR_WITH_MAXSIZE_TO_VARSTR(pWrite, roles, pShow->bytes[cols]); cols++; + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(int64_t *)pWrite = pMnode->roleTime; + cols++; + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; *(int64_t *)pWrite = pMnode->createdTime; cols++; diff --git a/src/mnode/src/mnodeSdb.c b/src/mnode/src/mnodeSdb.c index 7644f4d7339251037fbe244b17e5af1fa9af0484..1e3057f27021e8874b96c0116dd0319fcd999da7 100644 --- a/src/mnode/src/mnodeSdb.c +++ b/src/mnode/src/mnodeSdb.c @@ -227,6 +227,7 @@ void sdbUpdateMnodeRoles() { SMnodeObj *pMnode = mnodeGetMnode(roles.nodeId[i]); if (pMnode != NULL) { if (pMnode->role != roles.role[i]) { + pMnode->roleTime = taosGetTimestampMs(); bnNotify(); } diff --git a/tests/pytest/client/client.py b/tests/pytest/client/client.py index b40511094b3bf76825c2572c8ad747807a3f2d65..81a02482edb510d806a3442874041c8a138a6ea7 100644 --- a/tests/pytest/client/client.py +++ b/tests/pytest/client/client.py @@ -16,6 +16,7 @@ from util.log import * from util.cases import * from util.sql import * +from datetime import timedelta class TDTestCase: def init(self, conn, logSql): @@ -41,6 +42,16 @@ class TDTestCase: ret = tdSql.query('show mnodes') tdSql.checkRows(1) + tdSql.checkData(0, 2, "master") + + role_time = tdSql.getData(0, 3) + create_time = tdSql.getData(0, 4) + time_delta = timedelta(milliseconds=100) + + if create_time-time_delta < role_time < create_time+time_delta: + tdLog.info("role_time {} and create_time {} expected within range".format(role_time, create_time)) + else: + tdLog.exit("role_time {} and create_time {} not expected within range".format(role_time, create_time)) ret = tdSql.query('show vgroups') tdSql.checkRows(0)