From e15b65fb52c0ba94de99591c3b6cf697a44493ef Mon Sep 17 00:00:00 2001 From: Simon Guan Date: Sun, 4 May 2025 22:31:35 +0800 Subject: [PATCH] test: migrate cases (#30972) --- .../test_dnode_alter_debugflag.py | 2 +- .../02-Mnode/test_mnode_basic1.py | 84 ++++++++++ .../02-Mnode/test_mnode_basic2.py | 85 ++++++++++ .../02-Mnode/test_mnode_basic3.py | 76 +++++++++ .../02-Mnode/test_mnode_basic4.py | 63 ++++++++ .../02-Mnode/test_mnode_basic5.py | 131 +++++++++++++++ .../02-Mnode/test_mnode_basic6.py | 113 +++++++++++++ test/ci/cases.task | 10 +- .../utils/clusterCommonCheck.py | 153 ++++++++---------- test/new_test_framework/utils/server/dnode.py | 15 +- test/new_test_framework/utils/sql.py | 45 +++++- 11 files changed, 678 insertions(+), 99 deletions(-) rename test/cases/19-ManageNodes/{ => 01-Dnode}/test_dnode_alter_debugflag.py (99%) create mode 100644 test/cases/19-ManageNodes/02-Mnode/test_mnode_basic1.py create mode 100644 test/cases/19-ManageNodes/02-Mnode/test_mnode_basic2.py create mode 100644 test/cases/19-ManageNodes/02-Mnode/test_mnode_basic3.py create mode 100644 test/cases/19-ManageNodes/02-Mnode/test_mnode_basic4.py create mode 100644 test/cases/19-ManageNodes/02-Mnode/test_mnode_basic5.py create mode 100644 test/cases/19-ManageNodes/02-Mnode/test_mnode_basic6.py diff --git a/test/cases/19-ManageNodes/test_dnode_alter_debugflag.py b/test/cases/19-ManageNodes/01-Dnode/test_dnode_alter_debugflag.py similarity index 99% rename from test/cases/19-ManageNodes/test_dnode_alter_debugflag.py rename to test/cases/19-ManageNodes/01-Dnode/test_dnode_alter_debugflag.py index abb98c7c503..4b6b2820a93 100644 --- a/test/cases/19-ManageNodes/test_dnode_alter_debugflag.py +++ b/test/cases/19-ManageNodes/01-Dnode/test_dnode_alter_debugflag.py @@ -14,7 +14,7 @@ class TestDnodeAlterDebugFlag: 3. 修改不在线 dnode 参数(报错) Catalog: - - Tables + - ManageNodes:Dnode Since: v3.0.0.0 diff --git a/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic1.py b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic1.py new file mode 100644 index 00000000000..c520815ac35 --- /dev/null +++ b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic1.py @@ -0,0 +1,84 @@ +import time +from new_test_framework.utils import tdLog, tdSql, sc, clusterComCheck + + +class TestMnodeBasic1: + + def setup_class(cls): + tdLog.debug(f"start to execute {__file__}") + + def test_mnode_basic1(self): + """mnode basic 1 + + 1. - + + Catalog: + - ManageNodes:Mnode + + Since: v3.0.0.0 + + Labels: common,ci + + Jira: None + + History: + - 2025-5-5 Simon Guan Migrated to new test framework, from tsim/mnode/basic1.sim + + """ + + clusterComCheck.checkDnodes(2) + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(1) + tdSql.checkKeyData(1, 0, 1) + tdSql.checkKeyData(1, 2, "leader") + + tdSql.error(f"create mnode on dnode 1") + tdSql.error(f"drop mnode on dnode 1") + + tdLog.info(f"=============== create mnode 2") + tdSql.execute(f"create mnode on dnode 2") + + tdLog.info(f"=============== create mnode 2 finished") + + checkFailed = True + for i in range(20): + time.sleep(1) + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(2) + tdSql.checkKeyData(1, 0, 1) + tdSql.checkKeyData(1, 2, "leader") + tdSql.checkKeyData(2, 0, 2) + if tdSql.expectKeyData(2, 2, "follower"): + checkFailed = False + break + if checkFailed: + tdSql.checkAssert(False) + + tdLog.info(f"============ drop mnode 2") + tdSql.execute(f"drop mnode on dnode 2") + + tdLog.info(f"============ drop mnode 2 finished") + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(1) + tdSql.checkKeyData(1, 0, 1) + tdSql.checkKeyData(1, 2, "leader") + + tdSql.error(f"drop mnode on dnode 2") + + tdLog.info(f"=============== create mnodes") + tdSql.execute(f"create mnode on dnode 2") + + tdLog.info(f"=============== create mnode 2 finished") + checkFailed = True + for i in range(20): + time.sleep(1) + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(2) + tdSql.checkKeyData(1, 0, 1) + tdSql.checkKeyData(1, 2, "leader") + tdSql.checkKeyData(2, 0, 2) + if tdSql.expectKeyData(2, 2, "follower"): + checkFailed = False + break + if checkFailed: + tdSql.checkAssert(False) diff --git a/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic2.py b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic2.py new file mode 100644 index 00000000000..e7d58ad6f0f --- /dev/null +++ b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic2.py @@ -0,0 +1,85 @@ +import time +from new_test_framework.utils import tdLog, tdSql, sc, clusterComCheck + + +class TestMnodeBasic2: + + def setup_class(cls): + tdLog.debug(f"start to execute {__file__}") + + def test_mnode_basic2(self): + """mnode basic 2 + + 1. - + + Catalog: + - ManageNodes:Mnode + + Since: v3.0.0.0 + + Labels: common,ci + + Jira: None + + History: + - 2025-5-5 Simon Guan Migrated to new test framework, from tsim/mnode/basic2.sim + + """ + + clusterComCheck.checkDnodes(2) + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(1) + tdSql.checkKeyData(1, 0, 1) + tdSql.checkKeyData(1, 2, "leader") + + tdLog.info(f"=============== create mnode 2") + tdSql.execute(f"create mnode on dnode 2") + + checkFailed = True + for i in range(20): + time.sleep(1) + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(2) + tdSql.checkKeyData(1, 0, 1) + tdSql.checkKeyData(1, 2, "leader") + tdSql.checkKeyData(2, 0, 2) + if tdSql.expectKeyData(2, 2, "follower"): + checkFailed = False + break + if checkFailed: + tdSql.checkAssert(False) + + tdLog.info(f"=============== create user") + tdSql.execute(f"create user user1 PASS 'user1@#xy'") + tdSql.query(f"select * from information_schema.ins_users") + tdSql.checkRows(2) + + tdSql.execute(f"create database db") + tdSql.query(f"select * from information_schema.ins_databases") + tdSql.checkRows(3) + + tdLog.info(f"=============== restart") + sc.dnodeStop(1) + sc.dnodeStop(2) + sc.dnodeStart(1) + sc.dnodeStart(2) + clusterComCheck.checkDnodes(2) + + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(2) + + tdSql.query(f"select * from information_schema.ins_users") + tdSql.checkRows(2) + + tdSql.query(f"select * from information_schema.ins_databases") + tdSql.checkRows(3) + + tdLog.info(f"=============== insert data") + tdSql.execute( + f'create table db.stb (ts timestamp, c1 int, c2 binary(4)) tags(t1 int, t2 float, t3 binary(16)) comment "abd"' + ) + tdSql.execute(f'create table db.ctb using db.stb tags(101, 102, "103")') + tdSql.execute(f'insert into db.ctb values(now, 1, "2")') + + tdSql.query(f"select * from db.ctb") + tdSql.checkRows(1) diff --git a/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic3.py b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic3.py new file mode 100644 index 00000000000..618b1e9e4d1 --- /dev/null +++ b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic3.py @@ -0,0 +1,76 @@ +import time +from new_test_framework.utils import tdLog, tdSql, sc, clusterComCheck + + +class TestMnodeBasic3: + + def setup_class(cls): + tdLog.debug(f"start to execute {__file__}") + + def test_mnode_basic3(self): + """mnode basic 3 + + 1. - + + Catalog: + - ManageNodes:Mnode + + Since: v3.0.0.0 + + Labels: common,ci + + Jira: None + + History: + - 2025-5-5 Simon Guan Migrated to new test framework, from tsim/mnode/basic3.sim + + """ + + clusterComCheck.checkDnodes(4) + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(1) + tdSql.checkKeyData(1, 0, 1) + tdSql.checkKeyData(1, 2, "leader") + + tdLog.info(f"=============== step2: create mnode 2 3") + tdSql.execute(f"create mnode on dnode 2") + tdSql.execute(f"create mnode on dnode 3") + tdSql.error(f"create mnode on dnode 4") + + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"=============== step3: create user") + tdSql.execute(f"create user user1 PASS 'user121$*'") + tdSql.query(f"select * from information_schema.ins_users") + tdSql.checkRows(2) + + # wait mnode2 mnode3 recv data finish + time.sleep(5) + + tdLog.info(f"=============== step4: stop dnode1") + sc.dnodeForceStop(1) + time.sleep(1) + clusterComCheck.checkDnodes(3) + + tdSql.query(f"select * from information_schema.ins_users") + tdSql.checkRows(2) + + tdLog.info(f"=============== step5: stop dnode2") + sc.dnodeStart(1) + sc.dnodeStop(2) + + time.sleep(1) + clusterComCheck.checkDnodes(3) + + tdSql.query(f"select * from information_schema.ins_users") + tdSql.checkRows(2) + + tdLog.info(f"=============== step6: stop dnode3") + sc.dnodeStart(2) + sc.dnodeStop(3) + + time.sleep(1) + clusterComCheck.checkDnodes(3) + + tdSql.query(f"select * from information_schema.ins_users") + tdSql.checkRows(2) diff --git a/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic4.py b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic4.py new file mode 100644 index 00000000000..749a98334a4 --- /dev/null +++ b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic4.py @@ -0,0 +1,63 @@ +import time +from new_test_framework.utils import tdLog, tdSql, sc, clusterComCheck + + +class TestMnodeBasic4: + + def setup_class(cls): + tdLog.debug(f"start to execute {__file__}") + + def test_mnode_basic4(self): + """mnode basic 4 + + 1. - + + Catalog: + - ManageNodes:Mnode + + Since: v3.0.0.0 + + Labels: common,ci + + Jira: None + + History: + - 2025-5-5 Simon Guan Migrated to new test framework, from tsim/mnode/basic4.sim + + """ + + clusterComCheck.checkDnodes(3) + sc.dnodeStop(3) + clusterComCheck.checkDnodes(2) + + tdLog.info(f"=============== step2: create mnode 2") + tdSql.execute(f"create mnode on dnode 2") + tdSql.error(f"create mnode on dnode 3") + + sc.dnodeStart(3) + clusterComCheck.checkDnodes(3) + + tdLog.info(f"=============== step4: create mnode 3") + tdSql.execute(f"create mnode on dnode 3") + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"=============== step5: drop mnode 3 and stop dnode3") + sc.dnodeForceStop(3) + clusterComCheck.checkDnodes(2) + tdSql.error(f"drop mnode on dnode 3") + + tdLog.info(f"=============== step6: start dnode3") + sc.dnodeStart(3) + clusterComCheck.checkDnodes(3) + + tdSql.query("select * from information_schema.ins_mnodes;") + tdSql.checkRows(3) + if tdSql.getData(0, 2) == "leader": + tdLog.info(f"drop mnode on dnode {tdSql.getData(0,0)}") + tdSql.error(f"drop mnode on dnode {tdSql.getData(0,0)}") + elif tdSql.getData(1, 2) == "leader": + tdLog.info(f"drop mnode on dnode {tdSql.getData(0,0)}") + tdSql.error(f"drop mnode on dnode {tdSql.getData(0,0)}") + elif tdSql.getData(2, 2) == "leader": + tdLog.info(f"drop mnode on dnode {tdSql.getData(0,0)}") + tdSql.error(f"drop mnode on dnode {tdSql.getData(0,0)}") diff --git a/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic5.py b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic5.py new file mode 100644 index 00000000000..b8945e8f7d7 --- /dev/null +++ b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic5.py @@ -0,0 +1,131 @@ +import time +from new_test_framework.utils import tdLog, tdSql, sc, clusterComCheck + + +class TestMnodeBasic5: + + def setup_class(cls): + tdLog.debug(f"start to execute {__file__}") + + def test_mnode_basic5(self): + """mnode basic 5 + + 1. - + + Catalog: + - ManageNodes:Mnode + + Since: v3.0.0.0 + + Labels: common,ci + + Jira: None + + History: + - 2025-5-5 Simon Guan Migrated to new test framework, from tsim/mnode/basic5.sim + + """ + + tdLog.info(f"=============== step1: create dnodes") + clusterComCheck.checkDnodes(4) + sc.dnodeStop(2) + sc.dnodeStop(3) + sc.dnodeStop(4) + clusterComCheck.checkDnodes(1) + + tdLog.info(f"=============== step2: create dnodes - with error") + tdSql.error(f"create mnode on dnode 1;") + tdSql.error(f"create mnode on dnode 2;") + tdSql.error(f"create mnode on dnode 3;") + tdSql.error(f"create mnode on dnode 4;") + tdSql.error(f"create mnode on dnode 5;") + tdSql.error(f"create mnode on dnode 6;") + + tdLog.info(f"=============== step3: create mnode 2 and 3") + sc.dnodeStart(2) + sc.dnodeStart(3) + sc.dnodeStart(4) + clusterComCheck.checkDnodes(4) + + tdSql.execute(f"create mnode on dnode 2") + tdSql.execute(f"create mnode on dnode 3") + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"=============== step4: create dnodes - with error") + tdSql.error(f"create mnode on dnode 1") + tdSql.error(f"create mnode on dnode 2;") + tdSql.error(f"create mnode on dnode 3;") + tdSql.error(f"create mnode on dnode 4;") + tdSql.error(f"create mnode on dnode 5;") + tdSql.error(f"create mnode on dnode 6;") + + tdLog.info(f"=============== step5: drop mnodes - with error") + tdSql.error(f"drop mnode on dnode 1") + tdSql.error(f"drop mnode on dnode 4") + tdSql.error(f"drop mnode on dnode 5") + tdSql.error(f"drop mnode on dnode 6") + + sc.dnodeStop(2) + clusterComCheck.checkDnodes(3) + clusterComCheck.checkMnodeStatus(3, False) + + tdSql.query(f"select * from information_schema.ins_dnodes") + tdSql.checkKeyData(1, 4, "ready") + tdSql.checkKeyData(2, 4, "offline") + tdSql.checkKeyData(3, 4, "ready") + tdSql.checkKeyData(4, 4, "ready") + + sc.dnodeStart(2) + clusterComCheck.checkDnodes(4) + tdSql.query(f"select * from information_schema.ins_dnodes") + tdSql.checkKeyData(1, 4, "ready") + tdSql.checkKeyData(2, 4, "ready") + tdSql.checkKeyData(3, 4, "ready") + tdSql.checkKeyData(4, 4, "ready") + + tdLog.info(f"=============== step6: stop mnode1") + sc.dnodeStop(1) + clusterComCheck.checkDnodes(3) + clusterComCheck.checkMnodeStatus(3, False) + + tdLog.info(f"=============== step7: start mnode1 and wait it online") + sc.dnodeStart(1) + clusterComCheck.checkDnodes(4) + + tdSql.query(f"select * from information_schema.ins_dnodes") + tdSql.checkKeyData(1, 4, "ready") + tdSql.checkKeyData(2, 4, "ready") + tdSql.checkKeyData(3, 4, "ready") + tdSql.checkKeyData(4, 4, "ready") + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"=============== step8: stop mnode1 and drop it") + sc.dnodeStop(1) + clusterComCheck.checkDnodes(3) + + tdSql.query(f"select * from information_schema.ins_dnodes") + tdSql.checkKeyData(1, 4, "offline") + tdSql.checkKeyData(2, 4, "ready") + tdSql.checkKeyData(3, 4, "ready") + tdSql.checkKeyData(4, 4, "ready") + + tdLog.info(f"=============== step9: start mnode1 and wait it dropped") + tdLog.info(f"check mnode has leader step9a") + clusterComCheck.checkMnodeStatus(3, False) + + tdLog.info(f"start dnode1 step9b") + sc.dnodeStart(1) + clusterComCheck.checkDnodes(4) + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"drop mnode step9d") + tdSql.execute(f"drop mnode on dnode 1") + clusterComCheck.checkMnodeStatus(2) + + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(2) + + tdLog.info(f"=============== stepa: create mnode1 again") + tdSql.execute(f"create mnode on dnode 1") + clusterComCheck.checkMnodeStatus(3) + clusterComCheck.checkDnodes(4) diff --git a/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic6.py b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic6.py new file mode 100644 index 00000000000..410955b845d --- /dev/null +++ b/test/cases/19-ManageNodes/02-Mnode/test_mnode_basic6.py @@ -0,0 +1,113 @@ +import time +from new_test_framework.utils import tdLog, tdSql, sc, clusterComCheck + + +class TestMnodeBasic6: + + def setup_class(cls): + tdLog.debug(f"start to execute {__file__}") + + def test_mnode_basic6(self): + """mnode basic 6 + + 1. - + + Catalog: + - ManageNodes:Mnode + + Since: v3.0.0.0 + + Labels: common,ci + + Jira: None + + History: + - 2025-5-5 Simon Guan Migrated to new test framework, from tsim/mnode/basic6.sim + + """ + clusterComCheck.checkDnodes(4) + sc.dnodeStop(2) + sc.dnodeStop(3) + sc.dnodeStop(4) + clusterComCheck.checkDnodes(1) + + tdLog.info(f"=============== step2: create dnodes - with error") + tdSql.error(f"create mnode on dnode 1;") + tdSql.error(f"create mnode on dnode 2;") + tdSql.error(f"create mnode on dnode 3;") + tdSql.error(f"create mnode on dnode 4;") + tdSql.error(f"create mnode on dnode 5;") + tdSql.error(f"create mnode on dnode 6;") + + tdLog.info(f"=============== step3: create mnode 2 and 3") + sc.dnodeStart(2) + sc.dnodeStart(3) + sc.dnodeStart(4) + clusterComCheck.checkDnodes(4) + + tdSql.execute(f"create mnode on dnode 2") + tdSql.execute(f"create mnode on dnode 3") + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"=============== step4: create dnodes - with error") + tdSql.error(f"create mnode on dnode 1") + tdSql.error(f"create mnode on dnode 2;") + tdSql.error(f"create mnode on dnode 3;") + tdSql.error(f"create mnode on dnode 4;") + tdSql.error(f"create mnode on dnode 5;") + tdSql.error(f"create mnode on dnode 6;") + + tdLog.info(f"=============== step5: drop mnodes - with error") + tdSql.error(f"drop mnode on dnode 1") + tdSql.error(f"drop mnode on dnode 4") + tdSql.error(f"drop mnode on dnode 5") + tdSql.error(f"drop mnode on dnode 6") + + sc.dnodeStop(2) + clusterComCheck.checkDnodes(3) + clusterComCheck.checkMnodeStatus(3, False) + + tdSql.error(f"drop mnode on dnode 2") + sc.dnodeStart(2) + clusterComCheck.checkDnodes(4) + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"=============== step6: stop mnode1") + sc.dnodeStop(1) + clusterComCheck.checkDnodes(3) + clusterComCheck.checkMnodeStatus(3, False) + + tdLog.info(f"=============== step7: start mnode1 and wait it online") + sc.dnodeStart(1) + clusterComCheck.checkDnodes(4) + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"=============== step8: stop mnode1 and drop it") + sc.dnodeStop(1) + clusterComCheck.checkDnodes(3) + + tdLog.info(f"=============== step9: start mnode1 and wait it dropped") + tdLog.info(f"check mnode has leader step9a") + clusterComCheck.checkMnodeStatus(3, False) + + tdLog.info(f"start dnode1 step9b") + sc.dnodeStart(1) + clusterComCheck.checkDnodes(4) + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"drop mnode step9d") + tdSql.execute(f"drop mnode on dnode 1") + clusterComCheck.checkMnodeStatus(2) + + tdLog.info(f"check mnode leader") + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(2) + + tdLog.info(f"=============== stepa: create mnode1 again") + tdSql.execute(f"create mnode on dnode 1") + clusterComCheck.checkMnodeStatus(3) + + tdLog.info(f"check mnode leader") + tdSql.query(f"select * from information_schema.ins_mnodes") + tdSql.checkRows(3) + clusterComCheck.checkDnodes(4) diff --git a/test/ci/cases.task b/test/ci/cases.task index 57342d3b45d..f90bd1eeb17 100644 --- a/test/ci/cases.task +++ b/test/ci/cases.task @@ -290,7 +290,15 @@ # 18-ReservedKeywords # 19-ManageNodes -,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/test_dnode_alter_debugflag.py +## 01-Dnode +,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/01-Dnode/test_dnode_alter_debugflag.py +## 02-Mnode +,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/02-Mnode/test_mnode_basic1.py -N 2 +,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/02-Mnode/test_mnode_basic2.py -N 2 +,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/02-Mnode/test_mnode_basic3.py -N 4 +,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/02-Mnode/test_mnode_basic4.py -N 3 +,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/02-Mnode/test_mnode_basic5.py -N 4 +,,y,.,./ci/pytest.sh pytest cases/19-ManageNodes/02-Mnode/test_mnode_basic6.py -N 4 # 20-Metadata diff --git a/test/new_test_framework/utils/clusterCommonCheck.py b/test/new_test_framework/utils/clusterCommonCheck.py index b3d60ce45d1..f9f92913d88 100644 --- a/test/new_test_framework/utils/clusterCommonCheck.py +++ b/test/new_test_framework/utils/clusterCommonCheck.py @@ -36,7 +36,7 @@ class ClusterComCheck: tdSql.init(conn.cursor()) # tdSql.init(conn.cursor(), logSql) # output sql.txt file - def checkDnodes(self, dnodeNumbers, timeout=100): + def checkDnodes(self, dnodeNum, timeout=100): count = 0 while count < timeout: @@ -46,12 +46,11 @@ class ClusterComCheck: if tdSql.queryResult[i][4] == "ready": status += 1 - if status == dnodeNumbers: - tdLog.success( - "cluster with %d dnodes is ready within %ds!" - % (dnodeNumbers, count + 1) - ) + if status == dnodeNum: + tdLog.success(f"{dnodeNum} dnodes ready within {count}s!") return True + else: + tdLog.info(f"{dnodeNum} dnodes not ready, {status}:{tdSql.queryRows}") time.sleep(1) count += 1 @@ -59,9 +58,7 @@ class ClusterComCheck: else: tdSql.query("select * from information_schema.ins_dnodes") tdLog.debug(tdSql.queryResult) - tdLog.exit( - "cluster with %d dnodes not ready within %ds!" % (dnodeNumbers, timeout) - ) + tdLog.exit(f"{dnodeNum} dnodes not ready within {timeout}s!") def checkClusterAlive(self, status, timeout=100): count = 0 @@ -254,103 +251,79 @@ class ClusterComCheck: tdSql.checkData(0, 0, rowsPerSTable) return - def checkMnodeStatus(self, mnodeNums): - self.mnodeNums = int(mnodeNums) - # self.leaderDnode=int(leaderDnode) - tdLog.debug("start to check status of mnodes") + def checkMnodeStatus(self, mnodeNum, checkFollower = True): + tdLog.debug(f"check mnodes:{mnodeNum} status") count = 0 - while count < 10: + while count < 30: time.sleep(1) tdSql.query("select * from information_schema.ins_mnodes;") - if tdSql.checkRows(self.mnodeNums): - tdLog.success("cluster has %d mnodes" % self.mnodeNums) + if tdSql.checkRows(mnodeNum): + tdLog.success("cluster has %d mnodes" % mnodeNum) - if self.mnodeNums == 1: - if ( - tdSql.queryResult[0][2] == "leader" - and tdSql.queryResult[0][3] == "ready" - ): - tdLog.success("%d mnodes is ready in 10s" % self.mnodeNums) + if mnodeNum == 1: + tdLog.info(f"{tdSql.queryResult[0][2]}") + if tdSql.queryResult[0][2] == "leader": + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") return True count += 1 - elif self.mnodeNums == 3: - if ( - tdSql.queryResult[0][2] == "leader" - and tdSql.queryResult[0][3] == "ready" - ): - if ( - tdSql.queryResult[1][2] == "follower" - and tdSql.queryResult[1][3] == "ready" - ): - if ( - tdSql.queryResult[2][2] == "follower" - and tdSql.queryResult[2][3] == "ready" - ): - tdLog.success("%d mnodes is ready in 10s" % self.mnodeNums) + elif mnodeNum == 3: + tdLog.info( + f"{tdSql.queryResult[0][2]}, {tdSql.queryResult[1][2]}, {tdSql.queryResult[2][2]}" + ) + if tdSql.queryResult[0][2] == "leader": + if not checkFollower: + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") + return True + elif tdSql.queryResult[1][2] == "follower": + if tdSql.queryResult[2][2] == "follower": + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") return True - elif ( - tdSql.queryResult[1][2] == "leader" - and tdSql.queryResult[1][3] == "ready" - ): - if ( - tdSql.queryResult[0][2] == "follower" - and tdSql.queryResult[0][3] == "ready" - ): - if ( - tdSql.queryResult[2][2] == "follower" - and tdSql.queryResult[2][3] == "ready" - ): - tdLog.success("%d mnodes is ready in 10s" % self.mnodeNums) + elif tdSql.queryResult[1][2] == "leader": + if not checkFollower: + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") + return True + elif tdSql.queryResult[0][2] == "follower": + if tdSql.queryResult[2][2] == "follower": + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") return True - elif ( - tdSql.queryResult[2][2] == "leader" - and tdSql.queryResult[2][3] == "ready" - ): - if ( - tdSql.queryResult[0][2] == "follower" - and tdSql.queryResult[0][3] == "ready" - ): - if ( - tdSql.queryResult[1][2] == "follower" - and tdSql.queryResult[1][3] == "ready" - ): - tdLog.success("%d mnodes is ready in 10s" % self.mnodeNums) + elif tdSql.queryResult[2][2] == "leader": + if not checkFollower: + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") + return True + elif tdSql.queryResult[0][2] == "follower": + if tdSql.queryResult[1][2] == "follower": + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") return True count += 1 - elif self.mnodeNums == 2: - if ( - tdSql.queryResult[0][2] == "leader" - and tdSql.queryResult[0][3] == "ready" - ): - if ( - tdSql.queryResult[1][2] == "follower" - and tdSql.queryResult[1][3] == "ready" - ): - tdLog.success("%d mnodes is ready in 10s" % self.mnodeNums) + elif mnodeNum == 2: + tdLog.info(f"{tdSql.queryResult[0][2]}, {tdSql.queryResult[1][2]}") + if tdSql.queryResult[0][2] == "leader": + if not checkFollower: + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") return True - elif ( - tdSql.queryResult[1][2] == "leader" - and tdSql.queryResult[1][3] == "ready" - ): - if ( - tdSql.queryResult[0][2] == "follower" - and tdSql.queryResult[0][3] == "ready" - ): - tdLog.success("%d mnodes is ready in 10s" % self.mnodeNums) + elif tdSql.queryResult[1][2] == "follower": + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") + return True + elif tdSql.queryResult[1][2] == "leader": + if not checkFollower: + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") + return True + elif tdSql.queryResult[0][2] == "follower": + tdLog.success(f"{mnodeNum} mnodes ready in {count}s") return True count += 1 else: tdLog.debug(tdSql.queryResult) - tdLog.exit("cluster of %d mnodes is not ready in 10s " % self.mnodeNums) + tdLog.exit(f"{mnodeNum} mnodes not ready in {count}s") - def check3mnodeoff(self, offlineDnodeNo, mnodeNums=3): + def check3mnodeoff(self, offlineDnodeNo, mnodeNum=3): count = 0 - while count < 10: + while count < 30: time.sleep(1) tdSql.query("select * from information_schema.ins_mnodes;") - if tdSql.checkRows(mnodeNums): - tdLog.success("cluster has %d mnodes" % self.mnodeNums) + if tdSql.checkRows(mnodeNum): + tdLog.success("cluster has %d mnodes" % mnodeNum) else: tdLog.exit("mnode number is correct") if offlineDnodeNo == 1: @@ -408,13 +381,13 @@ class ClusterComCheck: tdLog.debug(tdSql.queryResult) tdLog.exit(f"stop mnodes on dnode {offlineDnodeNo} failed in 10s ") - def check3mnode2off(self, mnodeNums=3): + def check3mnode2off(self, mnodeNum=3): count = 0 - while count < 10: + while count < 30: time.sleep(1) tdSql.query("select * from information_schema.ins_mnodes;") - if tdSql.checkRows(mnodeNums): - tdLog.success("cluster has %d mnodes" % self.mnodeNums) + if tdSql.checkRows(mnodeNum): + tdLog.success("cluster has %d mnodes" % mnodeNum) else: tdLog.exit("mnode number is correct") if tdSql.queryResult[0][2] == "leader": diff --git a/test/new_test_framework/utils/server/dnode.py b/test/new_test_framework/utils/server/dnode.py index 20c517a3ad9..d044b739196 100644 --- a/test/new_test_framework/utils/server/dnode.py +++ b/test/new_test_framework/utils/server/dnode.py @@ -620,13 +620,11 @@ class TDDnode: ) else: psCmd = ( - "ps -ef|grep -w %s| grep dnode%d|grep -v grep | awk '{print $2}' | xargs" + "ps -ef | grep -w %s | grep dnode%d | grep -v grep | awk '{print $2}' | xargs" % (toBeKilled, self.index) ) - processID = ( - subprocess.check_output(psCmd, shell=True).decode("utf-8").strip() - ) - + processID = subprocess.check_output(psCmd, shell=True).decode("utf-8").strip() + tdLog.info(f"psCmd:{psCmd}, processId:[{processID}]") onlyKillOnceWindows = 0 while processID: if not platform.system().lower() == "windows" or ( @@ -637,10 +635,12 @@ class TDDnode: killCmd = "kill -INT %s > nul 2>&1" % processID os.system(killCmd) onlyKillOnceWindows = 1 + # tdLog.info(f"kill cmd:{killCmd}") time.sleep(1) processID = ( subprocess.check_output(psCmd, shell=True).decode("utf-8").strip() ) + tdLog.info(f"killed processID:{processID}") if self.valgrind: time.sleep(2) @@ -677,13 +677,14 @@ class TDDnode: ) else: psCmd = ( - "ps -ef|grep -w %s| grep dnode%d|grep -v grep | awk '{print $2}' | xargs" + "ps -ef | grep -w %s | grep dnode%d | grep -v grep | awk '{print $2}' | xargs" % (toBeKilled, self.index) ) processID = ( subprocess.check_output(psCmd, shell=True).decode("utf-8").strip() ) + tdLog.info(f"psCmd:{psCmd}, processId:[{processID}]") onlyKillOnceWindows = 0 while processID: if not platform.system().lower() == "windows" or ( @@ -694,10 +695,12 @@ class TDDnode: killCmd = "kill -KILL %s > nul 2>&1" % processID os.system(killCmd) onlyKillOnceWindows = 1 + # tdLog.info(f"kill cmd:{killCmd}") time.sleep(1) processID = ( subprocess.check_output(psCmd, shell=True).decode("utf-8").strip() ) + tdLog.info(f"killed processID:{processID}") # for port in range(6030, 6041): # fuserCmd = "fuser -k -n tcp %d" % port # os.system(fuserCmd) diff --git a/test/new_test_framework/utils/sql.py b/test/new_test_framework/utils/sql.py index bb5732e850f..a23dbe49d93 100644 --- a/test/new_test_framework/utils/sql.py +++ b/test/new_test_framework/utils/sql.py @@ -1305,6 +1305,49 @@ class TDSql: if show: tdLog.info("check key successfully") + def expectKeyData(self, key, col, data, show=False): + """ + Whether the data at the specified key matches the expected data. + + Args: + key: The first column to be compared with. + col (int): The column index of the data to be checked. + data: The expected data to be compared with. + show (bool, optional): If True, logs a message when the check is successful. Defaults to False. + + Returns: + Bool + + Raises: + None + """ + + if col >= self.queryCols: + caller = inspect.getframeinfo(inspect.stack()[1][0]) + args = (caller.filename, caller.lineno, self.sql, col + 1, self.queryCols) + tdLog.info( + "%s(%d) failed: sql:%s, col:%d is larger than queryCols:%d" % args + ) + return False + + row = -1 + + for i in range(self.queryRows): + if self.queryResult[i][col] == data: + row = i + + tdLog.info(f"find key:{key}, row:{row} col:{col}, data:{data}") + + if row == -1: + caller = inspect.getframeinfo(inspect.stack()[1][0]) + args = (caller.filename, caller.lineno, self.sql, key, col) + return False + + if show: + tdLog.info("check key successfully") + + return True + def checkAssert(self, assertVal, show=False): """ Checks if the assertVal is true. @@ -1322,7 +1365,7 @@ class TDSql: if assertVal != True: caller = inspect.getframeinfo(inspect.stack()[1][0]) - args = (caller.filename, caller.lineno, self.sql, assertVal) + args = (caller.filename, caller.lineno, self.sql) tdLog.exit("%s(%d) failed: sql:%s asserted" % args) if show: