diff --git a/core/util.c b/core/util.c index fff5fe45717f511b4944946c9d516dff0d6c6cb1..33a9575a923ae590096e4b674b221cf9be8e7304 100644 --- a/core/util.c +++ b/core/util.c @@ -107,8 +107,9 @@ tnt_xrealloc(void *ptr, size_t size) #ifdef ENABLE_BACKTRACE /* - * we use global static buffer because it is too late to do - * any allocation when we are printing bactrace and fiber stack is small + * We use a global static buffer because it is too late to do any + * allocation when we are printing backtrace and fiber stack is + * small. */ static char backtrace_buf[4096 * 4]; diff --git a/test/lib/tarantool_box_server.py b/test/lib/tarantool_box_server.py index 3e657380621844c369b094b7a14cb204560f11d8..a9c0ec689989a22e00893da5ea7ca5c55dda51cc 100644 --- a/test/lib/tarantool_box_server.py +++ b/test/lib/tarantool_box_server.py @@ -9,6 +9,8 @@ import time import socket import daemon import glob +import signal +import traceback def wait_until_connected(host, port): """Wait until the server is started and accepting connections""" @@ -66,6 +68,16 @@ class TarantoolBoxServer: self.abspath_to_exe = None self.is_started = False + if self.args.gdb or self.args.start_and_exit: + self.sigchld_handler = signal.SIG_DFL + else: + def sigchld_handler(signo, frame): + os.wait() + traceback.print_stack(frame) + + self.sigchld_handler = sigchld_handler + + def install(self, silent = False): """Start server instance: check if the old one exists, kill it if necessary, create necessary directories and files, start @@ -125,6 +137,11 @@ class TarantoolBoxServer: if not silent: print "Starting {0} {1}.".format(os.path.basename(self.abspath_to_exe), version) + def setup_sigchld_handler(self): + signal.signal(signal.SIGCHLD, self.sigchld_handler) + + def clear_sigchld_handler(self): + signal.signal(signal.SIGCHLD, signal.SIG_DFL) def start(self, silent = False): @@ -152,7 +169,7 @@ class TarantoolBoxServer: os.wait() else: with daemon.DaemonContext(working_directory = self.args.vardir): - os.execvp(args[0], args) + os.execvp(args[0], args) else: self.server = pexpect.spawn(args[0], args[1:], cwd = self.args.vardir) if self.args.start_and_exit: @@ -166,6 +183,8 @@ class TarantoolBoxServer: else: wait_until_connected(self.suite_ini["host"], self.suite_ini["port"]) + self.setup_sigchld_handler() + # Set is_started flag, to nicely support cleanup during an exception. self.is_started = True @@ -179,6 +198,8 @@ class TarantoolBoxServer: print "Stopping the server..." if self.args.gdb: self.kill_old_server(True) + else: + self.clear_sigchld_handler() self.server.terminate() self.server.expect(pexpect.EOF) self.is_started = False @@ -190,13 +211,15 @@ class TarantoolBoxServer: self.start(True) def test_option(self, option_list_str): - args = [self.abspath_to_exe] + option_list_str.split() - print " ".join([os.path.basename(self.abspath_to_exe)] + args[1:]) - output = subprocess.Popen(args, - cwd = self.args.vardir, - stdout = subprocess.PIPE, - stderr = subprocess.STDOUT).stdout.read() - print output + args = [self.abspath_to_exe] + option_list_str.split() + print " ".join([os.path.basename(self.abspath_to_exe)] + args[1:]) + self.clear_sigchld_handler() + output = subprocess.Popen(args, + cwd = self.args.vardir, + stdout = subprocess.PIPE, + stderr = subprocess.STDOUT).stdout.read() + self.setup_sigchld_handler() + print output def find_exe(self): diff --git a/test/lib/test_suite.py b/test/lib/test_suite.py index 69eb06416922f80ab49deeeb0742b056c5b22f7e..0e435210431f12abaec7d636ba03735d05853cb5 100644 --- a/test/lib/test_suite.py +++ b/test/lib/test_suite.py @@ -104,10 +104,11 @@ class Test: sql = DataConnection(self.suite_ini["host"], self.suite_ini["port"]) server = self.suite_ini["server"] + stdout_redirect = FilteredStream(self.tmp_result) try: admin.connect() sql.connect() - sys.stdout = FilteredStream(self.tmp_result) + sys.stdout = stdout_redirect server = self.suite_ini["server"] vardir = self.suite_ini["vardir"] execfile(self.name, globals(), locals())