5dnode3mnodeDrop.py 12.9 KB
Newer Older
haoranc's avatar
haoranc 已提交
1
from ssl import ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
haoranc's avatar
haoranc 已提交
2
from paramiko import HostKeys
haoranc's avatar
haoranc 已提交
3 4 5
import taos
import sys
import time
G
Ganlin Zhao 已提交
6
import os
haoranc's avatar
haoranc 已提交
7 8 9 10

from util.log import *
from util.sql import *
from util.cases import *
11
from util.dnodes import *
haoranc's avatar
haoranc 已提交
12 13 14 15 16
from util.dnodes import TDDnodes
from util.dnodes import TDDnode
import time
import socket
import subprocess
haoranc's avatar
haoranc 已提交
17
from multiprocessing import Process
haoranc's avatar
haoranc 已提交
18 19 20 21 22
class MyDnodes(TDDnodes):
    def __init__(self ,dnodes_lists):
        super(MyDnodes,self).__init__()
        self.dnodes = dnodes_lists  # dnode must be TDDnode instance
        self.simDeployed = False
G
Ganlin Zhao 已提交
23

haoranc's avatar
haoranc 已提交
24 25
class TDTestCase:

26
    def init(self, conn, logSql, replicaVar=1):
haoranc's avatar
haoranc 已提交
27 28
        tdLog.debug(f"start to excute {__file__}")
        self.TDDnodes = None
29
        self.replicaVar =  int(replicaVar)
haoranc's avatar
haoranc 已提交
30 31 32

    def buildcluster(self,dnodenumber):
        self.depoly_cluster(dnodenumber)
haoranc's avatar
haoranc 已提交
33
        self.master_dnode = self.TDDnodes.dnodes[0]
haoranc's avatar
haoranc 已提交
34
        self.host=self.master_dnode.cfgDict["fqdn"]
haoranc's avatar
haoranc 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
        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
G
Ganlin Zhao 已提交
53

haoranc's avatar
haoranc 已提交
54 55 56 57
    def insert_data(self,count):
        # fisrt add data : db\stable\childtable\general table
        for couti in count:
            tdSql.execute("drop database if exists db%d" %couti)
58
            tdSql.execute("create database if not exists db%d replica 1 duration 300" %couti)
haoranc's avatar
haoranc 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
            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} )')
haoranc's avatar
haoranc 已提交
74

G
Ganlin Zhao 已提交
75
    def depoly_cluster(self ,dnodes_nums):
haoranc's avatar
haoranc 已提交
76 77

        testCluster = False
G
Ganlin Zhao 已提交
78
        valgrind = 0
haoranc's avatar
haoranc 已提交
79
        hostname = socket.gethostname()
S
Shengliang Guan 已提交
80
        tdLog.debug(hostname)
haoranc's avatar
haoranc 已提交
81 82
        dnodes = []
        start_port = 6030
haoranc's avatar
haoranc 已提交
83
        start_port_sec = 6130
haoranc's avatar
haoranc 已提交
84 85 86 87 88 89 90
        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 已提交
91
            dnode.addExtraCfg("secondEp", f"{hostname}:{start_port_sec}")
haoranc's avatar
haoranc 已提交
92
            dnodes.append(dnode)
G
Ganlin Zhao 已提交
93

haoranc's avatar
haoranc 已提交
94 95 96 97
        self.TDDnodes = MyDnodes(dnodes)
        self.TDDnodes.init("")
        self.TDDnodes.setTestCluster(testCluster)
        self.TDDnodes.setValgrind(valgrind)
98 99

        self.TDDnodes.setAsan(tdDnodes.getAsan())
haoranc's avatar
haoranc 已提交
100 101 102
        self.TDDnodes.stopAll()
        for dnode in self.TDDnodes.dnodes:
            self.TDDnodes.deploy(dnode.index,{})
G
Ganlin Zhao 已提交
103

haoranc's avatar
haoranc 已提交
104 105 106
        for dnode in self.TDDnodes.dnodes:
            self.TDDnodes.starttaosd(dnode.index)

G
Ganlin Zhao 已提交
107
        # create cluster
haoranc's avatar
haoranc 已提交
108
        for dnode in self.TDDnodes.dnodes[1:]:
S
Shengliang Guan 已提交
109
            # tdLog.debug(dnode.cfgDict)
haoranc's avatar
haoranc 已提交
110 111 112 113
            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 已提交
114
            tdLog.debug(cmd)
115 116
            if os.system(cmd) != 0:
                raise Exception("failed to execute system command. cmd: %s" % cmd)
G
Ganlin Zhao 已提交
117

haoranc's avatar
haoranc 已提交
118
        time.sleep(2)
haoranc's avatar
haoranc 已提交
119 120 121 122 123
        tdLog.info(" create cluster with %d dnode  done! " %dnodes_nums)

    def check3mnode(self):
        count=0
        while count < 10:
haoranc's avatar
haoranc 已提交
124
            time.sleep(0.1)
X
Xiaoyu Wang 已提交
125
            tdSql.query("select * from information_schema.ins_mnodes;")
G
Ganlin Zhao 已提交
126 127
            if tdSql.checkRows(3) :
                tdLog.debug("mnode is  three nodes")
haoranc's avatar
haoranc 已提交
128 129 130
            if  tdSql.queryResult[0][2]=='leader' :
                if  tdSql.queryResult[1][2]=='follower':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
131
                        tdLog.debug("three mnodes is ready in 10s")
haoranc's avatar
haoranc 已提交
132 133 134 135
                        break
            elif tdSql.queryResult[0][2]=='follower' :
                if  tdSql.queryResult[1][2]=='leader':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
136
                        tdLog.debug("three mnodes is ready in 10s")
G
Ganlin Zhao 已提交
137
                        break
haoranc's avatar
haoranc 已提交
138 139 140
            elif tdSql.queryResult[0][2]=='follower' :
                if  tdSql.queryResult[1][2]=='follower':
                    if  tdSql.queryResult[2][2]=='leader':
S
Shengliang Guan 已提交
141
                        tdLog.debug("three mnodes is ready in 10s")
G
Ganlin Zhao 已提交
142
                        break
haoranc's avatar
haoranc 已提交
143 144
            count+=1
        else:
S
Shengliang Guan 已提交
145 146
            tdLog.debug(tdSql.queryResult)
            tdLog.debug("three mnodes is not ready in 10s ")
haoranc's avatar
haoranc 已提交
147
            return -1
haoranc's avatar
haoranc 已提交
148

X
Xiaoyu Wang 已提交
149
        tdSql.query("select * from information_schema.ins_mnodes;")
G
Ganlin Zhao 已提交
150
        tdSql.checkRows(3)
haoranc's avatar
haoranc 已提交
151
        tdSql.checkData(0,1,'%s:6030'%self.host)
haoranc's avatar
haoranc 已提交
152
        tdSql.checkData(0,3,'ready')
haoranc's avatar
haoranc 已提交
153 154 155 156
        tdSql.checkData(1,1,'%s:6130'%self.host)
        tdSql.checkData(1,3,'ready')
        tdSql.checkData(2,1,'%s:6230'%self.host)
        tdSql.checkData(2,3,'ready')
haoranc's avatar
haoranc 已提交
157

haoranc's avatar
haoranc 已提交
158 159 160
    def check3mnode1off(self):
        count=0
        while count < 10:
haoranc's avatar
haoranc 已提交
161
            time.sleep(0.1)
X
Xiaoyu Wang 已提交
162
            tdSql.query("select * from information_schema.ins_mnodes;")
haoranc's avatar
haoranc 已提交
163
            if tdSql.checkRows(3) :
S
Shengliang Guan 已提交
164
                tdLog.debug("mnode is  three nodes")
haoranc's avatar
haoranc 已提交
165 166 167
            if  tdSql.queryResult[0][2]=='offline' :
                if  tdSql.queryResult[1][2]=='leader':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
168
                        tdLog.debug("stop mnodes  on dnode 2 successfully in 10s")
haoranc's avatar
haoranc 已提交
169 170 171
                        break
                elif tdSql.queryResult[1][2]=='follower':
                    if  tdSql.queryResult[2][2]=='leader':
S
Shengliang Guan 已提交
172
                        tdLog.debug("stop mnodes  on dnode 2 successfully in 10s")
haoranc's avatar
haoranc 已提交
173
                        break
haoranc's avatar
haoranc 已提交
174 175
            count+=1
        else:
S
Shengliang Guan 已提交
176
            tdLog.debug("stop mnodes  on dnode 2 failed in 10s ")
G
Ganlin Zhao 已提交
177
            return -1
haoranc's avatar
haoranc 已提交
178
        tdSql.error("drop mnode on dnode 1;")
haoranc's avatar
haoranc 已提交
179

X
Xiaoyu Wang 已提交
180
        tdSql.query("select * from information_schema.ins_mnodes;")
G
Ganlin Zhao 已提交
181
        tdSql.checkRows(3)
haoranc's avatar
haoranc 已提交
182 183 184 185 186 187 188
        tdSql.checkData(0,1,'%s:6030'%self.host)
        tdSql.checkData(0,2,'offline')
        tdSql.checkData(0,3,'ready')
        tdSql.checkData(1,1,'%s:6130'%self.host)
        tdSql.checkData(1,3,'ready')
        tdSql.checkData(2,1,'%s:6230'%self.host)
        tdSql.checkData(2,3,'ready')
haoranc's avatar
haoranc 已提交
189

haoranc's avatar
haoranc 已提交
190
    def check3mnode2off(self):
haoranc's avatar
haoranc 已提交
191
        count=0
haoranc's avatar
haoranc 已提交
192
        while count < 40:
haoranc's avatar
haoranc 已提交
193
            time.sleep(0.1)
X
Xiaoyu Wang 已提交
194
            tdSql.query("select * from information_schema.ins_mnodes;")
haoranc's avatar
haoranc 已提交
195
            if tdSql.checkRows(3) :
S
Shengliang Guan 已提交
196
                tdLog.debug("mnode is  three nodes")
haoranc's avatar
haoranc 已提交
197 198 199
            if  tdSql.queryResult[0][2]=='leader' :
                if  tdSql.queryResult[1][2]=='offline':
                    if  tdSql.queryResult[2][2]=='follower':
S
Shengliang Guan 已提交
200
                        tdLog.debug("stop mnodes  on dnode 2 successfully in 10s")
haoranc's avatar
haoranc 已提交
201
                        break
haoranc's avatar
haoranc 已提交
202 203
            count+=1
        else:
S
Shengliang Guan 已提交
204
            tdLog.debug("stop mnodes  on dnode 2 failed in 10s ")
haoranc's avatar
haoranc 已提交
205 206
            return -1
        tdSql.error("drop mnode on dnode 2;")
haoranc's avatar
haoranc 已提交
207

X
Xiaoyu Wang 已提交
208
        tdSql.query("select * from information_schema.ins_mnodes;")
G
Ganlin Zhao 已提交
209
        tdSql.checkRows(3)
haoranc's avatar
haoranc 已提交
210
        tdSql.checkData(0,1,'%s:6030'%self.host)
haoranc's avatar
haoranc 已提交
211 212
        tdSql.checkData(0,2,'leader')
        tdSql.checkData(0,3,'ready')
haoranc's avatar
haoranc 已提交
213 214
        tdSql.checkData(1,1,'%s:6130'%self.host)
        tdSql.checkData(1,2,'offline')
haoranc's avatar
haoranc 已提交
215
        tdSql.checkData(1,3,'ready')
haoranc's avatar
haoranc 已提交
216
        tdSql.checkData(2,1,'%s:6230'%self.host)
haoranc's avatar
haoranc 已提交
217 218 219
        tdSql.checkData(2,2,'follower')
        tdSql.checkData(2,3,'ready')

haoranc's avatar
haoranc 已提交
220 221 222
    def check3mnode3off(self):
        count=0
        while count < 10:
haoranc's avatar
haoranc 已提交
223
            time.sleep(0.1)
X
Xiaoyu Wang 已提交
224
            tdSql.query("select * from information_schema.ins_mnodes;")
haoranc's avatar
haoranc 已提交
225
            if tdSql.checkRows(3) :
S
Shengliang Guan 已提交
226
                tdLog.debug("mnode is  three nodes")
haoranc's avatar
haoranc 已提交
227 228 229
            if  tdSql.queryResult[0][2]=='leader' :
                if  tdSql.queryResult[2][2]=='offline':
                    if  tdSql.queryResult[1][2]=='follower':
S
Shengliang Guan 已提交
230
                        tdLog.debug("stop mnodes  on dnode 3 successfully in 10s")
haoranc's avatar
haoranc 已提交
231
                        break
haoranc's avatar
haoranc 已提交
232 233
            count+=1
        else:
S
Shengliang Guan 已提交
234
            tdLog.debug("stop mnodes  on dnode 3 failed in 10s")
haoranc's avatar
haoranc 已提交
235 236
            return -1
        tdSql.error("drop mnode on dnode 3;")
X
Xiaoyu Wang 已提交
237
        tdSql.query("select * from information_schema.ins_mnodes;")
G
Ganlin Zhao 已提交
238
        tdSql.checkRows(3)
haoranc's avatar
haoranc 已提交
239 240 241 242 243 244 245 246 247
        tdSql.checkData(0,1,'%s:6030'%self.host)
        tdSql.checkData(0,2,'leader')
        tdSql.checkData(0,3,'ready')
        tdSql.checkData(1,1,'%s:6130'%self.host)
        tdSql.checkData(1,2,'follower')
        tdSql.checkData(1,3,'ready')
        tdSql.checkData(2,1,'%s:6230'%self.host)
        tdSql.checkData(2,2,'offline')
        tdSql.checkData(2,3,'ready')
haoranc's avatar
haoranc 已提交
248

haoranc's avatar
haoranc 已提交
249 250


haoranc's avatar
haoranc 已提交
251
    def five_dnode_three_mnode(self):
X
Xiaoyu Wang 已提交
252
        tdSql.query("select * from information_schema.ins_dnodes;")
haoranc's avatar
haoranc 已提交
253 254 255
        tdSql.checkData(0,1,'%s:6030'%self.host)
        tdSql.checkData(4,1,'%s:6430'%self.host)
        tdSql.checkData(0,4,'ready')
256 257 258
        tdSql.checkData(1,4,'ready')
        tdSql.checkData(2,4,'ready')
        tdSql.checkData(3,4,'ready')
haoranc's avatar
haoranc 已提交
259
        tdSql.checkData(4,4,'ready')
X
Xiaoyu Wang 已提交
260
        tdSql.query("select * from information_schema.ins_mnodes;")
G
Ganlin Zhao 已提交
261
        tdSql.checkRows(1)
haoranc's avatar
haoranc 已提交
262 263 264 265 266 267 268 269 270 271
        tdSql.checkData(0,1,'%s:6030'%self.host)
        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()
haoranc's avatar
haoranc 已提交
272
        tdSql.error("create mnode on dnode 2")
haoranc's avatar
haoranc 已提交
273 274 275 276 277
        tdSql.error("create mnode on dnode 1")
        tdSql.error("create mnode on dnode 3")

        tdSql.error("drop mnode on dnode 1")

X
Xiaoyu Wang 已提交
278
        tdSql.query("select * from information_schema.ins_dnodes;")
S
Shengliang Guan 已提交
279
        tdLog.debug(tdSql.queryResult)
haoranc's avatar
haoranc 已提交
280

G
Ganlin Zhao 已提交
281 282
        #  drop follower of mnode
        dropcount =0
haoranc's avatar
haoranc 已提交
283
        while dropcount <= 5:
haoranc's avatar
haoranc 已提交
284
            for i in range(1,3):
haoranc's avatar
haoranc 已提交
285
                tdLog.debug("drop mnode on dnode %d"%(i+1))
haoranc's avatar
haoranc 已提交
286
                tdSql.execute("drop mnode on dnode %d"%(i+1))
X
Xiaoyu Wang 已提交
287
                tdSql.query("select * from information_schema.ins_mnodes;")
haoranc's avatar
haoranc 已提交
288 289
                count=0
                while count<10:
haoranc's avatar
haoranc 已提交
290
                    time.sleep(0.1)
X
Xiaoyu Wang 已提交
291
                    tdSql.query("select * from information_schema.ins_mnodes;")
haoranc's avatar
haoranc 已提交
292
                    if tdSql.queryRows == 2:
S
Shengliang Guan 已提交
293
                        tdLog.debug("drop mnode %d successfully"%(i+1))
haoranc's avatar
haoranc 已提交
294 295
                        break
                    count+=1
haoranc's avatar
haoranc 已提交
296
                self.wait_for_transactions(100)
297

haoranc's avatar
haoranc 已提交
298
                tdLog.debug("create mnode on dnode %d"%(i+1))
haoranc's avatar
haoranc 已提交
299
                tdSql.execute("create mnode on dnode %d"%(i+1))
haoranc's avatar
haoranc 已提交
300 301
                count=0
                while count<10:
haoranc's avatar
haoranc 已提交
302
                    time.sleep(0.1)
X
Xiaoyu Wang 已提交
303
                    tdSql.query("select * from information_schema.ins_mnodes;")
haoranc's avatar
haoranc 已提交
304
                    if tdSql.queryRows == 3:
305
                        tdLog.debug("create mnode %d successfully"%(i+1))
haoranc's avatar
haoranc 已提交
306 307
                        break
                    count+=1
haoranc's avatar
haoranc 已提交
308
                self.wait_for_transactions(100)
haoranc's avatar
haoranc 已提交
309 310
            dropcount+=1
        self.check3mnode()
haoranc's avatar
haoranc 已提交
311

312 313 314 315 316
    def wait_for_transactions(self, timeout):
        count=0
        while count<timeout:
            time.sleep(1)
            tdSql.query("show transactions;")
haoranc's avatar
haoranc 已提交
317
            # print(tdSql.queryRows)
haoranc's avatar
haoranc 已提交
318
            if tdSql.queryRows == 0 :
319 320 321 322
                tdLog.debug("transactions completed successfully")
                break
            count+=1
        if count >= timeout:
haoranc's avatar
haoranc 已提交
323
            tdLog.debug("transactions not finished before timeout (%d secs)"%timeout)
haoranc's avatar
haoranc 已提交
324 325 326 327 328 329 330 331

    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)


G
Ganlin Zhao 已提交
332
    def run(self):
S
Shengliang Guan 已提交
333
        # tdLog.debug(self.master_dnode.cfgDict)
haoranc's avatar
haoranc 已提交
334
        self.buildcluster(5)
haoranc's avatar
haoranc 已提交
335
        self.five_dnode_three_mnode()
haoranc's avatar
haoranc 已提交
336 337 338 339 340 341

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

tdCases.addLinux(__file__, TDTestCase())
G
Ganlin Zhao 已提交
342
tdCases.addWindows(__file__, TDTestCase())