dnodes.py 15.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
###################################################################
#           Copyright (c) 2016 by TAOS Technologies, Inc.
#                     All rights reserved.
#
#  This file is proprietary and confidential to TAOS Technologies.
#  No part of this file may be reproduced, stored, transmitted,
#  disclosed or used in any form or by any means other than as
#  expressly provided by the written permission from Jianhui Tao
#
###################################################################

# -*- coding: utf-8 -*-

import sys
import os
import os.path
17
import subprocess
18 19 20 21
from util.log import *


class TDSimClient:
22 23 24
    def __init__(self):
        self.testCluster = False

25
    def init(self, path):
26
        self.__init__()
27 28 29 30 31
        self.path = path

    def getCfgDir(self):
        return self.cfgDir

32 33 34
    def setTestCluster(self, value):
        self.testCluster = value

35 36 37 38 39 40
    def cfg(self, option, value):
        cmd = "echo '%s %s' >> %s" % (option, value, self.cfgPath)
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

    def deploy(self):
41 42 43
        self.logDir = "%s/sim/psim/log" % (self.path,)
        self.cfgDir = "%s/sim/psim/cfg" % (self.path)
        self.cfgPath = "%s/sim/psim/cfg/taos.cfg" % (self.path)
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

        cmd = "rm -rf " + self.logDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "rm -rf " + self.cfgDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "mkdir -p " + self.logDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "mkdir -p " + self.cfgDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "touch " + self.cfgPath
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

65 66 67
        if self.testCluster:
            self.cfg("masterIp", "192.168.0.1")
            self.cfg("secondIp", "192.168.0.2")
68 69 70 71
        self.cfg("logDir", self.logDir)
        self.cfg("numOfLogLines", "100000000")
        self.cfg("numOfThreadsPerCore", "2.0")
        self.cfg("locale", "en_US.UTF-8")
72
        self.cfg("charset", "UTF-8")
73 74
        self.cfg("asyncLog", "0")
        self.cfg("anyIp", "0")
S
scripts  
Shengliang Guan 已提交
75 76
        self.cfg("maxVgroupsPerDb", "4")
        self.cfg("maxTablesPerVnode", "1000")
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
        self.cfg("sdbDebugFlag", "135")
        self.cfg("rpcDebugFlag", "135")
        self.cfg("tmrDebugFlag", "131")
        self.cfg("cDebugFlag", "135")
        self.cfg("udebugFlag", "135")
        self.cfg("jnidebugFlag", "135")
        self.cfg("qdebugFlag", "135")
        tdLog.debug("psim is deployed and configured by %s" % (self.cfgPath))


class TDDnode:
    def __init__(self, index):
        self.index = index
        self.running = 0
        self.deployed = 0
92
        self.testCluster = False
93
        self.valgrind = 0
94 95 96 97

    def init(self, path):
        self.path = path

98 99 100
    def setTestCluster(self, value):
        self.testCluster = value

101 102 103
    def setValgrind(self, value):
        self.valgrind = value

104 105 106 107 108 109 110 111 112 113 114 115 116
    def getDataSize(self):
        totalSize = 0

        if (self.deployed == 1):
            for dirpath, dirnames, filenames in os.walk(self.dataDir):
                for f in filenames:
                    fp = os.path.join(dirpath, f)

                    if not os.path.islink(fp):
                        totalSize = totalSize + os.path.getsize(fp)

        return totalSize

117
    def deploy(self):
118 119 120 121
        self.logDir = "%s/sim/dnode%d/log" % (self.path, self.index)
        self.dataDir = "%s/sim/dnode%d/data" % (self.path, self.index)
        self.cfgDir = "%s/sim/dnode%d/cfg" % (self.path, self.index)
        self.cfgPath = "%s/sim/dnode%d/cfg/taos.cfg" % (
S
Shuduo Sang 已提交
122
            self.path, self.index)
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151

        cmd = "rm -rf " + self.dataDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "rm -rf " + self.logDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "rm -rf " + self.cfgDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "mkdir -p " + self.dataDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "mkdir -p " + self.logDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "mkdir -p " + self.cfgDir
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

        cmd = "touch " + self.cfgPath
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

152 153 154
        if self.testCluster:
            self.startIP()

155 156 157 158 159 160
        if self.testCluster:
            self.cfg("masterIp", "192.168.0.1")
            self.cfg("secondIp", "192.168.0.2")
            self.cfg("publicIp", "192.168.0.%d" % (self.index))
            self.cfg("internalIp", "192.168.0.%d" % (self.index))
            self.cfg("privateIp", "192.168.0.%d" % (self.index))
161 162 163
        self.cfg("dataDir", self.dataDir)
        self.cfg("logDir", self.logDir)
        self.cfg("numOfLogLines", "100000000")
S
Shengliang Guan 已提交
164
        self.cfg("mnodeEqualVnodeNum", "0")
165
        self.cfg("walLevel", "1")
166 167
        self.cfg("statusInterval", "1")
        self.cfg("numOfTotalVnodes", "64")
168
        self.cfg("numOfMnodes", "3")
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
        self.cfg("numOfThreadsPerCore", "2.0")
        self.cfg("monitor", "0")
        self.cfg("maxVnodeConnections", "30000")
        self.cfg("maxMgmtConnections", "30000")
        self.cfg("maxMeterConnections", "30000")
        self.cfg("maxShellConns", "30000")
        self.cfg("locale", "en_US.UTF-8")
        self.cfg("charset", "UTF-8")
        self.cfg("asyncLog", "0")
        self.cfg("anyIp", "0")
        self.cfg("dDebugFlag", "135")
        self.cfg("mDebugFlag", "135")
        self.cfg("sdbDebugFlag", "135")
        self.cfg("rpcDebugFlag", "135")
        self.cfg("tmrDebugFlag", "131")
        self.cfg("cDebugFlag", "135")
        self.cfg("httpDebugFlag", "135")
        self.cfg("monitorDebugFlag", "135")
        self.cfg("udebugFlag", "135")
        self.cfg("jnidebugFlag", "135")
        self.cfg("qdebugFlag", "135")
        self.deployed = 1
        tdLog.debug(
            "dnode:%d is deployed and configured by %s" %
            (self.index, self.cfgPath))

195
    def getBuildPath(self):
196 197
        selfPath = os.path.dirname(os.path.realpath(__file__))

198
        if ("community" in selfPath):
199
            projPath = selfPath[:selfPath.find("community")]
200
        else:
201 202 203 204 205 206
            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):
S
Shuduo Sang 已提交
207
                    buildPath = root[:len(root)-len("/build/bin")]
208 209 210 211 212 213 214
                    break
        return buildPath

    def start(self):
        buildPath = self.getBuildPath()

        if (buildPath == ""):
215
            tdLog.exit("taosd not found!")
216
        else:
217 218 219
            tdLog.info("taosd found in %s" % buildPath)

        binPath = buildPath + "/build/bin/taosd"
220 221 222

        if self.deployed == 0:
            tdLog.exit("dnode:%d is not deployed" % (self.index))
223 224

        if self.valgrind == 0:
225
            cmd = "nohup %s -c %s > /dev/null 2>&1 & " % (
226 227 228 229
                binPath, self.cfgDir)
        else:
            valgrindCmdline = "valgrind --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes"

230
            cmd = "nohup %s %s -c %s 2>&1 & " % (
231 232 233 234
                valgrindCmdline, binPath, self.cfgDir)

            print(cmd)

235 236 237 238 239
        if os.system(cmd) != 0:
            tdLog.exit(cmd)
        self.running = 1
        tdLog.debug("dnode:%d is running with %s " % (self.index, cmd))

240 241
        tdLog.debug("wait 5 seconds for the dnode:%d to start." % (self.index))
        time.sleep(5)
242 243

    def stop(self):
244 245 246 247 248
        if self.valgrind == 0:
            toBeKilled = "taosd"
        else:
            toBeKilled = "valgrind.bin"

249
        if self.running != 0:
250
            psCmd = "ps -ef|grep -w %s| grep -v grep | awk '{print $2}'" % toBeKilled
S
Shuduo Sang 已提交
251 252
            processID = subprocess.check_output(
                psCmd, shell=True).decode("utf-8")
253 254

            while(processID):
255
                killCmd = "kill -INT %s > /dev/null 2>&1" % processID
256 257
                os.system(killCmd)
                time.sleep(1)
S
Shuduo Sang 已提交
258 259
                processID = subprocess.check_output(
                    psCmd, shell=True).decode("utf-8")
260 261 262 263 264
            for port in range(6030, 6041):
                fuserCmd = "fuser -k -n tcp %d" % port
                os.system(fuserCmd)
            if self.valgrind:
                time.sleep(2)
265

S
Shuduo Sang 已提交
266
            self.running = 0
267
            tdLog.debug("dnode:%d is stopped by kill -INT" % (self.index))
268 269

    def forcestop(self):
270 271 272 273 274
        if self.valgrind == 0:
            toBeKilled = "taosd"
        else:
            toBeKilled = "valgrind.bin"

275
        if self.running != 0:
276
            psCmd = "ps -ef|grep -w %s| grep -v grep | awk '{print $2}'" % toBeKilled
S
Shuduo Sang 已提交
277 278
            processID = subprocess.check_output(
                psCmd, shell=True).decode("utf-8")
279 280

            while(processID):
281
                killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
282 283
                os.system(killCmd)
                time.sleep(1)
S
Shuduo Sang 已提交
284 285
                processID = subprocess.check_output(
                    psCmd, shell=True).decode("utf-8")
286 287 288 289 290
            for port in range(6030, 6041):
                fuserCmd = "fuser -k -n tcp %d" % port
                os.system(fuserCmd)
            if self.valgrind:
                time.sleep(2)
291

S
Shuduo Sang 已提交
292
            self.running = 0
293
            tdLog.debug("dnode:%d is stopped by kill -KILL" % (self.index))
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311

    def startIP(self):
        cmd = "sudo ifconfig lo:%d 192.168.0.%d up" % (self.index, self.index)
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

    def stopIP(self):
        cmd = "sudo ifconfig lo:%d 192.168.0.%d down" % (
            self.index, self.index)
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

    def cfg(self, option, value):
        cmd = "echo '%s %s' >> %s" % (option, value, self.cfgPath)
        if os.system(cmd) != 0:
            tdLog.exit(cmd)

    def getDnodeRootDir(self, index):
312
        dnodeRootDir = "%s/sim/psim/dnode%d" % (self.path, index)
313 314 315
        return dnodeRootDir

    def getDnodesRootDir(self):
316
        dnodesRootDir = "%s/sim/psim" % (self.path)
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
        return dnodesRootDir


class TDDnodes:
    def __init__(self):
        self.dnodes = []
        self.dnodes.append(TDDnode(1))
        self.dnodes.append(TDDnode(2))
        self.dnodes.append(TDDnode(3))
        self.dnodes.append(TDDnode(4))
        self.dnodes.append(TDDnode(5))
        self.dnodes.append(TDDnode(6))
        self.dnodes.append(TDDnode(7))
        self.dnodes.append(TDDnode(8))
        self.dnodes.append(TDDnode(9))
        self.dnodes.append(TDDnode(10))
333
        self.simDeployed = False
334 335

    def init(self, path):
336
        psCmd = "ps -ef|grep -w taosd| grep -v grep | awk '{print $2}'"
S
Shuduo Sang 已提交
337
        processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
338
        while(processID):
339
            killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
340 341
            os.system(killCmd)
            time.sleep(1)
S
Shuduo Sang 已提交
342 343
            processID = subprocess.check_output(
                psCmd, shell=True).decode("utf-8")
344 345

        psCmd = "ps -ef|grep -w valgrind.bin| grep -v grep | awk '{print $2}'"
S
Shuduo Sang 已提交
346
        processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
347
        while(processID):
348
            killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
349 350
            os.system(killCmd)
            time.sleep(1)
S
Shuduo Sang 已提交
351 352
            processID = subprocess.check_output(
                psCmd, shell=True).decode("utf-8")
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382

        binPath = os.path.dirname(os.path.realpath(__file__))
        binPath = binPath + "/../../../debug/"
        tdLog.debug("binPath %s" % (binPath))
        binPath = os.path.realpath(binPath)
        tdLog.debug("binPath real path %s" % (binPath))

        # cmd = "sudo cp %s/build/lib/libtaos.so /usr/local/lib/taos/" % (binPath)
        # tdLog.debug(cmd)
        # os.system(cmd)

        # cmd = "sudo cp %s/build/bin/taos /usr/local/bin/taos/" % (binPath)
        # if os.system(cmd) != 0 :
        #  tdLog.exit(cmd)
        # tdLog.debug("execute %s" % (cmd))

        # cmd = "sudo cp %s/build/bin/taosd /usr/local/bin/taos/" % (binPath)
        # if os.system(cmd) != 0 :
        # tdLog.exit(cmd)
        # tdLog.debug("execute %s" % (cmd))

        if path == "":
            # self.path = os.path.expanduser('~')
            self.path = os.path.abspath(binPath + "../../")
        else:
            self.path = os.path.realpath(path)

        for i in range(len(self.dnodes)):
            self.dnodes[i].init(self.path)

383 384 385
    def setTestCluster(self, value):
        self.testCluster = value

386 387 388
    def setValgrind(self, value):
        self.valgrind = value

389
    def deploy(self, index):
390 391 392
        self.sim = TDSimClient()
        self.sim.init(self.path)
        self.sim.setTestCluster(self.testCluster)
393 394 395 396

        if (self.simDeployed == False):
            self.sim.deploy()
            self.simDeployed = True
397

398
        self.check(index)
399
        self.dnodes[index - 1].setTestCluster(self.testCluster)
400
        self.dnodes[index - 1].setValgrind(self.valgrind)
401 402 403 404 405 406 407 408 409 410 411 412 413 414
        self.dnodes[index - 1].deploy()

    def cfg(self, index, option, value):
        self.check(index)
        self.dnodes[index - 1].cfg(option, value)

    def start(self, index):
        self.check(index)
        self.dnodes[index - 1].start()

    def stop(self, index):
        self.check(index)
        self.dnodes[index - 1].stop()

415 416 417 418
    def getDataSize(self, index):
        self.check(index)
        return self.dnodes[index - 1].getDataSize()

419 420 421 422 423 424
    def forcestop(self, index):
        self.check(index)
        self.dnodes[index - 1].forcestop()

    def startIP(self, index):
        self.check(index)
425 426 427

        if self.testCluster:
            self.dnodes[index - 1].startIP()
428 429 430

    def stopIP(self, index):
        self.check(index)
431 432 433

        if self.dnodes[index - 1].testCluster:
            self.dnodes[index - 1].stopIP()
434 435 436 437 438 439

    def check(self, index):
        if index < 1 or index > 10:
            tdLog.exit("index:%d should on a scale of [1, 10]" % (index))

    def stopAll(self):
S
Shuduo Sang 已提交
440
        tdLog.info("stop all dnodes")
441 442 443
        for i in range(len(self.dnodes)):
            self.dnodes[i].stop()

444
        psCmd = "ps -ef | grep -w taosd | grep 'root' | grep -v grep | awk '{print $2}'"
S
Shuduo Sang 已提交
445
        processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
446 447 448
        if processID:
            cmd = "sudo systemctl stop taosd"
            os.system(cmd)
449 450
        # if os.system(cmd) != 0 :
        # tdLog.exit(cmd)
451
        psCmd = "ps -ef|grep -w taosd| grep -v grep | awk '{print $2}'"
S
Shuduo Sang 已提交
452
        processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
453
        while(processID):
454
            killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
455 456
            os.system(killCmd)
            time.sleep(1)
S
Shuduo Sang 已提交
457 458
            processID = subprocess.check_output(
                psCmd, shell=True).decode("utf-8")
459 460

        psCmd = "ps -ef|grep -w valgrind.bin| grep -v grep | awk '{print $2}'"
S
Shuduo Sang 已提交
461
        processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
462
        while(processID):
463
            killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
464 465
            os.system(killCmd)
            time.sleep(1)
S
Shuduo Sang 已提交
466 467
            processID = subprocess.check_output(
                psCmd, shell=True).decode("utf-8")
468

469 470 471 472
        # if os.system(cmd) != 0 :
        # tdLog.exit(cmd)

    def getDnodesRootDir(self):
473
        dnodesRootDir = "%s/sim" % (self.path)
474 475 476 477 478 479 480
        return dnodesRootDir

    def getSimCfgPath(self):
        return self.sim.getCfgDir()


tdDnodes = TDDnodes()