5dnode3mnodeStopInsert.py 13.2 KB
Newer Older
haoranc's avatar
haoranc 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
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
import time
import socket
import subprocess
haoranc's avatar
haoranc 已提交
15
from multiprocessing import Process
haoranc's avatar
haoranc 已提交
16 17 18 19
import threading 
import time
import inspect
import ctypes
haoranc's avatar
haoranc 已提交
20 21 22 23 24
class MyDnodes(TDDnodes):
    def __init__(self ,dnodes_lists):
        super(MyDnodes,self).__init__()
        self.dnodes = dnodes_lists  # dnode must be TDDnode instance
        self.simDeployed = False
haoranc's avatar
haoranc 已提交
25 26


haoranc's avatar
haoranc 已提交
27 28 29 30 31 32 33 34 35
class TDTestCase:

    def init(self,conn ,logSql):
        tdLog.debug(f"start to excute {__file__}")
        self.TDDnodes = None

    def buildcluster(self,dnodenumber):
        self.depoly_cluster(dnodenumber)
        self.master_dnode = self.TDDnodes.dnodes[0]
haoranc's avatar
haoranc 已提交
36
        self.host=self.master_dnode.cfgDict["fqdn"]
haoranc's avatar
haoranc 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
        conn1 = taos.connect(self.master_dnode.cfgDict["fqdn"] , config=self.master_dnode.cfgDir)
        tdSql.init(conn1.cursor())
        

    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
haoranc's avatar
haoranc 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

    def _async_raise(self, tid, exctype):
        """raises the exception, performs cleanup if needed"""
        if not inspect.isclass(exctype):
            exctype = type(exctype)
        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
        if res == 0:
            raise ValueError("invalid thread id")
        elif res != 1:
            # """if it returns a number greater than one, you're in trouble, 
            # and you should call it again with exc=NULL to revert the effect"""
            ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
            raise SystemError("PyThreadState_SetAsyncExc failed")

    def stop_thread(self,thread):
        self._async_raise(thread.ident, SystemExit)


haoranc's avatar
haoranc 已提交
74
    def insert_data(self,countstart,countstop):
haoranc's avatar
haoranc 已提交
75
        # fisrt add data : db\stable\childtable\general table
haoranc's avatar
haoranc 已提交
76
        
haoranc's avatar
haoranc 已提交
77
        for couti in range(countstart,countstop):
haoranc's avatar
haoranc 已提交
78
            tdLog.debug("drop database if exists db%d" %couti)
haoranc's avatar
haoranc 已提交
79
            tdSql.execute("drop database if exists db%d" %couti)
S
Shengliang Guan 已提交
80
            tdLog.debug("create database if not exists db%d replica 1 duration 300" %couti)
81
            tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti)
haoranc's avatar
haoranc 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
            tdSql.execute("use db%d" %couti)
            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(4):
                tdSql.execute(f'create table ct{i+1} using stb1 tags ( {i+1} )')

    def depoly_cluster(self ,dnodes_nums): 

        testCluster = False
        valgrind = 0  
        hostname = socket.gethostname()
        dnodes = []
        start_port = 6030
haoranc's avatar
haoranc 已提交
105
        start_port_sec = 6130
haoranc's avatar
haoranc 已提交
106 107 108 109 110 111 112
        for num in range(1, dnodes_nums+1):
            dnode = TDDnode(num)
            dnode.addExtraCfg("firstEp", f"{hostname}:{start_port}")
            dnode.addExtraCfg("fqdn", f"{hostname}")
            dnode.addExtraCfg("serverPort", f"{start_port + (num-1)*100}")
            dnode.addExtraCfg("monitorFqdn", hostname)
            dnode.addExtraCfg("monitorPort", 7043)
haoranc's avatar
haoranc 已提交
113
            dnode.addExtraCfg("secondEp", f"{hostname}:{start_port_sec}")
haoranc's avatar
haoranc 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
            dnodes.append(dnode)
        
        self.TDDnodes = MyDnodes(dnodes)
        self.TDDnodes.init("")
        self.TDDnodes.setTestCluster(testCluster)
        self.TDDnodes.setValgrind(valgrind)
        self.TDDnodes.stopAll()
        for dnode in self.TDDnodes.dnodes:
            self.TDDnodes.deploy(dnode.index,{})
            
        for dnode in self.TDDnodes.dnodes:
            self.TDDnodes.starttaosd(dnode.index)

        # create cluster 
        for dnode in self.TDDnodes.dnodes[1:]:
S
Shengliang Guan 已提交
129
            # tdLog.debug(dnode.cfgDict)
haoranc's avatar
haoranc 已提交
130 131 132 133
            dnode_id = dnode.cfgDict["fqdn"] +  ":" +dnode.cfgDict["serverPort"]
            dnode_first_host = dnode.cfgDict["firstEp"].split(":")[0]
            dnode_first_port = dnode.cfgDict["firstEp"].split(":")[-1]
            cmd = f" taos -h {dnode_first_host} -P {dnode_first_port} -s ' create dnode \"{dnode_id} \" ' ;"
S
Shengliang Guan 已提交
134
            tdLog.debug(cmd)
haoranc's avatar
haoranc 已提交
135 136 137 138 139
            os.system(cmd)
        
        time.sleep(2)
        tdLog.info(" create cluster with %d dnode  done! " %dnodes_nums)

haoranc's avatar
haoranc 已提交
140 141 142 143 144 145 146
    def checkdnodes(self,dnodenumber):
        count=0
        while count < 10:
            time.sleep(1)
            statusReadyBumber=0
            tdSql.query("show dnodes;")
            if tdSql.checkRows(dnodenumber) :     
S
Shengliang Guan 已提交
147
                tdLog.debug("dnode is %d nodes"%dnodenumber)   
haoranc's avatar
haoranc 已提交
148 149 150
            for i in range(dnodenumber):
                if tdSql.queryResult[i][4] !='ready'  :
                    status=tdSql.queryResult[i][4]
S
Shengliang Guan 已提交
151
                    tdLog.debug("dnode:%d status is %s "%(i,status))
haoranc's avatar
haoranc 已提交
152 153 154
                    break
                else:
                    statusReadyBumber+=1
S
Shengliang Guan 已提交
155
            tdLog.debug(statusReadyBumber)
haoranc's avatar
haoranc 已提交
156
            if statusReadyBumber == dnodenumber :
S
Shengliang Guan 已提交
157
                tdLog.debug("all of %d mnodes is ready in 10s "%dnodenumber)
haoranc's avatar
haoranc 已提交
158 159 160 161
                return True
                break
            count+=1
        else:
S
Shengliang Guan 已提交
162
            tdLog.debug("%d mnodes is not ready in 10s "%dnodenumber)
haoranc's avatar
haoranc 已提交
163 164 165
            return False
           

haoranc's avatar
haoranc 已提交
166 167 168 169 170
    def check3mnode(self):
        count=0
        while count < 10:
            time.sleep(1)
            tdSql.query("show mnodes;")
haoranc's avatar
haoranc 已提交
171
            if tdSql.checkRows(3) :     
S
Shengliang Guan 已提交
172
                tdLog.debug("mnode is  three nodes")           
haoranc's avatar
haoranc 已提交
173 174 175
            if  tdSql.queryResult[0][2]=='leader' :
                if  tdSql.queryResult[1][2]=='follower':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
176
                        tdLog.debug("three mnodes is ready in 10s")
haoranc's avatar
haoranc 已提交
177 178 179 180
                        break
            elif tdSql.queryResult[0][2]=='follower' :
                if  tdSql.queryResult[1][2]=='leader':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
181
                        tdLog.debug("three mnodes is ready in 10s")
haoranc's avatar
haoranc 已提交
182 183 184 185
                        break      
            elif tdSql.queryResult[0][2]=='follower' :
                if  tdSql.queryResult[1][2]=='follower':
                    if  tdSql.queryResult[2][2]=='leader':
S
Shengliang Guan 已提交
186
                        tdLog.debug("three mnodes is ready in 10s")
haoranc's avatar
haoranc 已提交
187
                        break                   
haoranc's avatar
haoranc 已提交
188 189
            count+=1
        else:
S
Shengliang Guan 已提交
190
            tdLog.debug("three mnodes is not ready in 10s ")
haoranc's avatar
haoranc 已提交
191
            return -1
haoranc's avatar
haoranc 已提交
192 193 194

        tdSql.query("show mnodes;")       
        tdSql.checkRows(3) 
haoranc's avatar
haoranc 已提交
195
        tdSql.checkData(0,1,'%s:6030'%self.host)
haoranc's avatar
haoranc 已提交
196
        tdSql.checkData(0,3,'ready')
haoranc's avatar
haoranc 已提交
197
        tdSql.checkData(1,1,'%s:6130'%self.host)
haoranc's avatar
haoranc 已提交
198
        tdSql.checkData(1,3,'ready')
haoranc's avatar
haoranc 已提交
199
        tdSql.checkData(2,1,'%s:6230'%self.host)
haoranc's avatar
haoranc 已提交
200 201 202 203 204 205 206 207
        tdSql.checkData(2,3,'ready')

    def check3mnode1off(self):
        count=0
        while count < 10:
            time.sleep(1)
            tdSql.query("show mnodes;")
            if tdSql.checkRows(3) :
S
Shengliang Guan 已提交
208
                tdLog.debug("mnode is  three nodes")
haoranc's avatar
haoranc 已提交
209 210 211
            if  tdSql.queryResult[0][2]=='offline' :
                if  tdSql.queryResult[1][2]=='leader':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
212
                        tdLog.debug("stop mnodes  on dnode 2 successfully in 10s")
haoranc's avatar
haoranc 已提交
213 214 215
                        break
                elif tdSql.queryResult[1][2]=='follower':
                    if  tdSql.queryResult[2][2]=='leader':
S
Shengliang Guan 已提交
216
                        tdLog.debug("stop mnodes  on dnode 2 successfully in 10s")
haoranc's avatar
haoranc 已提交
217
                        break
haoranc's avatar
haoranc 已提交
218 219
            count+=1
        else:
S
Shengliang Guan 已提交
220
            tdLog.debug("stop mnodes  on dnode 2 failed in 10s ")
haoranc's avatar
haoranc 已提交
221 222
            return -1
        tdSql.error("drop mnode on dnode 1;")
haoranc's avatar
haoranc 已提交
223 224 225

        tdSql.query("show mnodes;")       
        tdSql.checkRows(3) 
haoranc's avatar
haoranc 已提交
226
        tdSql.checkData(0,1,'%s:6030'%self.host)
haoranc's avatar
haoranc 已提交
227 228
        tdSql.checkData(0,2,'offline')
        tdSql.checkData(0,3,'ready')
haoranc's avatar
haoranc 已提交
229
        tdSql.checkData(1,1,'%s:6130'%self.host)
haoranc's avatar
haoranc 已提交
230
        tdSql.checkData(1,3,'ready')
haoranc's avatar
haoranc 已提交
231
        tdSql.checkData(2,1,'%s:6230'%self.host)
haoranc's avatar
haoranc 已提交
232 233 234 235
        tdSql.checkData(2,3,'ready')

    def check3mnode2off(self):
        count=0
haoranc's avatar
haoranc 已提交
236
        while count < 40:
haoranc's avatar
haoranc 已提交
237 238 239
            time.sleep(1)
            tdSql.query("show mnodes;")
            if tdSql.checkRows(3) :
S
Shengliang Guan 已提交
240
                tdLog.debug("mnode is  three nodes")
haoranc's avatar
haoranc 已提交
241 242 243
            if  tdSql.queryResult[0][2]=='leader' :
                if  tdSql.queryResult[1][2]=='offline':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
244
                        tdLog.debug("stop mnodes  on dnode 2 successfully in 10s")
haoranc's avatar
haoranc 已提交
245
                        break
haoranc's avatar
haoranc 已提交
246 247
            count+=1
        else:
S
Shengliang Guan 已提交
248
            tdLog.debug("stop mnodes  on dnode 2 failed in 10s ")
haoranc's avatar
haoranc 已提交
249 250
            return -1
        tdSql.error("drop mnode on dnode 2;")
haoranc's avatar
haoranc 已提交
251 252 253

        tdSql.query("show mnodes;")       
        tdSql.checkRows(3) 
haoranc's avatar
haoranc 已提交
254
        tdSql.checkData(0,1,'%s:6030'%self.host)
haoranc's avatar
haoranc 已提交
255 256
        tdSql.checkData(0,2,'leader')
        tdSql.checkData(0,3,'ready')
haoranc's avatar
haoranc 已提交
257
        tdSql.checkData(1,1,'%s:6130'%self.host)
haoranc's avatar
haoranc 已提交
258 259
        tdSql.checkData(1,2,'offline')
        tdSql.checkData(1,3,'ready')
haoranc's avatar
haoranc 已提交
260
        tdSql.checkData(2,1,'%s:6230'%self.host)
haoranc's avatar
haoranc 已提交
261 262 263 264 265 266 267 268 269
        tdSql.checkData(2,2,'follower')
        tdSql.checkData(2,3,'ready')

    def check3mnode3off(self):
        count=0
        while count < 10:
            time.sleep(1)
            tdSql.query("show mnodes;")
            if tdSql.checkRows(3) :
S
Shengliang Guan 已提交
270
                tdLog.debug("mnode is  three nodes")
haoranc's avatar
haoranc 已提交
271 272 273
            if  tdSql.queryResult[0][2]=='leader' :
                if  tdSql.queryResult[2][2]=='offline':
                    if  tdSql.queryResult[1][2]=='follower':
S
Shengliang Guan 已提交
274
                        tdLog.debug("stop mnodes  on dnode 3 successfully in 10s")
haoranc's avatar
haoranc 已提交
275
                        break
haoranc's avatar
haoranc 已提交
276 277
            count+=1
        else:
S
Shengliang Guan 已提交
278
            tdLog.debug("stop mnodes  on dnode 3 failed in 10s")
haoranc's avatar
haoranc 已提交
279 280
            return -1
        tdSql.error("drop mnode on dnode 3;")
haoranc's avatar
haoranc 已提交
281 282
        tdSql.query("show mnodes;")       
        tdSql.checkRows(3) 
haoranc's avatar
haoranc 已提交
283
        tdSql.checkData(0,1,'%s:6030'%self.host)
haoranc's avatar
haoranc 已提交
284 285
        tdSql.checkData(0,2,'leader')
        tdSql.checkData(0,3,'ready')
haoranc's avatar
haoranc 已提交
286
        tdSql.checkData(1,1,'%s:6130'%self.host)
haoranc's avatar
haoranc 已提交
287 288
        tdSql.checkData(1,2,'follower')
        tdSql.checkData(1,3,'ready')
haoranc's avatar
haoranc 已提交
289
        tdSql.checkData(2,1,'%s:6230'%self.host)
haoranc's avatar
haoranc 已提交
290 291 292 293 294
        tdSql.checkData(2,2,'offline')
        tdSql.checkData(2,3,'ready')

    def five_dnode_three_mnode(self,dnodenumber):
        tdSql.query("show dnodes;")
haoranc's avatar
haoranc 已提交
295 296
        tdSql.checkData(0,1,'%s:6030'%self.host)
        tdSql.checkData(4,1,'%s:6430'%self.host)
haoranc's avatar
haoranc 已提交
297 298 299 300
        tdSql.checkData(0,4,'ready')
        tdSql.checkData(4,4,'ready')
        tdSql.query("show mnodes;")   
        tdSql.checkRows(1)    
haoranc's avatar
haoranc 已提交
301
        tdSql.checkData(0,1,'%s:6030'%self.host)
haoranc's avatar
haoranc 已提交
302 303 304 305 306 307 308 309 310 311 312 313
        tdSql.checkData(0,2,'leader')
        tdSql.checkData(0,3,'ready')

        # fisr add three mnodes;
        tdSql.execute("create mnode on dnode 2")
        tdSql.execute("create mnode on dnode 3")

        # fisrt check statut ready
        self.check3mnode()

        tdSql.error("create mnode on dnode 2")
        tdSql.query("show dnodes;")
S
Shengliang Guan 已提交
314
        tdLog.debug(tdSql.queryResult)
haoranc's avatar
haoranc 已提交
315
        tdLog.debug("stop all of mnode ") 
haoranc's avatar
haoranc 已提交
316

haoranc's avatar
haoranc 已提交
317 318
        stopcount =0 
        while stopcount <= 2:
haoranc's avatar
haoranc 已提交
319
            for i in range(dnodenumber):
haoranc's avatar
haoranc 已提交
320 321 322 323
                # threads=[]
                # threads = MyThreadFunc(self.insert_data(i*2,i*2+2)) 
                threads=threading.Thread(target=self.insert_data, args=((stopcount+i)*2,(i+stopcount)*2+2))
                threads.start()
haoranc's avatar
haoranc 已提交
324 325
                self.TDDnodes.stoptaosd(i+1)
                self.TDDnodes.starttaosd(i+1)
haoranc's avatar
haoranc 已提交
326

haoranc's avatar
haoranc 已提交
327
                if self.checkdnodes(5):
S
Shengliang Guan 已提交
328
                    tdLog.debug("123")
haoranc's avatar
haoranc 已提交
329 330
                    threads.join()
                else:
S
Shengliang Guan 已提交
331
                    tdLog.debug("456")
haoranc's avatar
haoranc 已提交
332
                    self.stop_thread(threads)
haoranc's avatar
haoranc 已提交
333 334
                    assert 1 == 2 ,"some dnode started failed"
                    return False
haoranc's avatar
haoranc 已提交
335
                # self.check3mnode()
haoranc's avatar
haoranc 已提交
336
            stopcount+=1
haoranc's avatar
haoranc 已提交
337 338
        self.check3mnode()

haoranc's avatar
haoranc 已提交
339

haoranc's avatar
haoranc 已提交
340 341 342 343 344 345 346 347
    def getConnection(self, dnode):
        host = dnode.cfgDict["fqdn"]
        port = dnode.cfgDict["serverPort"]
        config_dir = dnode.cfgDir
        return taos.connect(host=host, port=int(port), config=config_dir)


    def run(self): 
S
Shengliang Guan 已提交
348
        # tdLog.debug(self.master_dnode.cfgDict)
haoranc's avatar
haoranc 已提交
349 350 351 352 353 354 355 356 357
        self.buildcluster(5)
        self.five_dnode_three_mnode(5)

    def stop(self):
        tdSql.close()
        tdLog.success(f"{__file__} successfully executed")

tdCases.addLinux(__file__, TDTestCase())
tdCases.addWindows(__file__, TDTestCase())