def stop(self, silent=True, signal=signal.SIGTERM): # FIXME: Extract common parts of AppServer.stop() and # TarantoolServer.stop() to an utility function. color_log('DEBUG: [app server] Stopping the server...\n', schema='info') if not self.process: color_log(' | Nothing to do: the process does not exist\n', schema='info') return if self.process.returncode: if self.process.returncode < 0: signaled_by = -self.process.returncode color_log(' | Nothing to do: the process was terminated by ' 'signal {} ({})\n'.format(signaled_by, signame(signaled_by)), schema='info') else: color_log(' | Nothing to do: the process was exited with code ' '{}\n'.format(self.process.returncode), schema='info') return color_log(' | Sending signal {0} ({1}) to {2}\n'.format( signal, signame(signal), format_process(self.process.pid))) try: self.process.send_signal(signal) except OSError: pass # Waiting for stopping the server. If the timeout # reached, send SIGKILL. timeout = 5 def kill(): qa_notice('The app server does not stop during {} ' 'seconds after the {} ({}) signal.\n' 'Info: {}\n' 'Sending SIGKILL...'.format( timeout, signal, signame(signal), format_process(self.process.pid))) try: self.process.kill() except OSError: pass timer = Timer(timeout, kill) timer.start() self.process.wait() timer.cancel()
def kill(): qa_notice('The server \'{}\' does not stop during {} ' 'seconds after the {} ({}) signal.\n' 'Info: {}\n' 'Sending SIGKILL...'.format( self.name, timeout, signal, signame(signal), format_process(self.process.pid))) try: self.process.kill() except OSError: pass
def crash_grep(self): print_log_lines = 15 assert_fail_re = re.compile(r'^.*: Assertion .* failed\.$') # find and save backtrace or assertion fail assert_lines = list() bt = list() with open(self.logfile, 'r') as log: lines = log.readlines() for rpos, line in enumerate(reversed(lines)): if line.startswith('Segmentation fault'): bt = lines[-rpos - 1:] break if assert_fail_re.match(line): pos = len(lines) - rpos assert_lines = lines[max(0, pos - print_log_lines):pos] break else: bt = list() # print insident meat if self.process.returncode < 0: color_stdout('\n\n[Instance "%s" killed by signal: %d (%s)]\n' % (self.name, -self.process.returncode, signame(-self.process.returncode)), schema='error') else: color_stdout( '\n\n[Instance "%s" returns with non-zero exit code: %d]\n' % (self.name, self.process.returncode), schema='error') # print assert line if any and return if assert_lines: color_stdout('Found assertion fail in the results file [%s]:\n' % self.logfile, schema='error') sys.stderr.flush() for line in assert_lines: sys.stderr.write(line) sys.stderr.flush() return # print backtrace if any sys.stderr.flush() for trace in bt: sys.stderr.write(trace) # print log otherwise (if backtrace was not found) if not bt: self.print_log(print_log_lines) sys.stderr.flush()
def crash_grep(self): print_log_lines = 15 assert_fail_re = re.compile(r'^.*: Assertion .* failed\.$') # find and save backtrace or assertion fail assert_lines = list() bt = list() with open(self.logfile, 'r') as log: lines = log.readlines() for rpos, line in enumerate(reversed(lines)): if line.startswith('Segmentation fault'): bt = lines[-rpos - 1:] break if assert_fail_re.match(line): pos = len(lines) - rpos assert_lines = lines[max(0, pos - print_log_lines):pos] break else: bt = list() # print insident meat if self.process.returncode < 0: color_stdout('\n\n[Instance "%s" killed by signal: %d (%s)]\n' % ( self.name, -self.process.returncode, signame(-self.process.returncode)), schema='error') else: color_stdout('\n\n[Instance "%s" returns with non-zero exit code: ' '%d]\n' % (self.name, self.process.returncode), schema='error') # print assert line if any and return if assert_lines: color_stdout('Found assertion fail in the results file ' '[%s]:\n' % self.logfile, schema='error') sys.stderr.flush() for line in assert_lines: sys.stderr.write(line) sys.stderr.flush() return # print backtrace if any sys.stderr.flush() for trace in bt: sys.stderr.write(trace) # print log otherwise (if backtrace was not found) if not bt: self.print_log(print_log_lines) sys.stderr.flush()
def stop_nondefault(self, signal=signal.SIGTERM): names = [k for k in self.servers.keys() if k != 'default'] color_log('DEBUG: Stop non-default servers using ' 'signal {} ({}): {}\n'.format(signal, signame(signal), names), schema='info') if sys.stdout.__class__.__name__ == 'FilteredStream': sys.stdout.clear_all_filters() for k, v in self.servers.items(): # don't stop the default server if k == 'default': continue v.stop(silent=True, signal=signal) if k in self.connections: self.connections[k].disconnect() self.connections.pop(k)
def stop(self, silent=True, signal=signal.SIGTERM): """ Kill tarantool server using specified signal (SIGTERM by default) signal - a number of a signal """ if self._start_against_running: color_log('Server [%s] start against running ...\n', schema='test_var') return if self.status != 'started': if not silent: raise Exception('Server is not started') else: color_log( 'Server [{0.name}] is not started ' '(status:{0.status}) ...\n'.format(self), schema='test_var' ) return if not silent: color_stdout('Stopping the server ...\n', schema='serv_text') else: color_log('Stopping the server ...\n', schema='serv_text') # kill only if process is alive if self.process is not None and self.process.returncode is None: color_log('TarantoolServer.stop(): stopping the {0}\n'.format( format_process(self.process.pid)), schema='test_var') try: color_log('Sending signal {0} ({1}) to process {2}\n'.format( signal, signame(signal), self.process.pid)) self.process.send_signal(signal) except OSError: pass if self.crash_detector is not None: save_join(self.crash_detector) self.wait_stop() self.status = None if re.search(r'^/', str(self._admin.port)): if os.path.exists(self._admin.port): os.unlink(self._admin.port)
def stop(self, silent=True, signal=signal.SIGTERM): """ Kill tarantool server using specified signal (SIGTERM by default) signal - a number of a signal """ if self._start_against_running: color_log('Server [%s] start against running ...\n', schema='test_var') return if self.status != 'started': if not silent: raise Exception('Server is not started') else: color_log('Server [{0.name}] is not started ' '(status:{0.status}) ...\n'.format(self), schema='test_var') return if not silent: color_stdout('Stopping the server ...\n', schema='serv_text') else: color_log('Stopping the server ...\n', schema='serv_text') # kill only if process is alive if self.process is not None and self.process.returncode is None: color_log('TarantoolServer.stop(): stopping the {0}\n'.format( format_process(self.process.pid)), schema='test_var') try: color_log('Sending signal {0} ({1}) to process {2}\n'.format( signal, signame(signal), self.process.pid)) self.process.send_signal(signal) except OSError: pass if self.crash_detector is not None: save_join(self.crash_detector) self.wait_stop() self.status = None if re.search(r'^/', str(self._admin.port)): if os.path.exists(self._admin.port): os.unlink(self._admin.port)
def stop(self, silent=True, signal=signal.SIGTERM): """ Kill tarantool server using specified signal (SIGTERM by default) signal - a number of a signal """ if self._start_against_running: color_log('Server [%s] start against running ...\n', schema='test_var') return if self.status != 'started': if not silent: raise Exception('Server is not started') else: color_log( 'Server [{0.name}] is not started ' '(status:{0.status}) ...\n'.format(self), schema='test_var' ) return if not silent: color_stdout('[Instance {}] Stopping the server...\n'.format( self.name), schema='info') else: color_log('DEBUG: [Instance {}] Stopping the server...\n'.format( self.name), schema='info') # kill only if process is alive if self.process is not None and self.process.returncode is None: color_log(' | Sending signal {0} ({1}) to {2}\n'.format( signal, signame(signal), format_process(self.process.pid))) try: self.process.send_signal(signal) except OSError: pass # Waiting for stopping the server. If the timeout # reached, send SIGKILL. timeout = 5 def kill(): qa_notice('The server \'{}\' does not stop during {} ' 'seconds after the {} ({}) signal.\n' 'Info: {}\n' 'Sending SIGKILL...'.format( self.name, timeout, signal, signame(signal), format_process(self.process.pid))) try: self.process.kill() except OSError: pass timer = Timer(timeout, kill) timer.start() if self.crash_detector is not None: save_join(self.crash_detector) self.wait_stop() timer.cancel() self.status = None if re.search(r'^/', str(self._admin.port)): if os.path.exists(self._admin.port): os.unlink(self._admin.port)