diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index 83a35bfa94bc3a7c7c58404d559bdbb3f3c2b080..f550b1660fb071a9af04244f66fa628edea2ea79 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 fac342901aaadebaa825a206dba97c3af5be8e62..58d16ce1b38c082d212203d6291ad37260c12bfc 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 c9e062255b017a06e4a53ff65ef7d8f2dcbd7479..14960c5701b358259f695002808b876ce8b39fe4 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 84220c9cf8ce942f86c668320e831beab2927fe0..3ef4c6d45309a681d585f7e2a0cb2e48c35b4842 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 1189da92e2fd2ce8fef3a55f02047b578b0d7a6d..93c8276b14f3571f7743667f4536c5b8a375437b 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 ef7668c88e14440193a7dd05cf516586e3e79498..be7027caa738e0c991a3f5ce87e7a6aad325675e 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 1da811de13ae36b0ad0931062c6c239d433c33a0..ccbed350dc3b22ebbfde250ef2edfd0c887a1cde 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 0d821ee9e861c4bcf250842d059193c5e54d8a7f..f0c55449a3608de0140d617658890991592330fe 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 4c85351148cd7d8c148ef47381411343d44b1477..960863d665504e0c6d6e6b9cef54581f84c325b2 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 0000000000000000000000000000000000000000..7ba5e7b66e26a506f6204259a60e8acd69454b6c --- /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 027204af5bcd4fb5d9874086359a2ae52c11abc5..31b73dc89e971818c0b9c74c6121843f7962a883 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 0000000000000000000000000000000000000000..15685f99e9c3fea4e754d6d28593dec41c388c1b --- /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