Merge pull request #15467 from taosdata/test/cluster_case
test: add case about cluster vnode
This commit is contained in:
commit
b62dae9594
|
@ -194,4 +194,4 @@ int32_t metaSnapWrite(SMetaSnapWriter* pWriter, uint8_t* pData, uint32_t nData)
|
|||
_err:
|
||||
metaError("vgId:%d vnode snapshot meta write failed since %s", TD_VID(pMeta->pVnode), tstrerror(code));
|
||||
return code;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,202 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import time
|
||||
import socket
|
||||
import subprocess ,threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 1
|
||||
self.vgroups = 1
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 1000
|
||||
self.query_times = 500
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_db_check_vgroups(self):
|
||||
|
||||
tdSql.execute("drop database if exists test")
|
||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||
tdSql.execute("use test")
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(5):
|
||||
tdSql.execute("create table sub_tb_{} using stb1 tags({})".format(i,i))
|
||||
tdSql.query("show stables")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query("show tables")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
tdSql.query("show test.vgroups;")
|
||||
vgroups_infos = {} # key is id: value is info list
|
||||
for vgroup_info in tdSql.queryResult:
|
||||
vgroup_id = vgroup_info[0]
|
||||
tmp_list = []
|
||||
for role in vgroup_info[3:-4]:
|
||||
if role in ['leader','follower']:
|
||||
tmp_list.append(role)
|
||||
vgroups_infos[vgroup_id]=tmp_list
|
||||
|
||||
for k , v in vgroups_infos.items():
|
||||
if len(v) ==1 and v[0]=="leader":
|
||||
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
||||
else:
|
||||
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
||||
|
||||
def create_db_replica_3_insertdatas(self, dbname, replica_num ,vgroup_nums ,tb_nums , row_nums ):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
newTdSql.execute(drop_db_sql)
|
||||
newTdSql.execute(create_db_sql)
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
newTdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_tb_{}".format(i)
|
||||
newTdSql.execute("create table {} using stb1 tags({})".format(sub_tbname,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
ts = self.ts + 1000*row_num
|
||||
newTdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows execute end =====".format(dbname))
|
||||
|
||||
|
||||
|
||||
def check_insert_status(self, newTdSql ,dbname, tb_nums , row_nums):
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.query("select count(*) from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkData(0 , 0 , tb_nums*row_nums)
|
||||
newTdSql.query("select distinct tbname from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkRows(tb_nums)
|
||||
|
||||
def loop_query_constantly(self, times , db_name, tb_nums ,row_nums):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop_time in range(times):
|
||||
tdLog.debug(" === query is going ,this is {}_th query === ".format(loop_time))
|
||||
self.check_insert_status( newTdSql , db_name, tb_nums , row_nums)
|
||||
|
||||
def run(self):
|
||||
self.check_setup_cluster_status()
|
||||
self.create_db_check_vgroups()
|
||||
|
||||
# start writing constantly
|
||||
writing = threading.Thread(target = self.create_db_replica_3_insertdatas, args=(self.db_name , self.replica , self.vgroups , self.tb_nums , self.row_nums))
|
||||
writing.start()
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
while not tdSql.queryResult:
|
||||
print(tdSql.queryResult)
|
||||
time.sleep(0.1)
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
|
||||
reading = threading.Thread(target = self.loop_query_constantly, args=(self.query_times,self.db_name , self.tb_nums , self.row_nums))
|
||||
reading.start()
|
||||
|
||||
writing.join()
|
||||
reading.join()
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,428 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import datetime
|
||||
import inspect
|
||||
import time
|
||||
import socket
|
||||
import subprocess
|
||||
import threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.ts_step =1000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 3
|
||||
self.vgroups = 1
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 100
|
||||
self.stop_dnode_id = None
|
||||
self.loop_restart_times = 5
|
||||
self.current_thread = None
|
||||
self.max_restart_time = 10
|
||||
self.try_check_times = 10
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_database(self, dbname, replica_num ,vgroup_nums ):
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
tdSql.execute(drop_db_sql)
|
||||
tdSql.execute(create_db_sql)
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
|
||||
def create_stable_insert_datas(self,dbname ,stablename , tb_nums , row_nums):
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
tdSql.execute(
|
||||
'''create table {}
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''.format(stablename)
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_{}_{}".format(stablename,i)
|
||||
tdSql.execute("create table {} using {} tags({})".format(sub_tbname, stablename ,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
ts = self.ts + self.ts_step*row_num
|
||||
tdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== stable {} insert rows execute end =====".format(stablename))
|
||||
|
||||
def append_rows_of_exists_tables(self,dbname ,stablename , tbname , append_nums ):
|
||||
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
|
||||
for row_num in range(append_nums):
|
||||
tdSql.execute(f"insert into {tbname} values (now, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
# print(f"insert into {tbname} values (now, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
tdLog.notice(" ==== append new rows of table {} belongs to stable {} execute end =====".format(tbname,stablename))
|
||||
os.system("taos -s 'select count(*) from {}.{}';".format(dbname,stablename))
|
||||
|
||||
def check_insert_rows(self, dbname, stablename , tb_nums , row_nums, append_rows):
|
||||
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
|
||||
status_OK = self.mycheckData("select count(*) from {}.{}".format(dbname,stablename) ,0 , 0 , tb_nums*row_nums+append_rows)
|
||||
|
||||
count = 0
|
||||
while not status_OK :
|
||||
if count > self.try_check_times:
|
||||
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||
break
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
status_OK = self.mycheckData("select count(*) from {}.{}".format(dbname,stablename) ,0 , 0 , tb_nums*row_nums+append_rows)
|
||||
tdLog.debug(" ==== check insert rows first failed , this is {}_th retry check rows of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
status_OK = self.mycheckRows("select distinct tbname from {}.{}".format(dbname,stablename) ,tb_nums)
|
||||
count = 0
|
||||
while not status_OK :
|
||||
if count > self.try_check_times:
|
||||
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||
break
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
status_OK = self.mycheckRows("select distinct tbname from {}.{}".format(dbname,stablename) ,tb_nums)
|
||||
tdLog.debug(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self ,newTdSql ):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
while status !="offline":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self , newTdSql):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
while status !="ready":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has restart , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def _parse_datetime(self,timestr):
|
||||
try:
|
||||
return datetime.datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S.%f')
|
||||
except ValueError:
|
||||
pass
|
||||
try:
|
||||
return datetime.datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S')
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
def mycheckRowCol(self, sql, row, col):
|
||||
caller = inspect.getframeinfo(inspect.stack()[2][0])
|
||||
if row < 0:
|
||||
args = (caller.filename, caller.lineno, sql, row)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is smaller than zero" % args)
|
||||
if col < 0:
|
||||
args = (caller.filename, caller.lineno, sql, row)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is smaller than zero" % args)
|
||||
if row > tdSql.queryRows:
|
||||
args = (caller.filename, caller.lineno, sql, row, tdSql.queryRows)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args)
|
||||
if col > tdSql.queryCols:
|
||||
args = (caller.filename, caller.lineno, sql, col, tdSql.queryCols)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is larger than queryCols:%d" % args)
|
||||
|
||||
def mycheckData(self, sql ,row, col, data):
|
||||
check_status = True
|
||||
self.mycheckRowCol(sql ,row, col)
|
||||
if tdSql.queryResult[row][col] != data:
|
||||
if tdSql.cursor.istype(col, "TIMESTAMP"):
|
||||
# suppose user want to check nanosecond timestamp if a longer data passed
|
||||
if (len(data) >= 28):
|
||||
if pd.to_datetime(tdSql.queryResult[row][col]) == pd.to_datetime(data):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%d == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
else:
|
||||
if tdSql.queryResult[row][col] == self._parse_datetime(data):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
return
|
||||
|
||||
if str(tdSql.queryResult[row][col]) == str(data):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
return
|
||||
elif isinstance(data, float) and abs(tdSql.queryResult[row][col] - data) <= 0.000001:
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%f == expect:%f" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
return
|
||||
else:
|
||||
caller = inspect.getframeinfo(inspect.stack()[1][0])
|
||||
args = (caller.filename, caller.lineno, sql, row, col, tdSql.queryResult[row][col], data)
|
||||
tdLog.info("%s(%d) failed: sql:%s row:%d col:%d data:%s != expect:%s" % args)
|
||||
|
||||
check_status = False
|
||||
|
||||
if data is None:
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
elif isinstance(data, str):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
# elif isinstance(data, datetime.date):
|
||||
# tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
# (sql, row, col, tdSql.queryResult[row][col], data))
|
||||
elif isinstance(data, float):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
else:
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%d" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
|
||||
return check_status
|
||||
|
||||
def mycheckRows(self, sql, expectRows):
|
||||
check_status = True
|
||||
if len(tdSql.queryResult) == expectRows:
|
||||
tdLog.info("sql:%s, queryRows:%d == expect:%d" % (sql, len(tdSql.queryResult), expectRows))
|
||||
return True
|
||||
else:
|
||||
caller = inspect.getframeinfo(inspect.stack()[1][0])
|
||||
args = (caller.filename, caller.lineno, sql, len(tdSql.queryResult), expectRows)
|
||||
tdLog.info("%s(%d) failed: sql:%s, queryRows:%d != expect:%d" % args)
|
||||
check_status = False
|
||||
return check_status
|
||||
|
||||
def force_stop_dnode(self, dnode_id ):
|
||||
|
||||
port = None
|
||||
for k ,v in self.dnode_list.items():
|
||||
if v[0] == dnode_id:
|
||||
port = k.split(":")[-1]
|
||||
else:
|
||||
continue
|
||||
|
||||
if port:
|
||||
tdLog.notice(" ==== dnode {} will be force stop by kill -9 ====".format(dnode_id))
|
||||
psCmd = '''netstat -anp|grep -w LISTEN|grep -w %s |grep -o "LISTEN.*"|awk '{print $2}'|cut -d/ -f1|head -n1''' %(port)
|
||||
processID = subprocess.check_output(
|
||||
psCmd, shell=True).decode("utf-8")
|
||||
ps_kill_taosd = ''' kill -9 {} '''.format(processID)
|
||||
# print(ps_kill_taosd)
|
||||
os.system(ps_kill_taosd)
|
||||
else :
|
||||
tdLog.exit(" ==== port of dnode {} not found ====".format(dnode_id))
|
||||
|
||||
def stop_All(self):
|
||||
|
||||
tdDnodes = cluster.dnodes
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
# ==== stop all dnode =====
|
||||
for k ,v in self.dnode_list.items():
|
||||
dnode_id = v[0]
|
||||
# tdDnodes[dnode_id-1].stoptaosd()
|
||||
self.force_stop_dnode(dnode_id)
|
||||
# self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
def start_All(self):
|
||||
tdDnodes = cluster.dnodes
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
for k ,v in self.dnode_list.items():
|
||||
dnode_id = v[0]
|
||||
start = time.time()
|
||||
tdDnodes[dnode_id-1].starttaosd()
|
||||
# self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||
|
||||
|
||||
|
||||
def stop_All_dnodes_check_datas(self):
|
||||
|
||||
# stop follower and insert datas , update tables and create new stables
|
||||
self.create_database(dbname = self.db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = self.db_name , stablename = "stb1" , tb_nums= self.tb_nums ,row_nums= self.row_nums )
|
||||
self.check_insert_rows(self.db_name ,'stb1' ,tb_nums = self.tb_nums , row_nums= self.row_nums ,append_rows=0)
|
||||
os.system(" taos -s ' select count(*) from {}.{} ;'".format(self.db_name ,'stb1' ))
|
||||
|
||||
for i in range(self.loop_restart_times):
|
||||
# begin to stop All taosd
|
||||
self.stop_All()
|
||||
# begin to start All taosd
|
||||
self.start_All()
|
||||
|
||||
tdLog.debug(" ==== cluster has restart , this is {}_th restart cluster ==== ".format(i))
|
||||
|
||||
self.check_insert_rows(self.db_name ,'stb1' ,tb_nums = self.tb_nums , row_nums= self.row_nums ,append_rows=0)
|
||||
os.system(" taos -s ' select count(*) from {}.{} ;'".format(self.db_name ,'stb1' ))
|
||||
|
||||
self.append_rows_of_exists_tables(self.db_name ,"stb1" , "sub_stb1_0" , 100 )
|
||||
os.system(" taos -s ' select count(*) from {}.{} ;'".format(self.db_name ,'stb1' ))
|
||||
|
||||
|
||||
def run(self):
|
||||
|
||||
# basic insert and check of cluster
|
||||
self.check_setup_cluster_status()
|
||||
self.stop_All_dnodes_check_datas()
|
||||
|
||||
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,204 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import time
|
||||
import socket
|
||||
import subprocess ,threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 3
|
||||
self.vgroups = 1
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 1000
|
||||
self.query_times = 1000
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_db_check_vgroups(self):
|
||||
|
||||
tdSql.execute("drop database if exists test")
|
||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||
tdSql.execute("use test")
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(5):
|
||||
tdSql.execute("create table sub_tb_{} using stb1 tags({})".format(i,i))
|
||||
tdSql.query("show stables")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query("show tables")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
tdSql.query("show test.vgroups;")
|
||||
vgroups_infos = {} # key is id: value is info list
|
||||
for vgroup_info in tdSql.queryResult:
|
||||
vgroup_id = vgroup_info[0]
|
||||
tmp_list = []
|
||||
for role in vgroup_info[3:-4]:
|
||||
if role in ['leader','follower']:
|
||||
tmp_list.append(role)
|
||||
vgroups_infos[vgroup_id]=tmp_list
|
||||
|
||||
for k , v in vgroups_infos.items():
|
||||
if len(v) ==1 and v[0]=="leader":
|
||||
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
||||
else:
|
||||
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
||||
|
||||
def create_db_replica_3_insertdatas(self, dbname, replica_num ,vgroup_nums ,tb_nums , row_nums ):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
newTdSql.execute(drop_db_sql)
|
||||
newTdSql.execute(create_db_sql)
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
newTdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_tb_{}".format(i)
|
||||
newTdSql.execute("create table {} using stb1 tags({})".format(sub_tbname,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
if row_num %100 ==0:
|
||||
tdLog.info(" === writing is going now === ")
|
||||
ts = self.ts + 1000*row_num
|
||||
newTdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows execute end =====".format(dbname))
|
||||
|
||||
|
||||
|
||||
def check_insert_status(self, newTdSql ,dbname, tb_nums , row_nums):
|
||||
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.query("select count(*) from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkData(0 , 0 , tb_nums*row_nums)
|
||||
newTdSql.query("select distinct tbname from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkRows(tb_nums)
|
||||
|
||||
def loop_query_constantly(self, times , db_name, tb_nums ,row_nums):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop_time in range(times):
|
||||
tdLog.debug(" === query is going ,this is {}_th query === ".format(loop_time))
|
||||
self.check_insert_status( newTdSql ,db_name, tb_nums , row_nums)
|
||||
|
||||
def run(self):
|
||||
self.check_setup_cluster_status()
|
||||
self.create_db_check_vgroups()
|
||||
|
||||
# start writing constantly
|
||||
writing = threading.Thread(target = self.create_db_replica_3_insertdatas, args=(self.db_name , self.replica , self.vgroups , self.tb_nums , self.row_nums))
|
||||
writing.start()
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
while not tdSql.queryResult:
|
||||
print(tdSql.queryResult)
|
||||
time.sleep(0.1)
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
|
||||
reading = threading.Thread(target = self.loop_query_constantly, args=(self.query_times,self.db_name , self.tb_nums , self.row_nums))
|
||||
reading.start()
|
||||
|
||||
writing.join()
|
||||
reading.join()
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,355 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import time
|
||||
import socket
|
||||
import subprocess ,threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 3
|
||||
self.vgroups = 1
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 500
|
||||
self.max_restart_time = 20
|
||||
self.restart_server_times = 10
|
||||
self.dnode_index = 0
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_db_check_vgroups(self):
|
||||
|
||||
tdSql.execute("drop database if exists test")
|
||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||
tdSql.execute("use test")
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(5):
|
||||
tdSql.execute("create table sub_tb_{} using stb1 tags({})".format(i,i))
|
||||
tdSql.query("show stables")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query("show tables")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
tdSql.query("show test.vgroups;")
|
||||
vgroups_infos = {} # key is id: value is info list
|
||||
|
||||
for vgroup_info in tdSql.queryResult:
|
||||
vgroup_id = vgroup_info[0]
|
||||
tmp_list = []
|
||||
for role in vgroup_info[3:-4]:
|
||||
if role in ['leader','follower']:
|
||||
tmp_list.append(role)
|
||||
vgroups_infos[vgroup_id]=tmp_list
|
||||
|
||||
for k , v in vgroups_infos.items():
|
||||
if len(v) ==1 and v[0]=="leader":
|
||||
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
||||
else:
|
||||
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
||||
|
||||
def create_db_replica_3_insertdatas(self, dbname, replica_num ,vgroup_nums ,tb_nums , row_nums ):
|
||||
|
||||
newTdSql=tdCom.newTdSql()
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
newTdSql.execute(drop_db_sql)
|
||||
newTdSql.execute(create_db_sql)
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
newTdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_tb_{}".format(i)
|
||||
newTdSql.execute("create table {} using stb1 tags({})".format(sub_tbname,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
if row_num % (int(row_nums*0.1)) == 0 :
|
||||
tdLog.notice( " === database {} writing records {} rows".format(dbname , row_num ) )
|
||||
ts = self.ts + 1000*row_num
|
||||
|
||||
newTdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows execute end =====".format(dbname))
|
||||
|
||||
|
||||
def _get_stop_dnode_id(self):
|
||||
|
||||
|
||||
dnode_lists = list(set(self.dnode_list.keys()) -set(self.mnode_list.keys()))
|
||||
# print(dnode_lists)
|
||||
self.stop_dnode_id = self.dnode_list[dnode_lists[self.dnode_index % 3]][0]
|
||||
|
||||
self.dnode_index += 1
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self , newTdSql):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
|
||||
while status !="offline":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self , newTdSql ):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
while status !="ready":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has restart , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def get_leader_infos(self , newTdSql , dbname):
|
||||
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
newTdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = newTdSql.queryResult
|
||||
|
||||
leader_infos = set()
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos.add(vgroup_info[3:-4])
|
||||
|
||||
return leader_infos
|
||||
|
||||
def check_revote_leader_success(self, dbname, before_leader_infos , after_leader_infos):
|
||||
|
||||
check_status = False
|
||||
vote_act = set(set(after_leader_infos)-set(before_leader_infos))
|
||||
if not vote_act:
|
||||
print("=======before_revote_leader_infos ======\n" , before_leader_infos)
|
||||
print("=======after_revote_leader_infos ======\n" , after_leader_infos)
|
||||
tdLog.exit(" ===maybe revote not occured , there is no dnode offline ====")
|
||||
else:
|
||||
for vgroup_info in vote_act:
|
||||
for ind , role in enumerate(vgroup_info):
|
||||
if role==self.stop_dnode_id:
|
||||
|
||||
if vgroup_info[ind+1] =="offline" and "leader" in vgroup_info:
|
||||
tdLog.notice(" === revote leader ok , leader is {} now ====".format(vgroup_info[list(vgroup_info).index("leader")-1]))
|
||||
check_status = True
|
||||
elif vgroup_info[ind+1] !="offline":
|
||||
tdLog.notice(" === dnode {} should be offline ".format(self.stop_dnode_id))
|
||||
else:
|
||||
continue
|
||||
break
|
||||
return check_status
|
||||
|
||||
|
||||
def check_insert_status(self, newTdSql , dbname, tb_nums , row_nums):
|
||||
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.query("select count(*) from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkData(0 , 0 , tb_nums*row_nums)
|
||||
newTdSql.query("select distinct tbname from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkRows(tb_nums)
|
||||
|
||||
def loop_query_constantly(self, times , db_name, tb_nums ,row_nums):
|
||||
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop_time in range(times):
|
||||
tdLog.debug(" === query is going ,this is {}_th query === ".format(loop_time))
|
||||
|
||||
self.check_insert_status( newTdSql ,db_name, tb_nums , row_nums)
|
||||
|
||||
|
||||
def loop_restart_follower_constantly(self, times , db_name):
|
||||
|
||||
tdDnodes = cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
|
||||
for loop_time in range(times):
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id()
|
||||
|
||||
# print(self.stop_dnode_id)
|
||||
# begin stop dnode
|
||||
|
||||
# before_leader_infos = self.get_leader_infos( newTdSql ,db_name)
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
# start = time.time()
|
||||
# # get leader info after stop
|
||||
# after_leader_infos = self.get_leader_infos(newTdSql , db_name)
|
||||
|
||||
# revote_status = self.check_revote_leader_success(db_name ,before_leader_infos , after_leader_infos)
|
||||
|
||||
# # append rows of stablename when dnode stop make sure revote leaders
|
||||
|
||||
# while not revote_status:
|
||||
# after_leader_infos = self.get_leader_infos(newTdSql , db_name)
|
||||
# revote_status = self.check_revote_leader_success(db_name ,before_leader_infos , after_leader_infos)
|
||||
|
||||
# end = time.time()
|
||||
# time_cost = end - start
|
||||
# tdLog.notice(" ==== revote leader of database {} cost time {} ====".format(db_name , time_cost))
|
||||
|
||||
tdLog.notice(" === this is {}_th restart taosd === ".format(loop_time))
|
||||
|
||||
# begin start dnode
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
time.sleep(5)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||
|
||||
|
||||
|
||||
def run(self):
|
||||
|
||||
self.check_setup_cluster_status()
|
||||
self.create_db_check_vgroups()
|
||||
|
||||
# start writing constantly
|
||||
writing = threading.Thread(target = self.create_db_replica_3_insertdatas, args=(self.db_name , self.replica , self.vgroups , self.tb_nums , self.row_nums))
|
||||
writing.start()
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
while not tdSql.queryResult:
|
||||
print(tdSql.queryResult)
|
||||
time.sleep(0.1)
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
|
||||
restart_servers = threading.Thread(target = self.loop_restart_follower_constantly, args = (self.restart_server_times ,self.db_name))
|
||||
restart_servers.start()
|
||||
|
||||
# reading = threading.Thread(target = self.loop_query_constantly, args=(1000,self.db_name , self.tb_nums , self.row_nums))
|
||||
# reading.start()
|
||||
|
||||
writing.join()
|
||||
# reading.join()
|
||||
restart_servers.join()
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,316 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import time
|
||||
import socket
|
||||
import subprocess ,threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 3
|
||||
self.vgroups = 10
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 100
|
||||
self.max_restart_time = 20
|
||||
self.restart_server_times = 5
|
||||
self.query_times = 100
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_db_check_vgroups(self):
|
||||
|
||||
tdSql.execute("drop database if exists test")
|
||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||
tdSql.execute("use test")
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(5):
|
||||
tdSql.execute("create table sub_tb_{} using stb1 tags({})".format(i,i))
|
||||
tdSql.query("show stables")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query("show tables")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
tdSql.query("show test.vgroups;")
|
||||
vgroups_infos = {} # key is id: value is info list
|
||||
for vgroup_info in tdSql.queryResult:
|
||||
vgroup_id = vgroup_info[0]
|
||||
tmp_list = []
|
||||
for role in vgroup_info[3:-4]:
|
||||
if role in ['leader','follower']:
|
||||
tmp_list.append(role)
|
||||
vgroups_infos[vgroup_id]=tmp_list
|
||||
|
||||
for k , v in vgroups_infos.items():
|
||||
if len(v) ==1 and v[0]=="leader":
|
||||
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
||||
else:
|
||||
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
||||
|
||||
def create_db_replica_3_insertdatas(self, dbname, replica_num ,vgroup_nums ,tb_nums , row_nums ):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
newTdSql.execute(drop_db_sql)
|
||||
newTdSql.execute(create_db_sql)
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
newTdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_tb_{}".format(i)
|
||||
newTdSql.execute("create table {} using stb1 tags({})".format(sub_tbname,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
if row_num % (int(row_nums*0.1)) == 0 :
|
||||
tdLog.notice( " === database {} writing records {} rows".format(dbname , row_num ) )
|
||||
ts = self.ts + 1000*row_num
|
||||
newTdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows execute end =====".format(dbname))
|
||||
|
||||
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self , newTdSql):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
|
||||
while status !="offline":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self , newTdSql ):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
while status !="ready":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has restart , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def check_insert_status(self, newTdSql , dbname, tb_nums , row_nums):
|
||||
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.query("select count(*) from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkData(0 , 0 , tb_nums*row_nums)
|
||||
newTdSql.query("select distinct tbname from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkRows(tb_nums)
|
||||
|
||||
def loop_query_constantly(self, times , db_name, tb_nums ,row_nums):
|
||||
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop_time in range(times):
|
||||
tdLog.debug(" === query is going ,this is {}_th query === ".format(loop_time))
|
||||
|
||||
self.check_insert_status( newTdSql ,db_name, tb_nums , row_nums)
|
||||
|
||||
|
||||
def loop_restart_follower_constantly(self, times , db_name):
|
||||
|
||||
tdDnodes = cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
|
||||
for loop_time in range(times):
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name , "follower")
|
||||
|
||||
print(self.stop_dnode_id)
|
||||
# begin stop dnode
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
tdLog.notice(" === this is {}_th restart taosd === ".format(loop_time))
|
||||
|
||||
# begin start dnode
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||
|
||||
|
||||
|
||||
def run(self):
|
||||
|
||||
self.check_setup_cluster_status()
|
||||
self.create_db_check_vgroups()
|
||||
|
||||
# start writing constantly
|
||||
writing = threading.Thread(target = self.create_db_replica_3_insertdatas, args=(self.db_name , self.replica , self.vgroups , self.tb_nums , self.row_nums))
|
||||
writing.start()
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
while not tdSql.queryResult:
|
||||
print(tdSql.queryResult)
|
||||
time.sleep(0.1)
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
|
||||
restart_servers = threading.Thread(target = self.loop_restart_follower_constantly, args = (self.restart_server_times ,self.db_name))
|
||||
restart_servers.start()
|
||||
|
||||
reading = threading.Thread(target = self.loop_query_constantly, args=(self.query_times,self.db_name , self.tb_nums , self.row_nums))
|
||||
reading.start()
|
||||
|
||||
writing.join()
|
||||
reading.join()
|
||||
restart_servers.join()
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,369 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import time
|
||||
import socket
|
||||
import subprocess ,threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 3
|
||||
self.vgroups = 10
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 100
|
||||
self.max_restart_time = 20
|
||||
self.restart_server_times = 10
|
||||
self.query_times = 100
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_db_check_vgroups(self):
|
||||
|
||||
tdSql.execute("drop database if exists test")
|
||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||
tdSql.execute("use test")
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(5):
|
||||
tdSql.execute("create table sub_tb_{} using stb1 tags({})".format(i,i))
|
||||
tdSql.query("show stables")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query("show tables")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
tdSql.query("show test.vgroups;")
|
||||
vgroups_infos = {} # key is id: value is info list
|
||||
for vgroup_info in tdSql.queryResult:
|
||||
vgroup_id = vgroup_info[0]
|
||||
tmp_list = []
|
||||
for role in vgroup_info[3:-4]:
|
||||
if role in ['leader','follower']:
|
||||
tmp_list.append(role)
|
||||
vgroups_infos[vgroup_id]=tmp_list
|
||||
|
||||
for k , v in vgroups_infos.items():
|
||||
if len(v) ==1 and v[0]=="leader":
|
||||
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
||||
else:
|
||||
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
||||
|
||||
def create_db_replica_3_insertdatas(self, dbname, replica_num ,vgroup_nums ,tb_nums , row_nums ):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
newTdSql.execute(drop_db_sql)
|
||||
newTdSql.execute(create_db_sql)
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
newTdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_tb_{}".format(i)
|
||||
newTdSql.execute("create table {} using stb1 tags({})".format(sub_tbname,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
if row_num % (int(row_nums*0.1)) == 0 :
|
||||
tdLog.notice( " === database {} writing records {} rows".format(dbname , row_num ) )
|
||||
ts = self.ts + 1000*row_num
|
||||
newTdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows execute end =====".format(dbname))
|
||||
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self , newTdSql):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
|
||||
while status !="offline":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self , newTdSql ):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
while status !="ready":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has restart , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def get_leader_infos(self , newTdSql , dbname):
|
||||
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
newTdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = newTdSql.queryResult
|
||||
|
||||
leader_infos = set()
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos.add(vgroup_info[3:-4])
|
||||
|
||||
return leader_infos
|
||||
|
||||
def check_revote_leader_success(self, dbname, before_leader_infos , after_leader_infos):
|
||||
|
||||
check_status = False
|
||||
vote_act = set(set(after_leader_infos)-set(before_leader_infos))
|
||||
if not vote_act:
|
||||
print("=======before_revote_leader_infos ======\n" , before_leader_infos)
|
||||
print("=======after_revote_leader_infos ======\n" , after_leader_infos)
|
||||
tdLog.exit(" ===maybe revote not occured , there is no dnode offline ====")
|
||||
else:
|
||||
for vgroup_info in vote_act:
|
||||
for ind , role in enumerate(vgroup_info):
|
||||
if role==self.stop_dnode_id:
|
||||
|
||||
if vgroup_info[ind+1] =="offline" and "leader" in vgroup_info:
|
||||
tdLog.notice(" === revote leader ok , leader is {} now ====".format(vgroup_info[list(vgroup_info).index("leader")-1]))
|
||||
check_status = True
|
||||
elif vgroup_info[ind+1] !="offline":
|
||||
tdLog.notice(" === dnode {} should be offline ".format(self.stop_dnode_id))
|
||||
else:
|
||||
continue
|
||||
break
|
||||
return check_status
|
||||
|
||||
|
||||
def check_insert_status(self, newTdSql , dbname, tb_nums , row_nums):
|
||||
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.query("select count(*) from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkData(0 , 0 , tb_nums*row_nums)
|
||||
newTdSql.query("select distinct tbname from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkRows(tb_nums)
|
||||
|
||||
def loop_query_constantly(self, times , db_name, tb_nums ,row_nums):
|
||||
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop_time in range(times):
|
||||
tdLog.debug(" === query is going ,this is {}_th query === ".format(loop_time))
|
||||
|
||||
self.check_insert_status( newTdSql ,db_name, tb_nums , row_nums)
|
||||
|
||||
|
||||
def loop_restart_follower_constantly(self, times , db_name):
|
||||
|
||||
tdDnodes = cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
|
||||
for loop_time in range(times):
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name , "leader")
|
||||
|
||||
# print(self.stop_dnode_id)
|
||||
# begin stop dnode
|
||||
start = time.time()
|
||||
|
||||
before_leader_infos = self.get_leader_infos( newTdSql ,db_name)
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
start = time.time()
|
||||
# get leader info after stop
|
||||
after_leader_infos = self.get_leader_infos(newTdSql , db_name)
|
||||
|
||||
revote_status = self.check_revote_leader_success(db_name ,before_leader_infos , after_leader_infos)
|
||||
|
||||
# append rows of stablename when dnode stop make sure revote leaders
|
||||
|
||||
while not revote_status:
|
||||
after_leader_infos = self.get_leader_infos(newTdSql , db_name)
|
||||
revote_status = self.check_revote_leader_success(db_name ,before_leader_infos , after_leader_infos)
|
||||
|
||||
end = time.time()
|
||||
time_cost = end - start
|
||||
tdLog.notice(" ==== revote leader of database {} cost time {} ====".format(db_name , time_cost))
|
||||
|
||||
tdLog.notice(" === this is {}_th restart taosd === ".format(loop_time))
|
||||
|
||||
# begin start dnode
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||
|
||||
|
||||
|
||||
def run(self):
|
||||
|
||||
self.check_setup_cluster_status()
|
||||
self.create_db_check_vgroups()
|
||||
|
||||
# start writing constantly
|
||||
writing = threading.Thread(target = self.create_db_replica_3_insertdatas, args=(self.db_name , self.replica , self.vgroups , self.tb_nums , self.row_nums))
|
||||
writing.start()
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
while not tdSql.queryResult:
|
||||
print(tdSql.queryResult)
|
||||
time.sleep(0.1)
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
|
||||
restart_servers = threading.Thread(target = self.loop_restart_follower_constantly, args = (self.restart_server_times ,self.db_name))
|
||||
restart_servers.start()
|
||||
|
||||
reading = threading.Thread(target = self.loop_query_constantly, args=(self.query_times,self.db_name , self.tb_nums , self.row_nums))
|
||||
reading.start()
|
||||
|
||||
writing.join()
|
||||
reading.join()
|
||||
restart_servers.join()
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,407 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import datetime
|
||||
import inspect
|
||||
import time
|
||||
import socket
|
||||
import subprocess
|
||||
import threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.ts_step =1000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 3
|
||||
self.vgroups = 1
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 100
|
||||
self.stop_dnode_id = None
|
||||
self.loop_restart_times = 5
|
||||
self.current_thread = None
|
||||
self.max_restart_time = 10
|
||||
self.try_check_times = 10
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_database(self, dbname, replica_num ,vgroup_nums ):
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
tdSql.execute(drop_db_sql)
|
||||
tdSql.execute(create_db_sql)
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
|
||||
def create_stable_insert_datas(self,dbname ,stablename , tb_nums , row_nums):
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
tdSql.execute(
|
||||
'''create table {}
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''.format(stablename)
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_{}_{}".format(stablename,i)
|
||||
tdSql.execute("create table {} using {} tags({})".format(sub_tbname, stablename ,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
ts = self.ts + self.ts_step*row_num
|
||||
tdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== stable {} insert rows execute end =====".format(stablename))
|
||||
|
||||
def append_rows_of_exists_tables(self,dbname ,stablename , tbname , append_nums ):
|
||||
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
|
||||
for row_num in range(append_nums):
|
||||
tdSql.execute(f"insert into {tbname} values (now, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
# print(f"insert into {tbname} values (now, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
tdLog.notice(" ==== append new rows of table {} belongs to stable {} execute end =====".format(tbname,stablename))
|
||||
os.system("taos -s 'select count(*) from {}.{}';".format(dbname,stablename))
|
||||
|
||||
def check_insert_rows(self, dbname, stablename , tb_nums , row_nums, append_rows):
|
||||
|
||||
tdSql.execute("use {}".format(dbname))
|
||||
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
|
||||
status_OK = self.mycheckData("select count(*) from {}.{}".format(dbname,stablename) ,0 , 0 , tb_nums*row_nums+append_rows)
|
||||
|
||||
count = 0
|
||||
while not status_OK :
|
||||
if count > self.try_check_times:
|
||||
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||
break
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||
status_OK = self.mycheckData("select count(*) from {}.{}".format(dbname,stablename) ,0 , 0 , tb_nums*row_nums+append_rows)
|
||||
tdLog.debug(" ==== check insert rows first failed , this is {}_th retry check rows of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
status_OK = self.mycheckRows("select distinct tbname from {}.{}".format(dbname,stablename) ,tb_nums)
|
||||
count = 0
|
||||
while not status_OK :
|
||||
if count > self.try_check_times:
|
||||
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||
break
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
while not tdSql.queryResult:
|
||||
time.sleep(0.1)
|
||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||
status_OK = self.mycheckRows("select distinct tbname from {}.{}".format(dbname,stablename) ,tb_nums)
|
||||
tdLog.debug(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self ,newTdSql ):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
while status !="offline":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self , newTdSql):
|
||||
|
||||
def _get_status():
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
for dnode_info in dnode_infos:
|
||||
id = dnode_info[0]
|
||||
dnode_status = dnode_info[4]
|
||||
if id == self.stop_dnode_id:
|
||||
status = dnode_status
|
||||
break
|
||||
return status
|
||||
|
||||
status = _get_status()
|
||||
while status !="ready":
|
||||
time.sleep(0.1)
|
||||
status = _get_status()
|
||||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has restart , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def _parse_datetime(self,timestr):
|
||||
try:
|
||||
return datetime.datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S.%f')
|
||||
except ValueError:
|
||||
pass
|
||||
try:
|
||||
return datetime.datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S')
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
def mycheckRowCol(self, sql, row, col):
|
||||
caller = inspect.getframeinfo(inspect.stack()[2][0])
|
||||
if row < 0:
|
||||
args = (caller.filename, caller.lineno, sql, row)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is smaller than zero" % args)
|
||||
if col < 0:
|
||||
args = (caller.filename, caller.lineno, sql, row)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is smaller than zero" % args)
|
||||
if row > tdSql.queryRows:
|
||||
args = (caller.filename, caller.lineno, sql, row, tdSql.queryRows)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args)
|
||||
if col > tdSql.queryCols:
|
||||
args = (caller.filename, caller.lineno, sql, col, tdSql.queryCols)
|
||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is larger than queryCols:%d" % args)
|
||||
|
||||
def mycheckData(self, sql ,row, col, data):
|
||||
check_status = True
|
||||
self.mycheckRowCol(sql ,row, col)
|
||||
if tdSql.queryResult[row][col] != data:
|
||||
if tdSql.cursor.istype(col, "TIMESTAMP"):
|
||||
# suppose user want to check nanosecond timestamp if a longer data passed
|
||||
if (len(data) >= 28):
|
||||
if pd.to_datetime(tdSql.queryResult[row][col]) == pd.to_datetime(data):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%d == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
else:
|
||||
if tdSql.queryResult[row][col] == self._parse_datetime(data):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
return
|
||||
|
||||
if str(tdSql.queryResult[row][col]) == str(data):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
return
|
||||
elif isinstance(data, float) and abs(tdSql.queryResult[row][col] - data) <= 0.000001:
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%f == expect:%f" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
return
|
||||
else:
|
||||
caller = inspect.getframeinfo(inspect.stack()[1][0])
|
||||
args = (caller.filename, caller.lineno, sql, row, col, tdSql.queryResult[row][col], data)
|
||||
tdLog.info("%s(%d) failed: sql:%s row:%d col:%d data:%s != expect:%s" % args)
|
||||
|
||||
check_status = False
|
||||
|
||||
if data is None:
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
elif isinstance(data, str):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
# elif isinstance(data, datetime.date):
|
||||
# tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
# (sql, row, col, tdSql.queryResult[row][col], data))
|
||||
elif isinstance(data, float):
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
else:
|
||||
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%d" %
|
||||
(sql, row, col, tdSql.queryResult[row][col], data))
|
||||
|
||||
return check_status
|
||||
|
||||
def mycheckRows(self, sql, expectRows):
|
||||
check_status = True
|
||||
if len(tdSql.queryResult) == expectRows:
|
||||
tdLog.info("sql:%s, queryRows:%d == expect:%d" % (sql, len(tdSql.queryResult), expectRows))
|
||||
return True
|
||||
else:
|
||||
caller = inspect.getframeinfo(inspect.stack()[1][0])
|
||||
args = (caller.filename, caller.lineno, sql, len(tdSql.queryResult), expectRows)
|
||||
tdLog.info("%s(%d) failed: sql:%s, queryRows:%d != expect:%d" % args)
|
||||
check_status = False
|
||||
return check_status
|
||||
|
||||
def stop_All(self):
|
||||
|
||||
tdDnodes = cluster.dnodes
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
# ==== stop all dnode =====
|
||||
for k ,v in self.dnode_list.items():
|
||||
dnode_id = v[0]
|
||||
tdDnodes[dnode_id-1].stoptaosd()
|
||||
# self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
def start_All(self):
|
||||
tdDnodes = cluster.dnodes
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
for k ,v in self.dnode_list.items():
|
||||
dnode_id = v[0]
|
||||
start = time.time()
|
||||
tdDnodes[dnode_id-1].starttaosd()
|
||||
# self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||
|
||||
|
||||
|
||||
def stop_All_dnodes_check_datas(self):
|
||||
|
||||
# stop follower and insert datas , update tables and create new stables
|
||||
self.create_database(dbname = self.db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = self.db_name , stablename = "stb1" , tb_nums= self.tb_nums ,row_nums= self.row_nums )
|
||||
self.check_insert_rows(self.db_name ,'stb1' ,tb_nums = self.tb_nums , row_nums= self.row_nums ,append_rows=0)
|
||||
os.system(" taos -s ' select count(*) from {}.{} ;'".format(self.db_name ,'stb1' ))
|
||||
|
||||
for i in range(self.loop_restart_times):
|
||||
# begin to stop All taosd
|
||||
self.stop_All()
|
||||
# begin to start All taosd
|
||||
self.start_All()
|
||||
|
||||
tdLog.debug(" ==== cluster has restart , this is {}_th restart cluster ==== ".format(i))
|
||||
|
||||
self.check_insert_rows(self.db_name ,'stb1' ,tb_nums = self.tb_nums , row_nums= self.row_nums ,append_rows=0)
|
||||
os.system(" taos -s ' select count(*) from {}.{} ;'".format(self.db_name ,'stb1' ))
|
||||
|
||||
self.append_rows_of_exists_tables(self.db_name ,"stb1" , "sub_stb1_0" , 100 )
|
||||
os.system(" taos -s ' select count(*) from {}.{} ;'".format(self.db_name ,'stb1' ))
|
||||
|
||||
|
||||
def run(self):
|
||||
|
||||
# basic insert and check of cluster
|
||||
self.check_setup_cluster_status()
|
||||
self.stop_All_dnodes_check_datas()
|
||||
|
||||
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -220,25 +220,43 @@ class TDTestCase:
|
|||
status_OK = self.mycheckRows("select distinct tbname from {}.{}".format(dbname,stablename) ,tb_nums)
|
||||
tdLog.debug(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
|
||||
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='follower':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
def wait_stop_dnode_OK(self ,newTdSql):
|
||||
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -258,10 +276,11 @@ class TDTestCase:
|
|||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {} ====".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
|
||||
def wait_start_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -369,12 +388,15 @@ class TDTestCase:
|
|||
def sync_run_case(self):
|
||||
# stop follower and insert datas , update tables and create new stables
|
||||
tdDnodes=cluster.dnodes
|
||||
newTdSql = tdCom.newTdSql()
|
||||
for loop in range(self.loop_restart_times):
|
||||
db_name = "sync_db_{}".format(loop)
|
||||
stablename = 'stable_{}'.format(loop)
|
||||
self.create_database(dbname = db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = db_name , stablename = stablename , tb_nums= 10 ,row_nums= 10 )
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name)
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name , "follower")
|
||||
|
||||
|
||||
# check rows of datas
|
||||
|
||||
|
@ -384,7 +406,9 @@ class TDTestCase:
|
|||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
|
||||
self.wait_stop_dnode_OK()
|
||||
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
|
||||
# append rows of stablename when dnode stop
|
||||
|
||||
|
@ -402,7 +426,7 @@ class TDTestCase:
|
|||
|
||||
# begin start dnode
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
|
@ -419,7 +443,7 @@ class TDTestCase:
|
|||
def _restart_dnode_of_db_unsync(dbname):
|
||||
start = time.time()
|
||||
tdDnodes=cluster.dnodes
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname ,"follower")
|
||||
# begin restart dnode
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
self.wait_stop_dnode_OK()
|
||||
|
|
|
@ -220,26 +220,42 @@ class TDTestCase:
|
|||
status_OK = self.mycheckRows("select distinct tbname from {}.{}".format(dbname,stablename) ,tb_nums)
|
||||
tdLog.notice(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='follower':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
|
||||
def wait_stop_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -259,10 +275,10 @@ class TDTestCase:
|
|||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {}".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
def wait_start_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -370,13 +386,16 @@ class TDTestCase:
|
|||
def sync_run_case(self):
|
||||
# stop follower and insert datas , update tables and create new stables
|
||||
tdDnodes=cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop in range(self.loop_restart_times):
|
||||
db_name = "sync_db_{}".format(loop)
|
||||
stablename = 'stable_{}'.format(loop)
|
||||
self.create_database(dbname = db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = db_name , stablename = stablename , tb_nums= 10 ,row_nums= 10 )
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name)
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name ,"follower")
|
||||
# print("dnode_id:" , self.stop_dnode_id )
|
||||
|
||||
# check rows of datas
|
||||
|
||||
self.check_insert_rows(db_name ,stablename ,tb_nums=10 , row_nums= 10 ,append_rows=0)
|
||||
|
@ -384,8 +403,9 @@ class TDTestCase:
|
|||
# begin stop dnode
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
self.wait_stop_dnode_OK()
|
||||
|
||||
# append rows of stablename when dnode stop
|
||||
|
||||
|
@ -403,7 +423,7 @@ class TDTestCase:
|
|||
|
||||
# begin start dnode
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
|
@ -418,14 +438,16 @@ class TDTestCase:
|
|||
def unsync_run_case(self):
|
||||
|
||||
def _restart_dnode_of_db_unsync(dbname):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
start = time.time()
|
||||
tdDnodes=cluster.dnodes
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname,"follower")
|
||||
# print("dnode_id:" , self.stop_dnode_id )
|
||||
# begin restart dnode
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end-start)
|
||||
|
||||
|
|
|
@ -221,25 +221,41 @@ class TDTestCase:
|
|||
tdLog.notice(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='follower':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
def wait_stop_dnode_OK(self , newTdSql):
|
||||
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -259,10 +275,11 @@ class TDTestCase:
|
|||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {}".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
def wait_start_dnode_OK(self , newTdSql):
|
||||
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -370,12 +387,15 @@ class TDTestCase:
|
|||
def sync_run_case(self):
|
||||
# stop follower and insert datas , update tables and create new stables
|
||||
tdDnodes=cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop in range(self.loop_restart_times):
|
||||
db_name = "sync_db_{}".format(loop)
|
||||
stablename = 'stable_{}'.format(loop)
|
||||
self.create_database(dbname = db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = db_name , stablename = stablename , tb_nums= 10 ,row_nums= 10 )
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name)
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name,"follower")
|
||||
|
||||
|
||||
# check rows of datas
|
||||
|
||||
|
@ -384,8 +404,8 @@ class TDTestCase:
|
|||
# begin stop dnode
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].forcestop()
|
||||
|
||||
self.wait_stop_dnode_OK()
|
||||
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
# append rows of stablename when dnode stop
|
||||
|
||||
|
@ -403,7 +423,7 @@ class TDTestCase:
|
|||
|
||||
# begin start dnode
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
|
@ -420,17 +440,21 @@ class TDTestCase:
|
|||
def _restart_dnode_of_db_unsync(dbname):
|
||||
start = time.time()
|
||||
tdDnodes=cluster.dnodes
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname)
|
||||
newTdSql=tdCom.newTdSql()
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname,"follower")
|
||||
# print(self.stop_dnode_id)
|
||||
while not self.stop_dnode_id:
|
||||
# print(self.stop_dnode_id)
|
||||
time.sleep(0.5)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname,"follower")
|
||||
# begin restart dnode
|
||||
|
||||
# force stop taosd by kill -9
|
||||
self.force_stop_dnode(self.stop_dnode_id)
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
os.system(" taos -s 'show dnodes;' ")
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end-start)
|
||||
|
||||
|
|
|
@ -177,26 +177,40 @@ class TDTestCase:
|
|||
continue
|
||||
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
newTdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = newTdSql.queryResult
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='leader':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
|
||||
def wait_stop_dnode_OK(self , newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -216,10 +230,10 @@ class TDTestCase:
|
|||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {}".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
|
||||
def wait_start_dnode_OK(self,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -278,6 +292,9 @@ class TDTestCase:
|
|||
os.system(" {} -f {} >>/dev/null 2>&1 ".format(benchmark_build_path , json_file))
|
||||
|
||||
def stop_leader_when_Benchmark_inserts(self,dbname , total_rows , json_file ):
|
||||
|
||||
newTdSql=tdCom.newTdSql()
|
||||
|
||||
# stop follower and insert datas , update tables and create new stables
|
||||
tdDnodes=cluster.dnodes
|
||||
tdSql.execute(" drop database if exists {} ".format(dbname))
|
||||
|
@ -316,7 +333,7 @@ class TDTestCase:
|
|||
|
||||
tdLog.debug(" === database {} has write {} rows at least ====".format(dbname,total_rows/10))
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname ,"leader")
|
||||
|
||||
# prepare stop leader of database
|
||||
before_leader_infos = self.get_leader_infos(dbname)
|
||||
|
@ -335,9 +352,9 @@ class TDTestCase:
|
|||
tdLog.debug(" ==== revote leader of database {} cost time {} ====".format(dbname , time_cost))
|
||||
|
||||
self.current_thread.join()
|
||||
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
|
||||
|
||||
tdSql.query(" select count(*) from {}.{} ".format(dbname,"stb1"))
|
||||
tdLog.debug(" ==== expected insert {} rows of database {} , really is {}".format(total_rows, dbname , tdSql.queryResult[0][0]))
|
||||
|
|
|
@ -33,10 +33,10 @@ class TDTestCase:
|
|||
self.tb_nums = 10
|
||||
self.row_nums = 100
|
||||
self.stop_dnode_id = None
|
||||
self.loop_restart_times = 10
|
||||
self.loop_restart_times = 5
|
||||
self.current_thread = None
|
||||
self.max_restart_time = 5
|
||||
|
||||
self.try_check_times = 10
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
|
@ -304,26 +304,40 @@ class TDTestCase:
|
|||
tdLog.notice(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
newTdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = newTdSql.queryResult
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='leader':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
def wait_stop_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -343,10 +357,11 @@ class TDTestCase:
|
|||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {}".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
def wait_start_dnode_OK(self,newTdSql):
|
||||
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -421,13 +436,15 @@ class TDTestCase:
|
|||
def sync_run_case(self):
|
||||
# stop follower and insert datas , update tables and create new stables
|
||||
tdDnodes=cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop in range(self.loop_restart_times):
|
||||
db_name = "sync_db_{}".format(loop)
|
||||
stablename = 'stable_{}'.format(loop)
|
||||
self.create_database(dbname = db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = db_name , stablename = stablename , tb_nums= 10 ,row_nums= 10 )
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name)
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(db_name ,"leader")
|
||||
|
||||
# check rows of datas
|
||||
|
||||
self.check_insert_rows(db_name ,stablename ,tb_nums=10 , row_nums= 10 ,append_rows=0)
|
||||
|
@ -439,7 +456,7 @@ class TDTestCase:
|
|||
# force stop taosd by kill -9
|
||||
self.force_stop_dnode(self.stop_dnode_id)
|
||||
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
# vote leaders check
|
||||
|
||||
|
@ -451,6 +468,7 @@ class TDTestCase:
|
|||
# append rows of stablename when dnode stop make sure revote leaders
|
||||
|
||||
while not revote_status:
|
||||
|
||||
after_leader_infos = self.get_leader_infos(db_name)
|
||||
revote_status = self.check_revote_leader_success(db_name ,before_leader_infos , after_leader_infos)
|
||||
|
||||
|
@ -473,7 +491,7 @@ class TDTestCase:
|
|||
# begin start dnode
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end -start)
|
||||
if time_cost > self.max_restart_time:
|
||||
|
@ -490,14 +508,15 @@ class TDTestCase:
|
|||
def _restart_dnode_of_db_unsync(dbname):
|
||||
|
||||
tdDnodes=cluster.dnodes
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname)
|
||||
newTdSql=tdCom.newTdSql()
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(dbname ,"leader" )
|
||||
# begin restart dnode
|
||||
# force stop taosd by kill -9
|
||||
# get leader info before stop
|
||||
before_leader_infos = self.get_leader_infos(db_name)
|
||||
self.force_stop_dnode(self.stop_dnode_id)
|
||||
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
# check revote leader when restart servers
|
||||
# get leader info after stop
|
||||
|
@ -529,7 +548,7 @@ class TDTestCase:
|
|||
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
start = time.time()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end-start)
|
||||
|
||||
|
|
|
@ -0,0 +1,218 @@
|
|||
# author : wenzhouwww
|
||||
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
|
||||
import taos
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
from util.dnodes import TDDnodes
|
||||
from util.dnodes import TDDnode
|
||||
from util.cluster import *
|
||||
|
||||
import time
|
||||
import socket
|
||||
import subprocess ,threading
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
|
||||
class TDTestCase:
|
||||
def init(self,conn ,logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
self.host = socket.gethostname()
|
||||
self.mnode_list = {}
|
||||
self.dnode_list = {}
|
||||
self.ts = 1483200000000
|
||||
self.db_name ='testdb'
|
||||
self.replica = 3
|
||||
self.vgroups = 1
|
||||
self.tb_nums = 10
|
||||
self.row_nums = 1000
|
||||
self.query_times = 100
|
||||
|
||||
def getBuildPath(self):
|
||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||
if ("community" in selfPath):
|
||||
projPath = selfPath[:selfPath.find("community")]
|
||||
else:
|
||||
projPath = selfPath[:selfPath.find("tests")]
|
||||
|
||||
for root, dirs, files in os.walk(projPath):
|
||||
if ("taosd" in files):
|
||||
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||
if ("packaging" not in rootRealPath):
|
||||
buildPath = root[:len(root) - len("/build/bin")]
|
||||
break
|
||||
return buildPath
|
||||
|
||||
def check_setup_cluster_status(self):
|
||||
tdSql.query("show mnodes")
|
||||
for mnode in tdSql.queryResult:
|
||||
name = mnode[1]
|
||||
info = mnode
|
||||
self.mnode_list[name] = info
|
||||
|
||||
tdSql.query("show dnodes")
|
||||
for dnode in tdSql.queryResult:
|
||||
name = dnode[1]
|
||||
info = dnode
|
||||
self.dnode_list[name] = info
|
||||
|
||||
count = 0
|
||||
is_leader = False
|
||||
mnode_name = ''
|
||||
for k,v in self.mnode_list.items():
|
||||
count +=1
|
||||
# only for 1 mnode
|
||||
mnode_name = k
|
||||
|
||||
if v[2] =='leader':
|
||||
is_leader=True
|
||||
|
||||
if count==1 and is_leader:
|
||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
||||
|
||||
for k ,v in self.dnode_list.items():
|
||||
if k == mnode_name:
|
||||
if v[3]==0:
|
||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||
else:
|
||||
continue
|
||||
|
||||
def create_db_check_vgroups(self):
|
||||
|
||||
tdSql.execute("drop database if exists test")
|
||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||
tdSql.execute("use test")
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(5):
|
||||
tdSql.execute("create table sub_tb_{} using stb1 tags({})".format(i,i))
|
||||
tdSql.query("show stables")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query("show tables")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
tdSql.query("show test.vgroups;")
|
||||
vgroups_infos = {} # key is id: value is info list
|
||||
for vgroup_info in tdSql.queryResult:
|
||||
vgroup_id = vgroup_info[0]
|
||||
tmp_list = []
|
||||
for role in vgroup_info[3:-4]:
|
||||
if role in ['leader','follower']:
|
||||
tmp_list.append(role)
|
||||
vgroups_infos[vgroup_id]=tmp_list
|
||||
|
||||
for k , v in vgroups_infos.items():
|
||||
if len(v) ==1 and v[0]=="leader":
|
||||
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
||||
else:
|
||||
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
||||
|
||||
def create_db_replica_3_insertdatas(self, dbname, replica_num ,vgroup_nums ,tb_nums , row_nums ):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||
create_db_sql = "create database {} replica {} vgroups {}".format(dbname,replica_num,vgroup_nums)
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||
newTdSql.execute(drop_db_sql)
|
||||
newTdSql.execute(create_db_sql)
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.execute(
|
||||
'''create table stb1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
newTdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp)
|
||||
'''
|
||||
)
|
||||
|
||||
for i in range(tb_nums):
|
||||
sub_tbname = "sub_tb_{}".format(i)
|
||||
newTdSql.execute("create table {} using stb1 tags({})".format(sub_tbname,i))
|
||||
# insert datas about new database
|
||||
|
||||
for row_num in range(row_nums):
|
||||
ts = self.ts + 1000*row_num
|
||||
newTdSql.execute(f"insert into {sub_tbname} values ({ts}, {row_num} ,{row_num}, 10 ,1 ,{row_num} ,{row_num},true,'bin_{row_num}','nchar_{row_num}',now) ")
|
||||
|
||||
tdLog.notice(" ==== create database {} and insert rows execute end =====".format(dbname))
|
||||
|
||||
|
||||
|
||||
def check_insert_status(self,newTdSql , dbname, tb_nums , row_nums):
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
newTdSql.execute("use {}".format(dbname))
|
||||
newTdSql.query("select count(*) from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkData(0 , 0 , tb_nums*row_nums)
|
||||
newTdSql.query("select distinct tbname from {}.{}".format(dbname,'stb1'))
|
||||
# tdSql.checkRows(tb_nums)
|
||||
|
||||
def loop_query_constantly(self, times , db_name, tb_nums ,row_nums):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop_time in range(times):
|
||||
tdLog.debug(" === query is going ,this is {}_th query === ".format(loop_time))
|
||||
self.check_insert_status( newTdSql ,db_name, tb_nums , row_nums)
|
||||
|
||||
def loop_create_databases(self, times , tb_nums , row_nums):
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop_time in range(times):
|
||||
tdLog.debug(" === create database and insert datas is going ,this is {}_th create === ".format(loop_time))
|
||||
db_name = 'loop_db_{}'.format(loop_time)
|
||||
self.create_db_replica_3_insertdatas(db_name , self.replica , self.vgroups , tb_nums , row_nums)
|
||||
self.check_insert_status( newTdSql ,db_name, tb_nums , row_nums)
|
||||
|
||||
def run(self):
|
||||
self.check_setup_cluster_status()
|
||||
self.create_db_check_vgroups()
|
||||
|
||||
# create mnode
|
||||
tdSql.execute("create mnode on dnode 2 ")
|
||||
tdSql.execute("create mnode on dnode 3 ")
|
||||
os.system("taos -s 'show mnodes;'")
|
||||
# start writing constantly
|
||||
writing = threading.Thread(target = self.create_db_replica_3_insertdatas, args=(self.db_name , self.replica , self.vgroups , self.tb_nums , self.row_nums))
|
||||
writing.start()
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
while not tdSql.queryResult:
|
||||
print(tdSql.queryResult)
|
||||
time.sleep(0.1)
|
||||
tdSql.query(" show {}.stables ".format(self.db_name))
|
||||
|
||||
reading = threading.Thread(target = self.loop_query_constantly, args=(self.query_times,self.db_name , self.tb_nums , self.row_nums))
|
||||
reading.start()
|
||||
|
||||
create_db = threading.Thread(target = self.loop_create_databases, args=(5, 10 , 10))
|
||||
create_db.start()
|
||||
|
||||
writing.join()
|
||||
reading.join()
|
||||
create_db.join()
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -182,25 +182,40 @@ class TDTestCase:
|
|||
tdLog.notice(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='follower':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
|
||||
def wait_stop_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -220,10 +235,10 @@ class TDTestCase:
|
|||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {}".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
|
||||
def wait_start_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -372,22 +387,24 @@ class TDTestCase:
|
|||
def stop_follower_when_query_going(self):
|
||||
|
||||
tdDnodes = cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
self.create_database(dbname = self.db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = self.db_name , stablename = "stb1" , tb_nums= self.tb_nums ,row_nums= self.row_nums)
|
||||
|
||||
# let query task start
|
||||
self.thread_list = self.multi_thread_query_task(10 ,self.db_name ,'stb1' )
|
||||
# let query task start
|
||||
self.thread_list = self.multi_thread_query_task(5 ,self.db_name ,'stb1' )
|
||||
|
||||
|
||||
# force stop follower
|
||||
for loop in range(self.loop_restart_times):
|
||||
tdLog.debug(" ==== this is {}_th restart follower of database {} ==== ".format(loop ,self.db_name))
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name,"follower" )
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end-start)
|
||||
|
||||
|
@ -406,8 +423,6 @@ class TDTestCase:
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
|
|
@ -182,25 +182,40 @@ class TDTestCase:
|
|||
tdLog.notice(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='follower':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
def wait_stop_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -220,10 +235,10 @@ class TDTestCase:
|
|||
# tdLog.notice("==== stop dnode has not been stopped , endpoint is {}".format(self.stop_dnode))
|
||||
tdLog.notice("==== stop_dnode has stopped , id is {}".format(self.stop_dnode_id))
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
|
||||
def wait_start_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -379,15 +394,16 @@ class TDTestCase:
|
|||
self.thread_list = self.multi_thread_query_task(10 ,self.db_name ,'stb1' )
|
||||
|
||||
# force stop follower
|
||||
newTdSql=tdCom.newTdSql()
|
||||
for loop in range(self.loop_restart_times):
|
||||
tdLog.debug(" ==== this is {}_th restart follower of database {} ==== ".format(loop ,self.db_name))
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name,"follower" )
|
||||
self.force_stop_dnode(self.stop_dnode_id)
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end-start)
|
||||
|
||||
|
@ -405,9 +421,6 @@ class TDTestCase:
|
|||
self.stop_follower_when_query_going()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
|
|
@ -182,25 +182,40 @@ class TDTestCase:
|
|||
tdLog.notice(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='leader':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
|
||||
def wait_stop_dnode_OK(self,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -242,10 +257,11 @@ class TDTestCase:
|
|||
break
|
||||
return check_status
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
|
||||
def wait_start_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -349,11 +365,11 @@ class TDTestCase:
|
|||
tdLog.info("%s(%d) failed: sql:%s, queryRows:%d != expect:%d" % args)
|
||||
check_status = False
|
||||
return check_status
|
||||
|
||||
|
||||
def get_leader_infos(self ,dbname):
|
||||
|
||||
newTdSql=tdCom.newTdSql()
|
||||
|
||||
|
||||
def get_leader_infos(self , newTdSql ,dbname):
|
||||
|
||||
|
||||
newTdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = newTdSql.queryResult
|
||||
|
||||
|
@ -409,39 +425,39 @@ class TDTestCase:
|
|||
self.create_database(dbname = self.db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = self.db_name , stablename = "stb1" , tb_nums= self.tb_nums ,row_nums= self.row_nums)
|
||||
|
||||
# let query task start
|
||||
self.thread_list = self.multi_thread_query_task(10 ,self.db_name ,'stb1' )
|
||||
# let query task start
|
||||
self.thread_list = self.multi_thread_query_task(2 ,self.db_name ,'stb1' )
|
||||
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# force stop follower
|
||||
for loop in range(self.loop_restart_times):
|
||||
tdLog.debug(" ==== this is {}_th restart follower of database {} ==== ".format(loop ,self.db_name))
|
||||
|
||||
# get leader info before stop
|
||||
before_leader_infos = self.get_leader_infos(self.db_name)
|
||||
# get leader info before stop
|
||||
before_leader_infos = self.get_leader_infos(newTdSql , self.db_name)
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name,"leader")
|
||||
tdDnodes[self.stop_dnode_id-1].stoptaosd()
|
||||
|
||||
|
||||
start = time.time()
|
||||
# get leader info after stop
|
||||
after_leader_infos = self.get_leader_infos(self.db_name)
|
||||
|
||||
# get leader info after stop
|
||||
after_leader_infos = self.get_leader_infos(newTdSql , self.db_name)
|
||||
|
||||
revote_status = self.check_revote_leader_success(self.db_name ,before_leader_infos , after_leader_infos)
|
||||
|
||||
while not revote_status:
|
||||
after_leader_infos = self.get_leader_infos(self.db_name)
|
||||
after_leader_infos = self.get_leader_infos(newTdSql , self.db_name)
|
||||
revote_status = self.check_revote_leader_success(self.db_name ,before_leader_infos , after_leader_infos)
|
||||
|
||||
end = time.time()
|
||||
time_cost = end - start
|
||||
tdLog.debug(" ==== revote leader of database {} cost time {} ====".format(self.db_name , time_cost))
|
||||
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end-start)
|
||||
|
||||
|
@ -459,9 +475,6 @@ class TDTestCase:
|
|||
self.stop_follower_when_query_going()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
|
|
@ -182,25 +182,40 @@ class TDTestCase:
|
|||
tdLog.notice(" ==== check insert tbnames first failed , this is {}_th retry check tbnames of database {}".format(count , dbname))
|
||||
count += 1
|
||||
|
||||
def _get_stop_dnode_id(self,dbname):
|
||||
def _get_stop_dnode_id(self,dbname ,dnode_role):
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
status = False
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
while status!=True :
|
||||
time.sleep(0.1)
|
||||
tdSql.query("show {}.vgroups".format(dbname))
|
||||
vgroup_infos = tdSql.queryResult
|
||||
for vgroup_info in vgroup_infos:
|
||||
if "error" not in vgroup_info:
|
||||
status = True
|
||||
else:
|
||||
status = False
|
||||
# print(status)
|
||||
for vgroup_info in vgroup_infos:
|
||||
leader_infos = vgroup_info[3:-4]
|
||||
# print(vgroup_info)
|
||||
for ind ,role in enumerate(leader_infos):
|
||||
if role =='leader':
|
||||
if role == dnode_role:
|
||||
# print(ind,leader_infos)
|
||||
self.stop_dnode_id = leader_infos[ind-1]
|
||||
break
|
||||
|
||||
|
||||
return self.stop_dnode_id
|
||||
|
||||
def wait_stop_dnode_OK(self):
|
||||
def wait_stop_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
|
@ -242,10 +257,10 @@ class TDTestCase:
|
|||
break
|
||||
return check_status
|
||||
|
||||
def wait_start_dnode_OK(self):
|
||||
|
||||
def wait_start_dnode_OK(self ,newTdSql):
|
||||
|
||||
def _get_status():
|
||||
newTdSql=tdCom.newTdSql()
|
||||
# newTdSql=tdCom.newTdSql()
|
||||
status = ""
|
||||
newTdSql.query("show dnodes")
|
||||
dnode_infos = newTdSql.queryResult
|
||||
|
@ -406,11 +421,13 @@ class TDTestCase:
|
|||
def stop_follower_when_query_going(self):
|
||||
|
||||
tdDnodes = cluster.dnodes
|
||||
newTdSql=tdCom.newTdSql()
|
||||
self.create_database(dbname = self.db_name ,replica_num= self.replica , vgroup_nums= 1)
|
||||
self.create_stable_insert_datas(dbname = self.db_name , stablename = "stb1" , tb_nums= self.tb_nums ,row_nums= self.row_nums)
|
||||
|
||||
# let query task start
|
||||
self.thread_list = self.multi_thread_query_task(10 ,self.db_name ,'stb1' )
|
||||
# let query task start
|
||||
self.thread_list = self.multi_thread_query_task(5 ,self.db_name ,'stb1' )
|
||||
|
||||
|
||||
# force stop follower
|
||||
for loop in range(self.loop_restart_times):
|
||||
|
@ -419,7 +436,7 @@ class TDTestCase:
|
|||
# get leader info before stop
|
||||
before_leader_infos = self.get_leader_infos(self.db_name)
|
||||
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name)
|
||||
self.stop_dnode_id = self._get_stop_dnode_id(self.db_name ,"leader")
|
||||
self.force_stop_dnode(self.stop_dnode_id)
|
||||
|
||||
|
||||
|
@ -437,11 +454,11 @@ class TDTestCase:
|
|||
time_cost = end - start
|
||||
tdLog.debug(" ==== revote leader of database {} cost time {} ====".format(self.db_name , time_cost))
|
||||
|
||||
self.wait_stop_dnode_OK()
|
||||
self.wait_stop_dnode_OK(newTdSql)
|
||||
|
||||
start = time.time()
|
||||
tdDnodes[self.stop_dnode_id-1].starttaosd()
|
||||
self.wait_start_dnode_OK()
|
||||
self.wait_start_dnode_OK(newTdSql)
|
||||
end = time.time()
|
||||
time_cost = int(end-start)
|
||||
|
||||
|
|
|
@ -19,4 +19,28 @@ python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py -N 5
|
|||
# python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertData.py -N 5 -M 3
|
||||
python3 ./test.py -f 6-cluster/5dnode3mnodeAdd1Ddnoe.py -N 6 -M 3 -C 5
|
||||
|
||||
|
||||
# test case of vnode
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower_force_stop.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader_force_stop.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_all_dnodes.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_force_stop_all_dnodes.py -N 4 -M 1
|
||||
python3 ./test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py -N 4 -M 1
|
||||
|
||||
|
|
|
@ -193,6 +193,30 @@ python3 ./test.py -f 6-cluster/5dnode3mnodeRecreateMnode.py -N 5 -M 3
|
|||
python3 ./test.py -f 6-cluster/5dnode3mnodeStopFollowerLeader.py -N 5 -M 3
|
||||
python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3
|
||||
|
||||
# vnode case
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_force_stop_all_dnodes.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_all_dnodes.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower_force_stop.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader_force_stop.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1
|
||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py -N 4 -M 1
|
||||
|
||||
|
||||
python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3
|
||||
python3 ./test.py -f 7-tmq/basic5.py
|
||||
|
|
Loading…
Reference in New Issue