Finished refactoring crash_gen tool into a Python modular structure
This commit is contained in:
parent
c6a5706f66
commit
e011827fd4
|
@ -54,6 +54,7 @@ export PYTHONPATH=$(pwd)/../../src/connector/python/linux/python3:$(pwd)
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB_DIR
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB_DIR
|
||||||
|
|
||||||
# Now we are all let, and let's see if we can find a crash. Note we pass all params
|
# Now we are all let, and let's see if we can find a crash. Note we pass all params
|
||||||
|
CRASH_GEN_EXEC=crash_gen_bootstrap.py
|
||||||
if [[ $1 == '--valgrind' ]]; then
|
if [[ $1 == '--valgrind' ]]; then
|
||||||
shift
|
shift
|
||||||
export PYTHONMALLOC=malloc
|
export PYTHONMALLOC=malloc
|
||||||
|
@ -66,14 +67,14 @@ if [[ $1 == '--valgrind' ]]; then
|
||||||
--leak-check=yes \
|
--leak-check=yes \
|
||||||
--suppressions=crash_gen/valgrind_taos.supp \
|
--suppressions=crash_gen/valgrind_taos.supp \
|
||||||
$PYTHON_EXEC \
|
$PYTHON_EXEC \
|
||||||
./crash_gen/crash_gen.py $@ > $VALGRIND_OUT 2> $VALGRIND_ERR
|
$CRASH_GEN_EXEC $@ > $VALGRIND_OUT 2> $VALGRIND_ERR
|
||||||
elif [[ $1 == '--helgrind' ]]; then
|
elif [[ $1 == '--helgrind' ]]; then
|
||||||
shift
|
shift
|
||||||
valgrind \
|
valgrind \
|
||||||
--tool=helgrind \
|
--tool=helgrind \
|
||||||
$PYTHON_EXEC \
|
$PYTHON_EXEC \
|
||||||
./crash_gen/crash_gen.py $@
|
$CRASH_GEN_EXEC $@
|
||||||
else
|
else
|
||||||
$PYTHON_EXEC ./crash_gen/crash_gen.py $@
|
$PYTHON_EXEC $CRASH_GEN_EXEC $@
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -3160,123 +3160,124 @@ class MainExec:
|
||||||
self._svcMgr = None
|
self._svcMgr = None
|
||||||
gSvcMgr = None
|
gSvcMgr = None
|
||||||
|
|
||||||
|
def init(self): # TODO: refactor
|
||||||
|
global gContainer
|
||||||
|
gContainer = Container() # micky-mouse DI
|
||||||
|
|
||||||
|
# Super cool Python argument library:
|
||||||
|
# https://docs.python.org/3/library/argparse.html
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||||
|
description=textwrap.dedent('''\
|
||||||
|
TDengine Auto Crash Generator (PLEASE NOTICE the Prerequisites Below)
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
1. You build TDengine in the top level ./build directory, as described in offical docs
|
||||||
|
2. You run the server there before this script: ./build/bin/taosd -c test/cfg
|
||||||
|
|
||||||
def main():
|
'''))
|
||||||
# Super cool Python argument library:
|
|
||||||
# https://docs.python.org/3/library/argparse.html
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
||||||
description=textwrap.dedent('''\
|
|
||||||
TDengine Auto Crash Generator (PLEASE NOTICE the Prerequisites Below)
|
|
||||||
---------------------------------------------------------------------
|
|
||||||
1. You build TDengine in the top level ./build directory, as described in offical docs
|
|
||||||
2. You run the server there before this script: ./build/bin/taosd -c test/cfg
|
|
||||||
|
|
||||||
'''))
|
parser.add_argument(
|
||||||
|
'-a',
|
||||||
|
'--auto-start-service',
|
||||||
|
action='store_true',
|
||||||
|
help='Automatically start/stop the TDengine service (default: false)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-b',
|
||||||
|
'--max-dbs',
|
||||||
|
action='store',
|
||||||
|
default=0,
|
||||||
|
type=int,
|
||||||
|
help='Maximum number of DBs to keep, set to disable dropping DB. (default: 0)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-c',
|
||||||
|
'--connector-type',
|
||||||
|
action='store',
|
||||||
|
default='native',
|
||||||
|
type=str,
|
||||||
|
help='Connector type to use: native, rest, or mixed (default: 10)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-d',
|
||||||
|
'--debug',
|
||||||
|
action='store_true',
|
||||||
|
help='Turn on DEBUG mode for more logging (default: false)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-e',
|
||||||
|
'--run-tdengine',
|
||||||
|
action='store_true',
|
||||||
|
help='Run TDengine service in foreground (default: false)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-i',
|
||||||
|
'--max-replicas',
|
||||||
|
action='store',
|
||||||
|
default=1,
|
||||||
|
type=int,
|
||||||
|
help='Maximum number of replicas to use, when testing against clusters. (default: 1)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-l',
|
||||||
|
'--larger-data',
|
||||||
|
action='store_true',
|
||||||
|
help='Write larger amount of data during write operations (default: false)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-p',
|
||||||
|
'--per-thread-db-connection',
|
||||||
|
action='store_true',
|
||||||
|
help='Use a single shared db connection (default: false)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-r',
|
||||||
|
'--record-ops',
|
||||||
|
action='store_true',
|
||||||
|
help='Use a pair of always-fsynced fils to record operations performing + performed, for power-off tests (default: false)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-s',
|
||||||
|
'--max-steps',
|
||||||
|
action='store',
|
||||||
|
default=1000,
|
||||||
|
type=int,
|
||||||
|
help='Maximum number of steps to run (default: 100)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-t',
|
||||||
|
'--num-threads',
|
||||||
|
action='store',
|
||||||
|
default=5,
|
||||||
|
type=int,
|
||||||
|
help='Number of threads to run (default: 10)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-v',
|
||||||
|
'--verify-data',
|
||||||
|
action='store_true',
|
||||||
|
help='Verify data written in a number of places by reading back (default: false)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-x',
|
||||||
|
'--continue-on-exception',
|
||||||
|
action='store_true',
|
||||||
|
help='Continue execution after encountering unexpected/disallowed errors/exceptions (default: false)')
|
||||||
|
|
||||||
parser.add_argument(
|
global gConfig
|
||||||
'-a',
|
gConfig = parser.parse_args()
|
||||||
'--auto-start-service',
|
|
||||||
action='store_true',
|
|
||||||
help='Automatically start/stop the TDengine service (default: false)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-b',
|
|
||||||
'--max-dbs',
|
|
||||||
action='store',
|
|
||||||
default=0,
|
|
||||||
type=int,
|
|
||||||
help='Maximum number of DBs to keep, set to disable dropping DB. (default: 0)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-c',
|
|
||||||
'--connector-type',
|
|
||||||
action='store',
|
|
||||||
default='native',
|
|
||||||
type=str,
|
|
||||||
help='Connector type to use: native, rest, or mixed (default: 10)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-d',
|
|
||||||
'--debug',
|
|
||||||
action='store_true',
|
|
||||||
help='Turn on DEBUG mode for more logging (default: false)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-e',
|
|
||||||
'--run-tdengine',
|
|
||||||
action='store_true',
|
|
||||||
help='Run TDengine service in foreground (default: false)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-i',
|
|
||||||
'--max-replicas',
|
|
||||||
action='store',
|
|
||||||
default=1,
|
|
||||||
type=int,
|
|
||||||
help='Maximum number of replicas to use, when testing against clusters. (default: 1)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-l',
|
|
||||||
'--larger-data',
|
|
||||||
action='store_true',
|
|
||||||
help='Write larger amount of data during write operations (default: false)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-p',
|
|
||||||
'--per-thread-db-connection',
|
|
||||||
action='store_true',
|
|
||||||
help='Use a single shared db connection (default: false)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-r',
|
|
||||||
'--record-ops',
|
|
||||||
action='store_true',
|
|
||||||
help='Use a pair of always-fsynced fils to record operations performing + performed, for power-off tests (default: false)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-s',
|
|
||||||
'--max-steps',
|
|
||||||
action='store',
|
|
||||||
default=1000,
|
|
||||||
type=int,
|
|
||||||
help='Maximum number of steps to run (default: 100)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-t',
|
|
||||||
'--num-threads',
|
|
||||||
action='store',
|
|
||||||
default=5,
|
|
||||||
type=int,
|
|
||||||
help='Number of threads to run (default: 10)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-v',
|
|
||||||
'--verify-data',
|
|
||||||
action='store_true',
|
|
||||||
help='Verify data written in a number of places by reading back (default: false)')
|
|
||||||
parser.add_argument(
|
|
||||||
'-x',
|
|
||||||
'--continue-on-exception',
|
|
||||||
action='store_true',
|
|
||||||
help='Continue execution after encountering unexpected/disallowed errors/exceptions (default: false)')
|
|
||||||
|
|
||||||
global gConfig
|
# Logging Stuff
|
||||||
gConfig = parser.parse_args()
|
global logger
|
||||||
|
_logger = logging.getLogger('CrashGen') # real logger
|
||||||
|
_logger.addFilter(LoggingFilter())
|
||||||
|
ch = logging.StreamHandler()
|
||||||
|
_logger.addHandler(ch)
|
||||||
|
|
||||||
# Logging Stuff
|
# Logging adapter, to be used as a logger
|
||||||
global logger
|
logger = MyLoggingAdapter(_logger, [])
|
||||||
_logger = logging.getLogger('CrashGen') # real logger
|
|
||||||
_logger.addFilter(LoggingFilter())
|
|
||||||
ch = logging.StreamHandler()
|
|
||||||
_logger.addHandler(ch)
|
|
||||||
|
|
||||||
# Logging adapter, to be used as a logger
|
if (gConfig.debug):
|
||||||
logger = MyLoggingAdapter(_logger, [])
|
logger.setLevel(logging.DEBUG) # default seems to be INFO
|
||||||
|
else:
|
||||||
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
if (gConfig.debug):
|
Dice.seed(0) # initial seeding of dice
|
||||||
logger.setLevel(logging.DEBUG) # default seems to be INFO
|
|
||||||
else:
|
|
||||||
logger.setLevel(logging.INFO)
|
|
||||||
|
|
||||||
Dice.seed(0) # initial seeding of dice
|
def run(self):
|
||||||
|
if gConfig.run_tdengine: # run server
|
||||||
|
self.runService()
|
||||||
|
else:
|
||||||
|
return self.runClient()
|
||||||
|
|
||||||
# Run server or client
|
|
||||||
mExec = MainExec()
|
|
||||||
if gConfig.run_tdengine: # run server
|
|
||||||
mExec.runService()
|
|
||||||
else:
|
|
||||||
return mExec.runClient()
|
|
||||||
|
|
||||||
class Container():
|
class Container():
|
||||||
_propertyList = {'defTdeInstance'}
|
_propertyList = {'defTdeInstance'}
|
||||||
|
@ -3300,9 +3301,3 @@ class Container():
|
||||||
self._verifyValidProperty(name)
|
self._verifyValidProperty(name)
|
||||||
self._cargo[name] = value
|
self._cargo[name] = value
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
gContainer = Container() # micky-mouse DI
|
|
||||||
|
|
||||||
exitCode = main()
|
|
||||||
# print("Exiting with code: {}".format(exitCode))
|
|
||||||
sys.exit(exitCode)
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
# -----!/usr/bin/python3.7
|
||||||
|
###################################################################
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from crash_gen.crash_gen import MainExec
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
mExec = MainExec()
|
||||||
|
mExec.init()
|
||||||
|
exitCode = mExec.run()
|
||||||
|
|
||||||
|
print("Exiting with code: {}".format(exitCode))
|
||||||
|
sys.exit(exitCode)
|
Loading…
Reference in New Issue