From ab9fac496b7632eb62d302b2f4713b81ed1840b9 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 22 May 2020 19:13:38 +0800 Subject: [PATCH] [TD-388] drop dnode in community version --- src/inc/taosmsg.h | 2 + src/mnode/inc/mgmtDef.h | 1 - src/mnode/inc/mgmtDnode.h | 1 + src/mnode/inc/mgmtTable.h | 1 + src/mnode/src/mgmtDnode.c | 21 ++++- src/mnode/src/mgmtSdb.c | 8 +- src/mnode/src/mgmtShell.c | 2 + src/mnode/src/mgmtTable.c | 30 ++++++- src/mnode/src/mgmtVgroup.c | 6 +- tests/script/general/db/dropdnodes.sim | 104 +++++++++++++++++++++++++ tests/script/jenkins/basic.txt | 1 + tests/script/jenkins/sync.txt | 23 ++++++ 12 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 tests/script/general/db/dropdnodes.sim create mode 100644 tests/script/jenkins/sync.txt diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index 83a35bfa94..f550b1660f 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -725,6 +725,8 @@ typedef struct { typedef struct { uint32_t queryId; uint32_t streamId; + uint32_t totalDnodes; + uint32_t onlineDnodes; int8_t killConnection; SRpcIpSet ipList; } SCMHeartBeatRsp; diff --git a/src/mnode/inc/mgmtDef.h b/src/mnode/inc/mgmtDef.h index fac342901a..58d16ce1b3 100644 --- a/src/mnode/inc/mgmtDef.h +++ b/src/mnode/inc/mgmtDef.h @@ -66,7 +66,6 @@ typedef struct SMnodeObj { SDnodeObj *pDnode; } SMnodeObj; -// todo use dynamic length string typedef struct { char *tableId; int8_t type; diff --git a/src/mnode/inc/mgmtDnode.h b/src/mnode/inc/mgmtDnode.h index c9e062255b..14960c5701 100644 --- a/src/mnode/inc/mgmtDnode.h +++ b/src/mnode/inc/mgmtDnode.h @@ -34,6 +34,7 @@ char* mgmtGetDnodeStatusStr(int32_t dnodeStatus); void mgmtMonitorDnodeModule(); int32_t mgmtGetDnodesNum(); +int32_t mgmtGetOnlinDnodesNum(); void * mgmtGetNextDnode(void *pIter, SDnodeObj **pDnode); void mgmtIncDnodeRef(SDnodeObj *pDnode); void mgmtDecDnodeRef(SDnodeObj *pDnode); diff --git a/src/mnode/inc/mgmtTable.h b/src/mnode/inc/mgmtTable.h index 84220c9cf8..3ef4c6d453 100644 --- a/src/mnode/inc/mgmtTable.h +++ b/src/mnode/inc/mgmtTable.h @@ -31,6 +31,7 @@ void * mgmtGetNextChildTable(void *pIter, SChildTableObj **pTable); void * mgmtGetNextSuperTable(void *pIter, SSuperTableObj **pTable); void mgmtDropAllChildTables(SDbObj *pDropDb); void mgmtDropAllSuperTables(SDbObj *pDropDb); +void mgmtDropAllChildTablesInVgroups(SVgObj *pVgroup); #ifdef __cplusplus } diff --git a/src/mnode/src/mgmtDnode.c b/src/mnode/src/mgmtDnode.c index 1189da92e2..93c8276b14 100644 --- a/src/mnode/src/mgmtDnode.c +++ b/src/mnode/src/mgmtDnode.c @@ -74,7 +74,6 @@ static int32_t mgmtDnodeActionDelete(SSdbOper *pOper) { SDnodeObj *pDnode = pOper->pObj; #ifndef _SYNC - //TODO: drop dnode local mgmtDropAllDnodeVgroups(pDnode); #endif mgmtDropMnodeLocal(pDnode->dnodeId); @@ -179,6 +178,23 @@ int32_t mgmtGetDnodesNum() { return sdbGetNumOfRows(tsDnodeSdb); } +int32_t mgmtGetOnlinDnodesNum(char *ep) { + SDnodeObj *pDnode = NULL; + void * pIter = NULL; + int32_t onlineDnodes = 0; + + while (1) { + pIter = mgmtGetNextDnode(pIter, &pDnode); + if (pDnode == NULL) break; + if (pDnode->status != TAOS_DN_STATUS_OFFLINE) onlineDnodes++; + mgmtDecDnodeRef(pDnode); + } + + sdbFreeIter(pIter); + + return onlineDnodes; +} + void *mgmtGetDnode(int32_t dnodeId) { return sdbGetRow(tsDnodeSdb, &dnodeId); } @@ -397,7 +413,6 @@ static int32_t mgmtCreateDnode(char *ep) { return code; } -//TODO drop others tables int32_t mgmtDropDnode(SDnodeObj *pDnode) { SSdbOper oper = { .type = SDB_OPER_GLOBAL, @@ -410,7 +425,7 @@ int32_t mgmtDropDnode(SDnodeObj *pDnode) { code = TSDB_CODE_SDB_ERROR; } - mLPrint("dnode:%d is dropped from cluster, result:%s", pDnode->dnodeId, tstrerror(code)); + mLPrint("dnode:%d, is dropped from cluster, result:%s", pDnode->dnodeId, tstrerror(code)); return code; } diff --git a/src/mnode/src/mgmtSdb.c b/src/mnode/src/mgmtSdb.c index ef7668c88e..be7027caa7 100644 --- a/src/mnode/src/mgmtSdb.c +++ b/src/mnode/src/mgmtSdb.c @@ -353,8 +353,8 @@ void sdbIncRef(void *handle, void *pObj) { SSdbTable *pTable = handle; int32_t * pRefCount = (int32_t *)(pObj + pTable->refCountPos); atomic_add_fetch_32(pRefCount, 1); - if (0 && (pTable->tableId == SDB_TABLE_MNODE || pTable->tableId == SDB_TABLE_DNODE)) { - sdbTrace("table:%s, add ref to record:%s:%d", pTable->tableName, sdbGetKeyStrFromObj(pTable, pObj), *pRefCount); + if (1 && (pTable->tableId == SDB_TABLE_MNODE || pTable->tableId == SDB_TABLE_DNODE)) { + sdbTrace("add ref to table:%s record:%s:%d", pTable->tableName, sdbGetKeyStrFromObj(pTable, pObj), *pRefCount); } } @@ -364,8 +364,8 @@ void sdbDecRef(void *handle, void *pObj) { SSdbTable *pTable = handle; int32_t * pRefCount = (int32_t *)(pObj + pTable->refCountPos); int32_t refCount = atomic_sub_fetch_32(pRefCount, 1); - if (0 && (pTable->tableId == SDB_TABLE_MNODE || pTable->tableId == SDB_TABLE_DNODE)) { - sdbTrace("table:%s, def ref of record:%s:%d", pTable->tableName, sdbGetKeyStrFromObj(pTable, pObj), *pRefCount); + if (1 && (pTable->tableId == SDB_TABLE_MNODE || pTable->tableId == SDB_TABLE_DNODE)) { + sdbTrace("def ref of table:%s record:%s:%d", pTable->tableName, sdbGetKeyStrFromObj(pTable, pObj), *pRefCount); } int8_t *updateEnd = pObj + pTable->refCountPos - 1; diff --git a/src/mnode/src/mgmtShell.c b/src/mnode/src/mgmtShell.c index 1da811de13..ccbed350dc 100644 --- a/src/mnode/src/mgmtShell.c +++ b/src/mnode/src/mgmtShell.c @@ -325,6 +325,8 @@ static void mgmtProcessHeartBeatMsg(SQueuedMsg *pMsg) { return; } + pHBRsp->onlineDnodes = htonl(mgmtGetOnlinDnodesNum()); + pHBRsp->totalDnodes = htonl(mgmtGetDnodesNum()); mgmtGetMnodeIpSet(&pHBRsp->ipList); /* diff --git a/src/mnode/src/mgmtTable.c b/src/mnode/src/mgmtTable.c index 0d821ee9e8..f0c55449a3 100644 --- a/src/mnode/src/mgmtTable.c +++ b/src/mnode/src/mgmtTable.c @@ -1305,7 +1305,7 @@ static void mgmtProcessSuperTableVgroupMsg(SQueuedMsg *pMsg) { if (pDnode == NULL) break; strncpy(pVgroupInfo->vgroups[vgSize].ipAddr[vn].fqdn, pDnode->dnodeFqdn, tListLen(pDnode->dnodeFqdn)); - pVgroupInfo->vgroups[vgSize].ipAddr[vn].port = htons(tsDnodeShellPort); + pVgroupInfo->vgroups[vgSize].ipAddr[vn].port = htons(pDnode->dnodePort); pVgroupInfo->vgroups[vgSize].numOfIps++; } @@ -1787,6 +1787,34 @@ static void mgmtGetChildTableMeta(SQueuedMsg *pMsg) { rpcSendResponse(&rpcRsp); } +void mgmtDropAllChildTablesInVgroups(SVgObj *pVgroup) { + void * pIter = NULL; + int32_t numOfTables = 0; + SChildTableObj *pTable = NULL; + + mPrint("vgId:%d, all child tables will be dropped from sdb", pVgroup->vgId); + + while (1) { + pIter = mgmtGetNextChildTable(pIter, &pTable); + if (pTable == NULL) break; + + if (pTable->vgId == pVgroup->vgId) { + SSdbOper oper = { + .type = SDB_OPER_LOCAL, + .table = tsChildTableSdb, + .pObj = pTable, + }; + sdbDeleteRow(&oper); + numOfTables++; + } + mgmtDecTableRef(pTable); + } + + sdbFreeIter(pIter); + + mPrint("vgId:%d, all child tables is dropped from sdb", pVgroup->vgId); +} + void mgmtDropAllChildTables(SDbObj *pDropDb) { void * pIter = NULL; int32_t numOfTables = 0; diff --git a/src/mnode/src/mgmtVgroup.c b/src/mnode/src/mgmtVgroup.c index 4c85351148..960863d665 100644 --- a/src/mnode/src/mgmtVgroup.c +++ b/src/mnode/src/mgmtVgroup.c @@ -747,11 +747,14 @@ void mgmtDropAllDnodeVgroups(SDnodeObj *pDropDnode) { SVgObj *pVgroup = NULL; int32_t numOfVgroups = 0; + mPrint("dnode:%d, all vgroups will be dropped from sdb", pDropDnode->dnodeId); + while (1) { pIter = mgmtGetNextVgroup(pIter, &pVgroup); if (pVgroup == NULL) break; if (pVgroup->vnodeGid[0].dnodeId == pDropDnode->dnodeId) { + mgmtDropAllChildTablesInVgroups(pVgroup); SSdbOper oper = { .type = SDB_OPER_LOCAL, .table = tsVgroupSdb, @@ -759,12 +762,13 @@ void mgmtDropAllDnodeVgroups(SDnodeObj *pDropDnode) { }; sdbDeleteRow(&oper); numOfVgroups++; - continue; } mgmtDecVgroupRef(pVgroup); } sdbFreeIter(pIter); + + mPrint("dnode:%d, all vgroups is dropped from sdb", pDropDnode->dnodeId); } void mgmtUpdateAllDbVgroups(SDbObj *pAlterDb) { diff --git a/tests/script/general/db/dropdnodes.sim b/tests/script/general/db/dropdnodes.sim new file mode 100644 index 0000000000..7ba5e7b66e --- /dev/null +++ b/tests/script/general/db/dropdnodes.sim @@ -0,0 +1,104 @@ +system sh/stop_dnodes.sh + +system sh/deploy.sh -n dnode1 -i 1 +system sh/cfg.sh -n dnode1 -c walLevel -v 2 +system sh/deploy.sh -n dnode2 -i 2 +system sh/cfg.sh -n dnode1 -c walLevel -v 2 + +print ========== prepare data +system sh/exec.sh -n dnode1 -s start +system sh/exec.sh -n dnode2 -s start + +sleep 3000 +sql connect + +sql create dnode $hostname2 +sleep 2000 + +sql create database db maxTables 4 +sql use db + +print ========== step1 +sql create table mt (ts timestamp, tbcol int) TAGS(tgcol int) +sql create table db.t1 using db.mt tags(1) +sql create table db.t2 using db.mt tags(2) +sql create table db.t3 using db.mt tags(3) +sql create table db.t4 using db.mt tags(4) +sql create table db.t5 using db.mt tags(5) +sql create table db.t6 using db.mt tags(6) +sql create table db.t7 using db.mt tags(7) +sql create table db.t8 using db.mt tags(8) +sql create table db.t9 using db.mt tags(9) +sql create table db.t10 using db.mt tags(10) +sql create table db.t11 using db.mt tags(11) +sql create table db.t12 using db.mt tags(12) +sql create table db.t13 using db.mt tags(13) +sql create table db.t14 using db.mt tags(14) +sql create table db.t15 using db.mt tags(15) +sql create table db.t16 using db.mt tags(16) + +sql insert into db.t1 values(now, 1) +sql insert into db.t2 values(now, 1) +sql insert into db.t3 values(now, 1) +sql insert into db.t4 values(now, 1) +sql insert into db.t5 values(now, 1) +sql insert into db.t6 values(now, 1) +sql insert into db.t7 values(now, 1) +sql insert into db.t8 values(now, 1) +sql insert into db.t9 values(now, 1) +sql insert into db.t10 values(now, 1) +sql insert into db.t11 values(now, 1) +sql insert into db.t12 values(now, 1) +sql insert into db.t13 values(now, 1) +sql insert into db.t14 values(now, 1) +sql insert into db.t15 values(now, 1) +sql insert into db.t16 values(now, 1) + +print ========== step2 +sql show tables +print $rows +if $rows != 16 then + return -1 +endi + +sql select * from mt +print $rows +if $rows != 16 then + return -1 +endi + +print ========== step3 + +system sh/exec.sh -n dnode2 -s stop -x SIGINT +sleep 500 +sql drop dnode $hostname2 +sleep 2000 + +print ========== step3 + +sql show tables +print $rows +if $rows != 8 then + return -1 +endi + +sql select * from mt +print $rows +if $rows != 8 then + return -1 +endi + +sql select * from db.t5 +if $rows != 1 then + return -1 +endi + +sql select * from db.t13 +if $rows != 1 then + return -1 +endi + +sql_error select * from db.t1 +sql_error select * from db.t9 + +system sh/exec.sh -n dnode1 -s stop -x SIGINT \ No newline at end of file diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt index 027204af5b..31b73dc89e 100644 --- a/tests/script/jenkins/basic.txt +++ b/tests/script/jenkins/basic.txt @@ -61,6 +61,7 @@ cd ../../../debug; make ./test.sh -f general/db/delete_writing1.sim ./test.sh -f general/db/delete_writing2.sim ./test.sh -f general/db/delete.sim +./test.sh -f general/db/dropdnodes.sim ./test.sh -f general/db/len.sim ./test.sh -f general/db/repeat.sim ./test.sh -f general/db/tables.sim diff --git a/tests/script/jenkins/sync.txt b/tests/script/jenkins/sync.txt new file mode 100644 index 0000000000..15685f99e9 --- /dev/null +++ b/tests/script/jenkins/sync.txt @@ -0,0 +1,23 @@ +cd ../../debug; cmake .. +cd ../../debug; make +cd ../../../debug; cmake .. +cd ../../../debug; make + +./test.sh -u -f unique/cluster/balance1.sim +./test.sh -u -f unique/cluster/balance2.sim +./test.sh -u -f unique/cluster/balance3.sim +./test.sh -u -f unique/cluster/cache.sim + +./test.sh -u -f unique/dnode/balance1.sim +./test.sh -u -f unique/dnode/balance2.sim +./test.sh -u -f unique/dnode/balance3.sim +./test.sh -u -f unique/dnode/balancex.sim + +./test.sh -u -f unique/mnode/mgmt22.sim +./test.sh -u -f unique/mnode/mgmt23.sim +./test.sh -u -f unique/mnode/mgmt24.sim +./test.sh -u -f unique/mnode/mgmt25.sim +./test.sh -u -f unique/mnode/mgmt26.sim +./test.sh -u -f unique/mnode/mgmt33.sim +./test.sh -u -f unique/mnode/mgmt34.sim +./test.sh -u -f unique/mnode/mgmtr2.sim -- GitLab