2022-03-07 11:25:29 +00:00
###################################################################
# 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
import platform
2023-02-10 05:00:55 +00:00
import distro
2022-03-07 11:25:29 +00:00
import subprocess
from time import sleep
2022-05-28 07:30:14 +00:00
import base64
import json
import copy
from fabric2 import Connection
2022-03-07 11:25:29 +00:00
from util . log import *
2023-02-10 05:00:55 +00:00
from shutil import which
2022-03-07 11:25:29 +00:00
class TDSimClient :
def __init__ ( self , path ) :
self . testCluster = False
self . path = path
self . cfgDict = {
2023-01-28 02:33:00 +00:00
" fqdn " : " localhost " ,
2022-03-07 11:25:29 +00:00
" numOfLogLines " : " 100000000 " ,
" locale " : " en_US.UTF-8 " ,
" charset " : " UTF-8 " ,
" asyncLog " : " 0 " ,
2023-10-17 10:26:04 +00:00
" rpcDebugFlag " : " 135 " ,
2024-07-16 09:25:37 +00:00
" tmrDebugFlag " : " 131 " ,
" dDebugFlag " : " 131 " ,
" cDebugFlag " : " 131 " ,
" uDebugFlag " : " 131 " ,
" jniDebugFlag " : " 131 " ,
2023-10-17 10:26:04 +00:00
" qDebugFlag " : " 135 " ,
2022-08-09 05:35:01 +00:00
" supportVnodes " : " 1024 " ,
2022-10-27 11:22:42 +00:00
" enableQueryHb " : " 1 " ,
2022-03-07 11:25:29 +00:00
" telemetryReporting " : " 0 " ,
2023-03-02 02:00:00 +00:00
" tqDebugflag " : " 135 " ,
2024-07-16 09:25:37 +00:00
" stDebugflag " : " 135 " ,
2022-03-07 11:25:29 +00:00
}
def getLogDir ( self ) :
2023-03-16 02:18:06 +00:00
self . logDir = os . path . join ( self . path , " sim " , " psim " , " log " )
2022-03-07 11:25:29 +00:00
return self . logDir
def getCfgDir ( self ) :
2023-03-16 02:18:06 +00:00
self . cfgDir = os . path . join ( self . path , " sim " , " psim " , " cfg " )
2022-03-07 11:25:29 +00:00
return self . cfgDir
def setTestCluster ( self , value ) :
self . testCluster = value
def addExtraCfg ( self , option , value ) :
self . cfgDict . update ( { option : value } )
def cfg ( self , option , value ) :
cmd = " echo %s %s >> %s " % ( option , value , self . cfgPath )
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
2022-04-26 10:46:08 +00:00
def deploy ( self , * updatecfgDict ) :
2023-03-16 02:18:06 +00:00
self . logDir = os . path . join ( self . path , " sim " , " psim " , " log " )
self . cfgDir = os . path . join ( self . path , " sim " , " psim " , " cfg " )
self . cfgPath = os . path . join ( self . path , " sim " , " psim " , " cfg " , " taos.cfg " )
2022-03-07 11:25:29 +00:00
cmd = " rm -rf " + self . logDir
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
2022-03-26 14:49:42 +00:00
2022-05-25 08:30:26 +00:00
# cmd = "mkdir -p " + self.logDir
# if os.system(cmd) != 0:
# tdLog.exit(cmd)
os . makedirs ( self . logDir )
2022-03-07 11:25:29 +00:00
cmd = " rm -rf " + self . cfgDir
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
2022-05-25 08:30:26 +00:00
# cmd = "mkdir -p " + self.cfgDir
# if os.system(cmd) != 0:
# tdLog.exit(cmd)
os . makedirs ( self . cfgDir )
2022-03-07 11:25:29 +00:00
cmd = " touch " + self . cfgPath
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
if self . testCluster :
self . cfg ( " masterIp " , " 192.168.0.1 " )
self . cfg ( " secondIp " , " 192.168.0.2 " )
self . cfg ( " logDir " , self . logDir )
for key , value in self . cfgDict . items ( ) :
self . cfg ( key , value )
2022-07-19 08:39:50 +00:00
2022-04-27 02:02:22 +00:00
try :
2022-07-19 08:39:50 +00:00
if bool ( updatecfgDict ) and updatecfgDict [ 0 ] and updatecfgDict [ 0 ] [ 0 ] :
2022-04-27 02:02:22 +00:00
clientCfg = dict ( updatecfgDict [ 0 ] [ 0 ] . get ( ' clientCfg ' ) )
for key , value in clientCfg . items ( ) :
self . cfg ( key , value )
except Exception :
pass
2022-03-07 11:25:29 +00:00
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
self . testCluster = False
self . valgrind = 0
2022-11-19 02:54:38 +00:00
self . asan = False
2022-05-28 07:30:14 +00:00
self . remoteIP = " "
2022-03-07 11:25:29 +00:00
self . cfgDict = {
2023-01-28 02:33:00 +00:00
" fqdn " : " localhost " ,
2022-03-26 14:49:42 +00:00
" monitor " : " 0 " ,
" maxShellConns " : " 30000 " ,
" locale " : " en_US.UTF-8 " ,
" charset " : " UTF-8 " ,
2024-07-16 09:25:37 +00:00
" asyncLog " : " 0 " ,
2024-04-15 09:54:07 +00:00
" mDebugFlag " : " 135 " ,
2024-07-16 09:25:37 +00:00
" dDebugFlag " : " 131 " ,
" vDebugFlag " : " 131 " ,
2024-04-15 09:54:07 +00:00
" tqDebugFlag " : " 135 " ,
2024-07-16 09:25:37 +00:00
" cDebugFlag " : " 131 " ,
2024-04-15 09:54:07 +00:00
" stDebugFlag " : " 135 " ,
2024-07-16 09:25:37 +00:00
" smaDebugFlag " : " 131 " ,
" jniDebugFlag " : " 131 " ,
" qDebugFlag " : " 131 " ,
2024-04-15 09:54:07 +00:00
" rpcDebugFlag " : " 135 " ,
2024-07-16 09:25:37 +00:00
" tmrDebugFlag " : " 131 " ,
" uDebugFlag " : " 131 " ,
" sDebugFlag " : " 131 " ,
" wDebugFlag " : " 131 " ,
2022-05-13 08:01:05 +00:00
" numOfLogLines " : " 100000000 " ,
" statusInterval " : " 1 " ,
2022-10-27 11:22:42 +00:00
" enableQueryHb " : " 1 " ,
2022-08-09 05:35:01 +00:00
" supportVnodes " : " 1024 " ,
2022-05-13 08:01:05 +00:00
" telemetryReporting " : " 0 "
2022-03-07 11:25:29 +00:00
}
2022-05-28 07:30:14 +00:00
def init ( self , path , remoteIP = " " ) :
2022-03-07 11:25:29 +00:00
self . path = path
2022-05-28 07:30:14 +00:00
self . remoteIP = remoteIP
2022-06-05 09:02:43 +00:00
if ( not self . remoteIP == " " ) :
try :
self . config = eval ( self . remoteIP )
self . remote_conn = Connection ( host = self . config [ " host " ] , port = self . config [ " port " ] , user = self . config [ " user " ] , connect_kwargs = { ' password ' : self . config [ " password " ] } )
except Exception as r :
print ( r )
2022-03-07 11:25:29 +00:00
def setTestCluster ( self , value ) :
self . testCluster = value
def setValgrind ( self , value ) :
self . valgrind = value
2022-11-19 02:54:38 +00:00
def setAsan ( self , value ) :
self . asan = value
if value :
2022-11-20 13:26:54 +00:00
selfPath = os . path . dirname ( os . path . realpath ( __file__ ) )
if ( " community " in selfPath ) :
2023-02-10 05:00:55 +00:00
self . execPath = os . path . abspath ( self . path + " /community/tests/script/sh/exec.sh " )
2022-11-20 13:26:54 +00:00
else :
2023-02-10 05:00:55 +00:00
self . execPath = os . path . abspath ( self . path + " /tests/script/sh/exec.sh " )
2022-11-19 02:54:38 +00:00
2022-03-07 11:25:29 +00:00
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
def addExtraCfg ( self , option , value ) :
self . cfgDict . update ( { option : value } )
2022-05-28 07:30:14 +00:00
def remoteExec ( self , updateCfgDict , execCmd ) :
valgrindStr = ' '
if ( self . valgrind == 1 ) :
valgrindStr = ' -g '
remoteCfgDict = copy . deepcopy ( updateCfgDict )
if ( " logDir " in remoteCfgDict ) :
del remoteCfgDict [ " logDir " ]
if ( " dataDir " in remoteCfgDict ) :
del remoteCfgDict [ " dataDir " ]
if ( " cfgDir " in remoteCfgDict ) :
del remoteCfgDict [ " cfgDir " ]
remoteCfgDictStr = base64 . b64encode ( json . dumps ( remoteCfgDict ) . encode ( ) ) . decode ( )
execCmdStr = base64 . b64encode ( execCmd . encode ( ) ) . decode ( )
2022-06-05 09:02:43 +00:00
with self . remote_conn . cd ( ( self . config [ " path " ] + sys . path [ 0 ] . replace ( self . path , ' ' ) ) . replace ( ' \\ ' , ' / ' ) ) :
self . remote_conn . run ( " python3 ./test.py %s -d %s -e %s " % ( valgrindStr , remoteCfgDictStr , execCmdStr ) )
2022-05-28 07:30:14 +00:00
2022-03-07 11:25:29 +00:00
def deploy ( self , * updatecfgDict ) :
2023-03-16 02:18:06 +00:00
self . logDir = os . path . join ( self . path , " sim " , " dnode %d " % self . index , " log " )
self . dataDir = os . path . join ( self . path , " sim " , " dnode %d " % self . index , " data " )
self . cfgDir = os . path . join ( self . path , " sim " , " dnode %d " % self . index , " cfg " )
self . cfgPath = os . path . join ( self . path , " sim " , " dnode %d " % self . index , " cfg " , " taos.cfg " )
2022-03-07 11:25:29 +00:00
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 )
2022-05-25 08:30:26 +00:00
# cmd = "mkdir -p " + self.dataDir
# if os.system(cmd) != 0:
# tdLog.exit(cmd)
os . makedirs ( self . dataDir )
2022-03-07 11:25:29 +00:00
2022-05-25 08:30:26 +00:00
# cmd = "mkdir -p " + self.logDir
# if os.system(cmd) != 0:
# tdLog.exit(cmd)
os . makedirs ( self . logDir )
2022-03-07 11:25:29 +00:00
2022-05-25 08:30:26 +00:00
# cmd = "mkdir -p " + self.cfgDir
# if os.system(cmd) != 0:
# tdLog.exit(cmd)
os . makedirs ( self . cfgDir )
2022-03-07 11:25:29 +00:00
cmd = " touch " + self . cfgPath
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
if self . testCluster :
self . startIP ( )
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 ) )
self . cfgDict [ " dataDir " ] = self . dataDir
self . cfgDict [ " logDir " ] = self . logDir
# self.cfg("dataDir",self.dataDir)
# self.cfg("logDir",self.logDir)
# print(updatecfgDict)
isFirstDir = 1
2022-04-26 10:46:08 +00:00
if bool ( updatecfgDict ) and updatecfgDict [ 0 ] and updatecfgDict [ 0 ] [ 0 ] :
2022-03-26 14:49:42 +00:00
for key , value in updatecfgDict [ 0 ] [ 0 ] . items ( ) :
2022-06-03 08:13:06 +00:00
if key == " clientCfg " and self . remoteIP == " " and not platform . system ( ) . lower ( ) == ' windows ' :
2022-04-26 10:46:08 +00:00
continue
2022-03-26 14:49:42 +00:00
if value == ' dataDir ' :
2022-03-07 11:25:29 +00:00
if isFirstDir :
self . cfgDict . pop ( ' dataDir ' )
2022-03-26 14:49:42 +00:00
self . cfg ( value , key )
2022-03-07 11:25:29 +00:00
isFirstDir = 0
else :
2022-03-26 14:49:42 +00:00
self . cfg ( value , key )
2022-03-07 11:25:29 +00:00
else :
2022-03-26 14:49:42 +00:00
self . addExtraCfg ( key , value )
2022-05-28 07:30:14 +00:00
if ( self . remoteIP == " " ) :
for key , value in self . cfgDict . items ( ) :
self . cfg ( key , value )
else :
self . remoteExec ( self . cfgDict , " tdDnodes.deploy( %d ,updateCfgDict) " % self . index )
2022-03-07 11:25:29 +00:00
self . deployed = 1
tdLog . debug (
" dnode: %d is deployed and configured by %s " %
( self . index , self . cfgPath ) )
2022-03-26 14:49:42 +00:00
def getPath ( self , tool = " taosd " ) :
2022-03-07 11:25:29 +00:00
selfPath = os . path . dirname ( os . path . realpath ( __file__ ) )
if ( " community " in selfPath ) :
projPath = selfPath [ : selfPath . find ( " community " ) ]
else :
projPath = selfPath [ : selfPath . find ( " tests " ) ]
2022-03-26 14:49:42 +00:00
paths = [ ]
2022-03-07 11:25:29 +00:00
for root , dirs , files in os . walk ( projPath ) :
2022-05-27 11:00:48 +00:00
if ( ( tool ) in files or ( " %s .exe " % tool ) in files ) :
2022-03-07 11:25:29 +00:00
rootRealPath = os . path . dirname ( os . path . realpath ( root ) )
if ( " packaging " not in rootRealPath ) :
2022-03-26 14:49:42 +00:00
paths . append ( os . path . join ( root , tool ) )
2022-03-07 11:25:29 +00:00
break
2022-05-25 08:30:26 +00:00
if ( len ( paths ) == 0 ) :
return " "
2022-03-26 14:49:42 +00:00
return paths [ 0 ]
2022-03-07 11:25:29 +00:00
2022-06-11 12:30:02 +00:00
def starttaosd ( self ) :
binPath = self . getPath ( )
if ( binPath == " " ) :
tdLog . exit ( " taosd not found! " )
else :
tdLog . info ( " taosd found: %s " % binPath )
if self . deployed == 0 :
tdLog . exit ( " dnode: %d is not deployed " % ( self . index ) )
if self . valgrind == 0 :
if platform . system ( ) . lower ( ) == ' windows ' :
2022-07-20 12:57:48 +00:00
cmd = " mintty -h never %s -c %s " % (
2022-06-11 12:30:02 +00:00
binPath , self . cfgDir )
else :
2022-11-24 05:52:09 +00:00
if self . asan :
asanDir = " %s /sim/asan/dnode %d .asan " % (
self . path , self . index )
cmd = " nohup %s -c %s > /dev/null 2> %s & " % (
binPath , self . cfgDir , asanDir )
else :
cmd = " nohup %s -c %s > /dev/null 2>&1 & " % (
binPath , self . cfgDir )
2022-06-11 12:30:02 +00:00
else :
valgrindCmdline = " valgrind --log-file= \" %s /../log/valgrind.log \" --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes " % self . cfgDir
if platform . system ( ) . lower ( ) == ' windows ' :
2022-07-20 12:57:48 +00:00
cmd = " mintty -h never %s %s -c %s " % (
2022-06-11 12:30:02 +00:00
valgrindCmdline , binPath , self . cfgDir )
else :
cmd = " nohup %s %s -c %s 2>&1 & " % (
valgrindCmdline , binPath , self . cfgDir )
print ( cmd )
if ( not self . remoteIP == " " ) :
self . remoteExec ( self . cfgDict , " tdDnodes.dnodes[ %d ].deployed=1 \n tdDnodes.dnodes[ %d ].logDir= \" %% s/sim/dnode %% d/log \" %% (tdDnodes.dnodes[ %d ].path, %d ) \n tdDnodes.dnodes[ %d ].cfgDir= \" %% s/sim/dnode %% d/cfg \" %% (tdDnodes.dnodes[ %d ].path, %d ) \n tdDnodes.start( %d ) " % ( self . index - 1 , self . index - 1 , self . index - 1 , self . index , self . index - 1 , self . index - 1 , self . index , self . index ) )
self . running = 1
else :
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
self . running = 1
tdLog . debug ( " dnode: %d is running with %s " % ( self . index , cmd ) )
if self . valgrind == 0 :
time . sleep ( 0.1 )
key1 = ' from offline to online '
bkey1 = bytes ( key1 , encoding = " utf8 " )
key2 = ' TDengine initialized successfully '
bkey2 = bytes ( key2 , encoding = " utf8 " )
logFile = self . logDir + " /taosdlog.0 "
i = 0
2022-06-15 10:14:11 +00:00
# while not os.path.exists(logFile):
# sleep(0.1)
# i += 1
# if i > 10:
# break
# tailCmdStr = 'tail -f '
# if platform.system().lower() == 'windows':
# tailCmdStr = 'tail -n +0 -f '
# popen = subprocess.Popen(
# tailCmdStr + logFile,
# stdout=subprocess.PIPE,
# stderr=subprocess.PIPE,
# shell=True)
# pid = popen.pid
# # print('Popen.pid:' + str(pid))
# timeout = time.time() + 60 * 2
2022-06-11 12:30:02 +00:00
# while True:
# line = popen.stdout.readline().strip()
# print(line)
# if bkey1 in line:
# popen.kill()
# break
# elif bkey2 in line:
# popen.kill()
2022-07-19 08:39:50 +00:00
# break
2022-06-11 12:30:02 +00:00
# if time.time() > timeout:
# print(time.time(),timeout)
# tdLog.exit('wait too long for taosd start')
tdLog . debug ( " the dnode: %d has been started. " % ( self . index ) )
else :
tdLog . debug (
" wait 10 seconds for the dnode: %d to start. " %
( self . index ) )
time . sleep ( 10 )
2022-03-07 11:25:29 +00:00
def start ( self ) :
2022-03-26 14:49:42 +00:00
binPath = self . getPath ( )
2022-03-07 11:25:29 +00:00
2022-03-26 14:49:42 +00:00
if ( binPath == " " ) :
2022-03-07 11:25:29 +00:00
tdLog . exit ( " taosd not found! " )
else :
2022-03-26 14:49:42 +00:00
tdLog . info ( " taosd found: %s " % binPath )
2022-03-07 11:25:29 +00:00
if self . deployed == 0 :
tdLog . exit ( " dnode: %d is not deployed " % ( self . index ) )
if self . valgrind == 0 :
2022-05-28 07:30:14 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
2022-07-14 05:58:23 +00:00
cmd = " mintty -h never %s -c %s " % (
2022-05-28 07:30:14 +00:00
binPath , self . cfgDir )
else :
2022-11-19 02:54:38 +00:00
if self . asan :
2022-11-20 04:23:59 +00:00
asanDir = " %s /sim/asan/dnode %d .asan " % (
2022-11-19 02:54:38 +00:00
self . path , self . index )
cmd = " nohup %s -c %s > /dev/null 2> %s & " % (
binPath , self . cfgDir , asanDir )
else :
cmd = " nohup %s -c %s > /dev/null 2>&1 & " % (
binPath , self . cfgDir )
2022-03-07 11:25:29 +00:00
else :
2022-05-22 08:41:10 +00:00
valgrindCmdline = " valgrind --log-file= \" %s /../log/valgrind.log \" --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes " % self . cfgDir
2022-03-07 11:25:29 +00:00
2022-05-28 07:30:14 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
2022-07-14 05:58:23 +00:00
cmd = " mintty -h never %s %s -c %s " % (
2022-05-28 07:30:14 +00:00
valgrindCmdline , binPath , self . cfgDir )
else :
cmd = " nohup %s %s -c %s 2>&1 & " % (
valgrindCmdline , binPath , self . cfgDir )
2022-03-07 11:25:29 +00:00
print ( cmd )
2022-05-28 07:30:14 +00:00
if ( not self . remoteIP == " " ) :
2022-06-05 12:44:13 +00:00
self . remoteExec ( self . cfgDict , " tdDnodes.dnodes[ %d ].deployed=1 \n tdDnodes.dnodes[ %d ].logDir= \" %% s/sim/dnode %% d/log \" %% (tdDnodes.dnodes[ %d ].path, %d ) \n tdDnodes.dnodes[ %d ].cfgDir= \" %% s/sim/dnode %% d/cfg \" %% (tdDnodes.dnodes[ %d ].path, %d ) \n tdDnodes.start( %d ) " % ( self . index - 1 , self . index - 1 , self . index - 1 , self . index , self . index - 1 , self . index - 1 , self . index , self . index ) )
2022-05-28 07:30:14 +00:00
self . running = 1
2022-05-25 08:30:26 +00:00
else :
2022-06-09 11:11:44 +00:00
os . system ( " rm -rf %s /taosdlog.0 " % self . logDir )
2022-05-28 07:30:14 +00:00
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
self . running = 1
tdLog . debug ( " dnode: %d is running with %s " % ( self . index , cmd ) )
if self . valgrind == 0 :
time . sleep ( 0.1 )
key = ' from offline to online '
bkey = bytes ( key , encoding = " utf8 " )
logFile = self . logDir + " /taosdlog.0 "
i = 0
while not os . path . exists ( logFile ) :
sleep ( 0.1 )
i + = 1
if i > 50 :
break
2022-09-23 09:50:43 +00:00
with open ( logFile ) as f :
2022-11-04 08:17:05 +00:00
timeout = time . time ( ) + 10 * 2
2022-09-23 09:50:43 +00:00
while True :
line = f . readline ( ) . encode ( ' utf-8 ' )
if bkey in line :
break
if time . time ( ) > timeout :
tdLog . exit ( ' wait too long for taosd start ' )
tdLog . debug ( " the dnode: %d has been started. " % ( self . index ) )
2022-05-28 07:30:14 +00:00
else :
tdLog . debug (
" wait 10 seconds for the dnode: %d to start. " %
( self . index ) )
time . sleep ( 10 )
2022-03-26 14:49:42 +00:00
2022-03-07 11:25:29 +00:00
def startWithoutSleep ( self ) :
2022-03-26 14:49:42 +00:00
binPath = self . getPath ( )
2022-03-07 11:25:29 +00:00
2022-03-26 14:49:42 +00:00
if ( binPath == " " ) :
2022-03-07 11:25:29 +00:00
tdLog . exit ( " taosd not found! " )
else :
2022-03-26 14:49:42 +00:00
tdLog . info ( " taosd found: %s " % binPath )
2022-03-07 11:25:29 +00:00
if self . deployed == 0 :
tdLog . exit ( " dnode: %d is not deployed " % ( self . index ) )
if self . valgrind == 0 :
2023-03-16 02:18:06 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
cmd = " mintty -h never %s -c %s " % ( binPath , self . cfgDir )
2022-11-19 02:54:38 +00:00
else :
2023-03-16 02:18:06 +00:00
if self . asan :
asanDir = " %s /sim/asan/dnode %d .asan " % (
self . path , self . index )
cmd = " nohup %s -c %s > /dev/null 2> %s & " % (
binPath , self . cfgDir , asanDir )
else :
cmd = " nohup %s -c %s > /dev/null 2>&1 & " % (
binPath , self . cfgDir )
2022-03-07 11:25:29 +00:00
else :
2022-05-22 08:41:10 +00:00
valgrindCmdline = " valgrind --log-file= \" %s /../log/valgrind.log \" --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes " % self . cfgDir
2023-03-16 02:18:06 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
cmd = " mintty -h never %s %s -c %s " % (
valgrindCmdline , binPath , self . cfgDir )
else :
cmd = " nohup %s %s -c %s 2>&1 & " % (
valgrindCmdline , binPath , self . cfgDir )
2022-03-07 11:25:29 +00:00
print ( cmd )
2022-05-28 07:30:14 +00:00
if ( self . remoteIP == " " ) :
if os . system ( cmd ) != 0 :
tdLog . exit ( cmd )
else :
2022-06-06 09:28:45 +00:00
self . remoteExec ( self . cfgDict , " tdDnodes.dnodes[ %d ].deployed=1 \n tdDnodes.dnodes[ %d ].logDir= \" %% s/sim/dnode %% d/log \" %% (tdDnodes.dnodes[ %d ].path, %d ) \n tdDnodes.dnodes[ %d ].cfgDir= \" %% s/sim/dnode %% d/cfg \" %% (tdDnodes.dnodes[ %d ].path, %d ) \n tdDnodes.startWithoutSleep( %d ) " % ( self . index - 1 , self . index - 1 , self . index - 1 , self . index , self . index - 1 , self . index - 1 , self . index , self . index ) )
2022-05-28 07:30:14 +00:00
2022-03-07 11:25:29 +00:00
self . running = 1
tdLog . debug ( " dnode: %d is running with %s " % ( self . index , cmd ) )
def stop ( self ) :
2022-11-19 02:54:38 +00:00
if self . asan :
stopCmd = " %s -s stop -n dnode %d " % ( self . execPath , self . index )
tdLog . info ( " execute script: " + stopCmd )
os . system ( stopCmd )
return
2022-05-28 07:30:14 +00:00
if ( not self . remoteIP == " " ) :
2022-06-06 11:40:13 +00:00
self . remoteExec ( self . cfgDict , " tdDnodes.dnodes[ %d ].running=1 \n tdDnodes.dnodes[ %d ].stop() " % ( self . index - 1 , self . index - 1 ) )
2022-06-01 08:18:47 +00:00
tdLog . info ( " stop dnode %d " % self . index )
2022-05-28 07:30:14 +00:00
return
2022-03-07 11:25:29 +00:00
if self . valgrind == 0 :
toBeKilled = " taosd "
else :
toBeKilled = " valgrind.bin "
if self . running != 0 :
2022-09-23 09:50:43 +00:00
psCmd = " ps -ef|grep -w %s | grep -v grep | awk ' { print $2} ' | xargs " % toBeKilled
2022-03-07 11:25:29 +00:00
processID = subprocess . check_output (
2022-09-23 09:50:43 +00:00
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-08-30 03:16:27 +00:00
2022-07-19 09:15:36 +00:00
onlyKillOnceWindows = 0
2022-03-07 11:25:29 +00:00
while ( processID ) :
2022-07-19 09:15:36 +00:00
if not platform . system ( ) . lower ( ) == ' windows ' or ( onlyKillOnceWindows == 0 and platform . system ( ) . lower ( ) == ' windows ' ) :
2022-07-29 01:51:35 +00:00
killCmd = " kill -INT %s > /dev/null 2>&1 " % processID
2022-09-26 06:49:19 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
killCmd = " kill -INT %s > nul 2>&1 " % processID
2022-07-19 09:15:36 +00:00
os . system ( killCmd )
onlyKillOnceWindows = 1
2022-03-07 11:25:29 +00:00
time . sleep ( 1 )
processID = subprocess . check_output (
2022-09-23 09:50:43 +00:00
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-05-27 14:53:29 +00:00
if not platform . system ( ) . lower ( ) == ' windows ' :
for port in range ( 6030 , 6041 ) :
2022-06-07 08:22:20 +00:00
fuserCmd = " fuser -k -n tcp %d > /dev/null " % port
2022-05-27 14:53:29 +00:00
os . system ( fuserCmd )
2022-03-07 11:25:29 +00:00
if self . valgrind :
time . sleep ( 2 )
self . running = 0
2022-07-29 01:51:35 +00:00
tdLog . debug ( " dnode: %d is stopped by kill -INT " % ( self . index ) )
2022-03-07 11:25:29 +00:00
2022-06-11 12:30:02 +00:00
def stoptaosd ( self ) :
2023-07-07 08:18:54 +00:00
tdLog . debug ( " start to stop taosd on dnode: %d " % ( self . index ) )
# print(self.asan,self.running,self.remoteIP,self.valgrind)
2022-11-19 02:54:38 +00:00
if self . asan :
stopCmd = " %s -s stop -n dnode %d " % ( self . execPath , self . index )
tdLog . info ( " execute script: " + stopCmd )
os . system ( stopCmd )
return
2022-06-11 12:30:02 +00:00
if ( not self . remoteIP == " " ) :
self . remoteExec ( self . cfgDict , " tdDnodes.dnodes[ %d ].running=1 \n tdDnodes.dnodes[ %d ].stop() " % ( self . index - 1 , self . index - 1 ) )
tdLog . info ( " stop dnode %d " % self . index )
return
if self . valgrind == 0 :
toBeKilled = " taosd "
else :
toBeKilled = " valgrind.bin "
if self . running != 0 :
2022-06-25 08:14:54 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
2022-09-23 09:50:43 +00:00
psCmd = " for /f %% a in ( ' wmic process where \" name= ' taosd.exe ' and CommandLine like ' %% dnode %d %% ' \" get processId ^| xargs echo ^| awk ^ ' { print $2}^ ' ^&^& echo aa ' ) do @(ps | grep %% a | awk ' { print $1} ' | xargs) " % ( self . index )
2022-06-25 08:14:54 +00:00
else :
2022-09-23 09:50:43 +00:00
psCmd = " ps -ef|grep -w %s | grep dnode %d |grep -v grep | awk ' { print $2} ' | xargs " % ( toBeKilled , self . index )
2022-07-14 05:58:23 +00:00
processID = subprocess . check_output (
2022-09-23 09:50:43 +00:00
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-07-14 05:58:23 +00:00
2022-07-19 09:15:36 +00:00
onlyKillOnceWindows = 0
2022-07-14 05:58:23 +00:00
while ( processID ) :
2022-07-19 09:15:36 +00:00
if not platform . system ( ) . lower ( ) == ' windows ' or ( onlyKillOnceWindows == 0 and platform . system ( ) . lower ( ) == ' windows ' ) :
2022-07-29 01:51:35 +00:00
killCmd = " kill -INT %s > /dev/null 2>&1 " % processID
2023-03-16 02:18:06 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
killCmd = " kill -INT %s > nul 2>&1 " % processID
2022-07-19 09:15:36 +00:00
os . system ( killCmd )
onlyKillOnceWindows = 1
2022-07-14 05:58:23 +00:00
time . sleep ( 1 )
2022-06-11 12:30:02 +00:00
processID = subprocess . check_output (
2022-09-23 09:50:43 +00:00
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-07-14 05:58:23 +00:00
if self . valgrind :
time . sleep ( 2 )
2022-06-11 12:30:02 +00:00
self . running = 0
2022-07-29 01:51:35 +00:00
tdLog . debug ( " dnode: %d is stopped by kill -INT " % ( self . index ) )
2022-06-11 12:30:02 +00:00
2022-03-07 11:25:29 +00:00
def forcestop ( self ) :
2022-11-19 02:54:38 +00:00
if self . asan :
stopCmd = " %s -s stop -n dnode %d -x SIGKILL " + \
( self . execPath , self . index )
tdLog . info ( " execute script: " + stopCmd )
os . system ( stopCmd )
return
2022-05-28 07:30:14 +00:00
if ( not self . remoteIP == " " ) :
2022-06-06 11:40:13 +00:00
self . remoteExec ( self . cfgDict , " tdDnodes.dnodes[ %d ].running=1 \n tdDnodes.dnodes[ %d ].forcestop() " % ( self . index - 1 , self . index - 1 ) )
2022-05-28 07:30:14 +00:00
return
2022-03-07 11:25:29 +00:00
if self . valgrind == 0 :
toBeKilled = " taosd "
else :
toBeKilled = " valgrind.bin "
if self . running != 0 :
2022-09-23 09:50:43 +00:00
psCmd = " ps -ef|grep -w %s | grep -v grep | awk ' { print $2} ' | xargs " % toBeKilled
2022-03-07 11:25:29 +00:00
processID = subprocess . check_output (
2022-09-23 09:50:43 +00:00
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-03-07 11:25:29 +00:00
2022-07-19 09:15:36 +00:00
onlyKillOnceWindows = 0
2022-03-07 11:25:29 +00:00
while ( processID ) :
2022-07-19 09:15:36 +00:00
if not platform . system ( ) . lower ( ) == ' windows ' or ( onlyKillOnceWindows == 0 and platform . system ( ) . lower ( ) == ' windows ' ) :
killCmd = " kill -KILL %s > /dev/null 2>&1 " % processID
os . system ( killCmd )
onlyKillOnceWindows = 1
2022-03-07 11:25:29 +00:00
time . sleep ( 1 )
processID = subprocess . check_output (
2022-09-23 09:50:43 +00:00
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-03-07 11:25:29 +00:00
for port in range ( 6030 , 6041 ) :
fuserCmd = " fuser -k -n tcp %d " % port
os . system ( fuserCmd )
if self . valgrind :
time . sleep ( 2 )
self . running = 0
tdLog . debug ( " dnode: %d is stopped by kill -KILL " % ( self . index ) )
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 ) :
2023-03-16 02:18:06 +00:00
dnodeRootDir = os . path . join ( self . path , " sim " , " psim " , " dnode %d " % index )
2022-03-07 11:25:29 +00:00
return dnodeRootDir
def getDnodesRootDir ( self ) :
2023-03-16 02:18:06 +00:00
dnodesRootDir = os . path . join ( self . path , " sim " , " psim " )
2022-03-07 11:25:29 +00:00
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 ) )
self . simDeployed = False
2022-05-28 07:30:14 +00:00
self . testCluster = False
self . valgrind = 0
2022-11-19 02:54:38 +00:00
self . asan = False
2023-09-06 09:15:04 +00:00
self . killValgrind = 0
2022-03-07 11:25:29 +00:00
2022-05-28 07:30:14 +00:00
def init ( self , path , remoteIP = " " ) :
2022-05-25 12:37:00 +00:00
binPath = self . dnodes [ 0 ] . getPath ( ) + " /../../../ "
2022-05-28 07:30:14 +00:00
# tdLog.debug("binPath %s" % (binPath))
2022-03-07 11:25:29 +00:00
binPath = os . path . realpath ( binPath )
2022-05-28 07:30:14 +00:00
# tdLog.debug("binPath real path %s" % (binPath))
2022-03-07 11:25:29 +00:00
if path == " " :
self . path = os . path . abspath ( binPath + " ../../ " )
else :
self . path = os . path . realpath ( path )
for i in range ( len ( self . dnodes ) ) :
2022-05-28 07:30:14 +00:00
self . dnodes [ i ] . init ( self . path , remoteIP )
2022-03-07 11:25:29 +00:00
self . sim = TDSimClient ( self . path )
def setTestCluster ( self , value ) :
self . testCluster = value
def setValgrind ( self , value ) :
self . valgrind = value
2022-11-19 02:54:38 +00:00
def setAsan ( self , value ) :
self . asan = value
if value :
2022-11-20 13:26:54 +00:00
selfPath = os . path . dirname ( os . path . realpath ( __file__ ) )
if ( " community " in selfPath ) :
self . stopDnodesPath = os . path . abspath ( self . path + " /community/tests/script/sh/stop_dnodes.sh " )
self . stopDnodesSigintPath = os . path . abspath ( self . path + " /community/tests/script/sh/sigint_stop_dnodes.sh " )
2023-02-10 05:00:55 +00:00
else :
2022-11-20 13:26:54 +00:00
self . stopDnodesPath = os . path . abspath ( self . path + " /tests/script/sh/stop_dnodes.sh " )
self . stopDnodesSigintPath = os . path . abspath ( self . path + " /tests/script/sh/sigint_stop_dnodes.sh " )
2022-11-19 02:54:38 +00:00
tdLog . info ( " run in address sanitizer mode " )
2022-05-31 08:46:01 +00:00
def setKillValgrind ( self , value ) :
self . killValgrind = value
2022-03-07 11:25:29 +00:00
def deploy ( self , index , * updatecfgDict ) :
self . sim . setTestCluster ( self . testCluster )
if ( self . simDeployed == False ) :
2022-04-26 10:46:08 +00:00
self . sim . deploy ( updatecfgDict )
2022-03-07 11:25:29 +00:00
self . simDeployed = True
self . check ( index )
self . dnodes [ index - 1 ] . setTestCluster ( self . testCluster )
self . dnodes [ index - 1 ] . setValgrind ( self . valgrind )
2022-11-19 02:54:38 +00:00
self . dnodes [ index - 1 ] . setAsan ( self . asan )
2022-03-07 11:25:29 +00:00
self . dnodes [ index - 1 ] . deploy ( updatecfgDict )
def cfg ( self , index , option , value ) :
self . check ( index )
self . dnodes [ index - 1 ] . cfg ( option , value )
2022-06-11 12:30:02 +00:00
def starttaosd ( self , index ) :
self . check ( index )
self . dnodes [ index - 1 ] . starttaosd ( )
def stoptaosd ( self , index ) :
self . check ( index )
self . dnodes [ index - 1 ] . stoptaosd ( )
2022-03-07 11:25:29 +00:00
def start ( self , index ) :
self . check ( index )
2022-05-28 07:30:14 +00:00
self . dnodes [ index - 1 ] . start ( )
2022-05-25 08:30:26 +00:00
2022-03-07 11:25:29 +00:00
def startWithoutSleep ( self , index ) :
self . check ( index )
self . dnodes [ index - 1 ] . startWithoutSleep ( )
def stop ( self , index ) :
self . check ( index )
self . dnodes [ index - 1 ] . stop ( )
def getDataSize ( self , index ) :
self . check ( index )
return self . dnodes [ index - 1 ] . getDataSize ( )
def forcestop ( self , index ) :
self . check ( index )
self . dnodes [ index - 1 ] . forcestop ( )
def startIP ( self , index ) :
self . check ( index )
if self . testCluster :
self . dnodes [ index - 1 ] . startIP ( )
def stopIP ( self , index ) :
self . check ( index )
if self . dnodes [ index - 1 ] . testCluster :
self . dnodes [ index - 1 ] . stopIP ( )
def check ( self , index ) :
if index < 1 or index > 10 :
tdLog . exit ( " index: %d should on a scale of [1, 10] " % ( index ) )
2022-11-19 02:54:38 +00:00
def StopAllSigint ( self ) :
2022-11-24 05:52:09 +00:00
tdLog . info ( " stop all dnodes sigint, asan: %d " % self . asan )
2022-11-19 02:54:38 +00:00
if self . asan :
tdLog . info ( " execute script: %s " % self . stopDnodesSigintPath )
os . system ( self . stopDnodesSigintPath )
tdLog . info ( " execute finished " )
return
2023-09-06 09:15:04 +00:00
def killProcesser ( self , processerName ) :
if platform . system ( ) . lower ( ) == ' windows ' :
killCmd = ( " wmic process where name= \" %s .exe \" call terminate > NUL 2>&1 " % processerName )
psCmd = ( " wmic process where name= \" %s .exe \" | findstr \" %s .exe \" " % ( processerName , processerName ) )
else :
killCmd = (
" ps -ef|grep -w %s | grep -v grep | awk ' { print $2} ' | xargs kill -TERM > /dev/null 2>&1 "
% processerName
)
psCmd = ( " ps -ef|grep -w %s | grep -v grep | awk ' { print $2} ' " % processerName )
processID = " "
try :
processID = subprocess . check_output ( psCmd , shell = True )
while processID :
os . system ( killCmd )
time . sleep ( 1 )
try :
processID = subprocess . check_output ( psCmd , shell = True )
except Exception as err :
processID = " "
tdLog . debug ( ' **** kill pid warn: {err} ' )
except Exception as err :
processID = " "
tdLog . debug ( f ' **** find pid warn: { err } ' )
2022-03-07 11:25:29 +00:00
def stopAll ( self ) :
2022-11-24 05:52:09 +00:00
tdLog . info ( " stop all dnodes, asan: %d " % self . asan )
2023-09-06 09:15:04 +00:00
if platform . system ( ) . lower ( ) != ' windows ' :
distro_id = distro . id ( )
else :
distro_id = " not alpine "
2023-02-10 05:00:55 +00:00
if self . asan and distro_id != " alpine " :
2022-11-19 02:54:38 +00:00
tdLog . info ( " execute script: %s " % self . stopDnodesPath )
os . system ( self . stopDnodesPath )
tdLog . info ( " execute finished " )
return
2022-06-09 03:48:41 +00:00
if ( not self . dnodes [ 0 ] . remoteIP == " " ) :
self . dnodes [ 0 ] . remoteExec ( self . dnodes [ 0 ] . cfgDict , " for i in range(len(tdDnodes.dnodes)): \n tdDnodes.dnodes[i].running=1 \n tdDnodes.stopAll() " )
return
2022-03-07 11:25:29 +00:00
for i in range ( len ( self . dnodes ) ) :
self . dnodes [ i ] . stop ( )
2023-02-10 05:00:55 +00:00
if ( distro_id == " alpine " ) :
psCmd = " ps -ef | grep -w taosd | grep ' root ' | grep -v grep| grep -v defunct | awk ' { print $2} ' | xargs "
processID = subprocess . check_output ( psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
while ( processID ) :
print ( processID )
2023-03-16 02:18:06 +00:00
killCmd = " kill -9 %s > /dev/null 2>&1 " % processID
os . system ( killCmd )
time . sleep ( 1 )
processID = subprocess . check_output (
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
elif platform . system ( ) . lower ( ) == ' windows ' :
2023-09-06 09:15:04 +00:00
self . killProcesser ( " taosd " )
self . killProcesser ( " tmq_sim " )
self . killProcesser ( " taosBenchmark " )
2023-02-10 05:00:55 +00:00
else :
psCmd = " ps -ef | grep -w taosd | grep ' root ' | grep -v grep| grep -v defunct | awk ' { print $2} ' | xargs "
processID = subprocess . check_output ( psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
if processID :
cmd = " sudo systemctl stop taosd "
os . system ( cmd )
# if os.system(cmd) != 0 :
# tdLog.exit(cmd)
psCmd = " ps -ef|grep -w taosd| grep -v grep| grep -v defunct | awk ' { print $2} ' | xargs "
processID = subprocess . check_output ( psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
while ( processID ) :
2023-03-16 02:18:06 +00:00
killCmd = " kill -9 %s > /dev/null 2>&1 " % processID
2023-02-10 05:00:55 +00:00
os . system ( killCmd )
time . sleep ( 1 )
processID = subprocess . check_output (
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-05-31 08:46:01 +00:00
if self . killValgrind == 1 :
2022-09-23 09:50:43 +00:00
psCmd = " ps -ef|grep -w valgrind.bin| grep -v grep | awk ' { print $2} ' | xargs "
processID = subprocess . check_output ( psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-05-31 08:46:01 +00:00
while ( processID ) :
2022-06-11 09:19:53 +00:00
if platform . system ( ) . lower ( ) == ' windows ' :
killCmd = " kill -TERM %s > nul 2>&1 " % processID
else :
killCmd = " kill -TERM %s > /dev/null 2>&1 " % processID
2022-05-31 08:46:01 +00:00
os . system ( killCmd )
time . sleep ( 1 )
processID = subprocess . check_output (
2022-09-23 09:50:43 +00:00
psCmd , shell = True ) . decode ( " utf-8 " ) . strip ( )
2022-03-07 11:25:29 +00:00
# if os.system(cmd) != 0 :
# tdLog.exit(cmd)
def getDnodesRootDir ( self ) :
dnodesRootDir = " %s /sim " % ( self . path )
return dnodesRootDir
def getSimCfgPath ( self ) :
return self . sim . getCfgDir ( )
def getSimLogPath ( self ) :
return self . sim . getLogDir ( )
def addSimExtraCfg ( self , option , value ) :
self . sim . addExtraCfg ( option , value )
2022-11-28 03:19:02 +00:00
def getAsan ( self ) :
return self . asan
2023-05-16 11:07:16 +00:00
tdDnodes = TDDnodes ( )