提交 095d5a68 编写于 作者: S Steven Li

Added the -a option to crash_gen tool to automatically start/stop TDengine service

上级 43600966
...@@ -1629,7 +1629,7 @@ class MyLoggingAdapter(logging.LoggerAdapter): ...@@ -1629,7 +1629,7 @@ class MyLoggingAdapter(logging.LoggerAdapter):
# return '[%s] %s' % (self.extra['connid'], msg), kwargs # return '[%s] %s' % (self.extra['connid'], msg), kwargs
class SvcManager: class SvcManager:
MAX_QUEUE_SIZE = 30 MAX_QUEUE_SIZE = 10000
def __init__(self): def __init__(self):
print("Starting service manager") print("Starting service manager")
...@@ -1667,7 +1667,7 @@ class SvcManager: ...@@ -1667,7 +1667,7 @@ class SvcManager:
break break
# queue.put(line) # queue.put(line)
print("No more output (most likely) from IO thread managing TDengine service") # meaning sub process must have died print("\nNo more output (most likely) from IO thread managing TDengine service") # meaning sub process must have died
out.close() out.close()
def _doMenu(self): def _doMenu(self):
...@@ -1700,10 +1700,10 @@ class SvcManager: ...@@ -1700,10 +1700,10 @@ class SvcManager:
if choice == "1" : if choice == "1" :
self.sigHandlerResume() # TODO: can the sub-process be blocked due to us not reading from queue? self.sigHandlerResume() # TODO: can the sub-process be blocked due to us not reading from queue?
elif choice == "2" : elif choice == "2" :
self._stopTaosService() self.stopTaosService()
elif choice == "3" : elif choice == "3" :
self._stopTaosService() self.stopTaosService()
self._startTaosService() self.startTaosService()
else: else:
raise RuntimeError("Invalid menu choice: {}".format(choice)) raise RuntimeError("Invalid menu choice: {}".format(choice))
...@@ -1714,7 +1714,7 @@ class SvcManager: ...@@ -1714,7 +1714,7 @@ class SvcManager:
return return
self.status = MainExec.STATUS_STOPPING # immediately set our status self.status = MainExec.STATUS_STOPPING # immediately set our status
self._stopTaosService() self.stopTaosService()
print("INT signal handler returning...") print("INT signal handler returning...")
def sigHandlerResume(self) : def sigHandlerResume(self) :
...@@ -1728,12 +1728,17 @@ class SvcManager: ...@@ -1728,12 +1728,17 @@ class SvcManager:
else : else :
print("Joining empty thread, doing nothing") print("Joining empty thread, doing nothing")
TD_READY_MSG = "TDengine is initialized successfully"
def _procIpcBatch(self): def _procIpcBatch(self):
# Process all the output generated by the underlying sub process, managed by IO thread # Process all the output generated by the underlying sub process, managed by IO thread
while True : while True :
try: try:
line = self.ipcQueue.get_nowait() # getting output at fast speed line = self.ipcQueue.get_nowait() # getting output at fast speed
print("_o", end="", flush=True) print("_o", end="", flush=True)
if self.status == MainExec.STATUS_STARTING : # we are starting, let's see if we have started
if line.find(self.TD_READY_MSG) != -1 : # found
self.status = MainExec.STATUS_RUNNING
except Empty: except Empty:
# time.sleep(2.3) # wait only if there's no output # time.sleep(2.3) # wait only if there's no output
# no more output # no more output
...@@ -1743,13 +1748,13 @@ class SvcManager: ...@@ -1743,13 +1748,13 @@ class SvcManager:
def _procIpcAll(self): def _procIpcAll(self):
while True : while True :
print("<<", end="", flush=True) print("<", end="", flush=True)
self._procIpcBatch() # process one batch self._procIpcBatch() # process one batch
# check if the ioThread is still running # check if the ioThread is still running
if (not self.ioThread) or (not self.ioThread.is_alive()): if (not self.ioThread) or (not self.ioThread.is_alive()):
print("IO Thread (with subprocess) has ended, main thread now exiting...") print("IO Thread (with subprocess) has ended, main thread now exiting...")
self._stopTaosService() self.stopTaosService()
self._procIpcBatch() # one more batch self._procIpcBatch() # one more batch
return # TODO: maybe one last batch? return # TODO: maybe one last batch?
...@@ -1759,10 +1764,10 @@ class SvcManager: ...@@ -1759,10 +1764,10 @@ class SvcManager:
self._procIpcBatch() # one more batch self._procIpcBatch() # one more batch
return return
print(">>", end="", flush=True) print(">", end="", flush=True)
time.sleep(0.5) time.sleep(0.5)
def _startTaosService(self): def startTaosService(self):
ON_POSIX = 'posix' in sys.builtin_module_names ON_POSIX = 'posix' in sys.builtin_module_names
svcCmd = ['../../build/build/bin/taosd', '-c', '../../build/test/cfg'] svcCmd = ['../../build/build/bin/taosd', '-c', '../../build/test/cfg']
# svcCmd = ['vmstat', '1'] # svcCmd = ['vmstat', '1']
...@@ -1783,9 +1788,19 @@ class SvcManager: ...@@ -1783,9 +1788,19 @@ class SvcManager:
self.ioThread.start() self.ioThread.start()
self.shouldStop = False # don't let the main loop stop self.shouldStop = False # don't let the main loop stop
self.status = MainExec.STATUS_RUNNING self.status = MainExec.STATUS_STARTING
def _stopTaosService(self): # wait for service to start
for i in range(0, 10) :
time.sleep(1.0)
self._procIpcBatch() # pump messages
print("_zz_", end="", flush=True)
if self.status == MainExec.STATUS_RUNNING :
print("TDengine service READY to process requests")
return # now we've started
raise RuntimeError("TDengine service did not start successfully") # TODO: handle this better?
def stopTaosService(self):
# can be called from both main thread or signal handler # can be called from both main thread or signal handler
print("Terminating TDengine service running as the sub process...") print("Terminating TDengine service running as the sub process...")
# Linux will send Control-C generated SIGINT to the TDengine process already, ref: https://unix.stackexchange.com/questions/176235/fork-and-how-signals-are-delivered-to-processes # Linux will send Control-C generated SIGINT to the TDengine process already, ref: https://unix.stackexchange.com/questions/176235/fork-and-how-signals-are-delivered-to-processes
...@@ -1804,7 +1819,7 @@ class SvcManager: ...@@ -1804,7 +1819,7 @@ class SvcManager:
except subprocess.TimeoutExpired as err: except subprocess.TimeoutExpired as err:
print("Time out waiting for TDengine service process to exit") print("Time out waiting for TDengine service process to exit")
else: else:
print("Sub process has ended") print("TDengine service process terminated successfully from SIG_INT")
self.subProcess = None self.subProcess = None
if self.subProcess and (not self.subProcess.poll()): if self.subProcess and (not self.subProcess.poll()):
...@@ -1814,7 +1829,7 @@ class SvcManager: ...@@ -1814,7 +1829,7 @@ class SvcManager:
self.joinIoThread() self.joinIoThread()
def run(self): def run(self):
self._startTaosService() self.startTaosService()
# proc = subprocess.Popen(['echo', '"to stdout"'], # proc = subprocess.Popen(['echo', '"to stdout"'],
# stdout=subprocess.PIPE, # stdout=subprocess.PIPE,
...@@ -1878,6 +1893,10 @@ class ClientManager: ...@@ -1878,6 +1893,10 @@ class ClientManager:
self._printLastNumbers() self._printLastNumbers()
def run(self): def run(self):
if gConfig.auto_start_service :
svcMgr = SvcManager()
svcMgr.startTaosService()
self._printLastNumbers() self._printLastNumbers()
dbManager = DbManager() # Regular function dbManager = DbManager() # Regular function
...@@ -1889,6 +1908,8 @@ class ClientManager: ...@@ -1889,6 +1908,8 @@ class ClientManager:
# print("exec stats: {}".format(self.tc.getExecStats())) # print("exec stats: {}".format(self.tc.getExecStats()))
# print("TC failed = {}".format(self.tc.isFailed())) # print("TC failed = {}".format(self.tc.isFailed()))
self.conclude() self.conclude()
if gConfig.auto_start_service :
svcMgr.stopTaosService()
# print("TC failed (2) = {}".format(self.tc.isFailed())) # print("TC failed (2) = {}".format(self.tc.isFailed()))
return 1 if self.tc.isFailed() else 0 # Linux return code: ref https://shapeshed.com/unix-exit-codes/ return 1 if self.tc.isFailed() else 0 # Linux return code: ref https://shapeshed.com/unix-exit-codes/
...@@ -1898,8 +1919,9 @@ class ClientManager: ...@@ -1898,8 +1919,9 @@ class ClientManager:
class MainExec: class MainExec:
STATUS_RUNNING = 1 STATUS_STARTING = 1
STATUS_STOPPING = 2 STATUS_RUNNING = 2
STATUS_STOPPING = 3
# STATUS_STOPPED = 3 # Not used yet # STATUS_STOPPED = 3 # Not used yet
@classmethod @classmethod
...@@ -1968,6 +1990,8 @@ def main(): ...@@ -1968,6 +1990,8 @@ def main():
''')) '''))
parser.add_argument('-a', '--auto-start-service', action='store_true',
help='Automatically start/stop the TDengine service (default: false)')
parser.add_argument('-c', '--connector-type', action='store', default='native', type=str, parser.add_argument('-c', '--connector-type', action='store', default='native', type=str,
help='Connector type to use: native, rest, or mixed (default: 10)') help='Connector type to use: native, rest, or mixed (default: 10)')
parser.add_argument('-d', '--debug', action='store_true', parser.add_argument('-d', '--debug', action='store_true',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册