dnodes.py 15.5 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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
        self.cfg("asyncLog", "0")
        self.cfg("anyIp", "0")
        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
90
        self.testCluster = False
91
        self.valgrind = 0
92 93 94 95

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

96 97 98
    def setTestCluster(self, value):
        self.testCluster = value

99 100 101
    def setValgrind(self, value):
        self.valgrind = value

102 103 104 105 106 107 108 109 110 111 112 113 114
    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

115
    def deploy(self):
116 117 118 119
        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 已提交
120
            self.path, self.index)
121 122 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

        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)

150 151 152
        if self.testCluster:
            self.startIP()

153 154 155 156 157 158
        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))
159 160 161
        self.cfg("dataDir", self.dataDir)
        self.cfg("logDir", self.logDir)
        self.cfg("numOfLogLines", "100000000")
S
Shengliang Guan 已提交
162
        self.cfg("mnodeEqualVnodeNum", "0")
163
        self.cfg("walLevel", "1")
164 165
        self.cfg("statusInterval", "1")
        self.cfg("numOfTotalVnodes", "64")
166
        self.cfg("numOfMnodes", "3")
167 168 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
        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))

    def start(self):
194 195 196
        selfPath = os.path.dirname(os.path.realpath(__file__))
        binPath = ""

197
        if ("community" in selfPath):
198 199 200 201 202
            projPath = selfPath + "/../../../../"

            for root, dirs, files in os.walk(projPath):
                if ("taosd" in files):
                    rootRealPath = os.path.dirname(os.path.realpath(root))
203
                    if ("packaging" not in rootRealPath):
204
                        binPath = os.path.join(root, "taosd")
S
Shuduo Sang 已提交
205
                        break
206 207 208 209 210 211 212
        else:
            projPath = selfPath + "/../../../"
            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):
                        binPath = os.path.join(root, "taosd")
S
Shuduo Sang 已提交
213
                        break
214 215

        if (binPath == ""):
216
            tdLog.exit("taosd not found!")
217
        else:
S
Shuduo Sang 已提交
218
            tdLog.info("taosd found in %s" % rootRealPath)
219 220 221

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

        if self.valgrind == 0:
224
            cmd = "nohup %s -c %s > /dev/null 2>&1 & " % (
225 226 227 228
                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"

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

            print(cmd)

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

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

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

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

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

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

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

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

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

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

    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):
311
        dnodeRootDir = "%s/sim/psim/dnode%d" % (self.path, index)
312 313 314
        return dnodeRootDir

    def getDnodesRootDir(self):
315
        dnodesRootDir = "%s/sim/psim" % (self.path)
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
        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))
332
        self.simDeployed = False
333 334

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

        psCmd = "ps -ef|grep -w valgrind.bin| grep -v grep | awk '{print $2}'"
S
Shuduo Sang 已提交
345
        processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
346
        while(processID):
347
            killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
348 349
            os.system(killCmd)
            time.sleep(1)
S
Shuduo Sang 已提交
350 351
            processID = subprocess.check_output(
                psCmd, shell=True).decode("utf-8")
352 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

        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)

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

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

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

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

397
        self.check(index)
398
        self.dnodes[index - 1].setTestCluster(self.testCluster)
399
        self.dnodes[index - 1].setValgrind(self.valgrind)
400 401 402 403 404 405 406 407 408 409 410 411 412 413
        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()

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

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

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

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

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

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

    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 已提交
439
        tdLog.info("stop all dnodes")
440 441 442
        for i in range(len(self.dnodes)):
            self.dnodes[i].stop()

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

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

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

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

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


tdDnodes = TDDnodes()