# -*- coding:utf-8 -*- ############################################################################# # Copyright (c) 2020 Huawei Technologies Co.,Ltd. # # openGauss is licensed under Mulan PSL v2. # You can use this software according to the terms # and conditions of the Mulan PSL v2. # You may obtain a copy of Mulan PSL v2 at: # # http://license.coscl.org.cn/MulanPSL2 # # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OF ANY KIND, # EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, # MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. # See the Mulan PSL v2 for more details. # ---------------------------------------------------------------------------- # Description : Signal.py is utility to process signal ############################################################################# import sys import signal sys.path.append(sys.path[0] + "/../../") from gspylib.common.ErrorCode import ErrorCode class Signal(object): ########################################################################## # init signal handler ########################################################################## def __init__(self, logger): """ function: initialize signal handler input : object logger output: NA """ self.logger = logger signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGQUIT, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_IGN) signal.signal(signal.SIGALRM, signal.SIG_IGN) signal.signal(signal.SIGHUP, signal.SIG_IGN) signal.signal(signal.SIGUSR1, signal.SIG_IGN) signal.signal(signal.SIGUSR2, signal.SIG_IGN) def setSignalEvent(self, functionName=None): """ function: initialize signal handler input : function output: NA """ if (functionName is not None): signal.signal(signal.SIGINT, functionName) else: signal.signal(signal.SIGINT, signal.SIG_IGN) def print_signal_stack(self, frame): """ function: Function to print signal stack input : frame output: NA """ if (self.logger is None): return try: import inspect stacks = inspect.getouterframes(frame) for curr in range(len(stacks)): stack = stacks[curr] self.logger.debug("Stack level: %d. File: %s. Function: %s. " "LineNo: %d." % (curr, stack[1], stack[3], stack[2])) self.logger.debug("Code: %s." % (stack[4][0].strip().strip("\n"))) except Exception as e: self.logger.debug("Failed to print signal stack. Error: \n%s" % str(e)) def raise_handler(self, signal_num, frame): """ function: Function to raise handler input : signal_num, frame output: NA """ if (self.logger is not None): self.logger.debug("Received signal[%d]." % (signal_num)) self.print_signal_stack(frame) raise Exception(ErrorCode.GAUSS_516["GAUSS_51614"] % (signal_num)) def setupTimeoutHandler(self): """ function: Function to set up time out handler input : NA output: NA """ signal.signal(signal.SIGALRM, self.timeout_handler) def setTimer(self, timeout): """ function: Function to set timer input : timeout output: NA """ self.logger.debug("Set timer. The timeout: %d." % timeout) signal.signal(signal.SIGALRM, self.timeout_handler) signal.alarm(timeout) def resetTimer(self): """ function: Reset timer input : NA output: NA """ signal.signal(signal.SIGALRM, signal.SIG_IGN) self.logger.debug("Reset timer. Left time: %d." % signal.alarm(0)) def timeout_handler(self, signal_num, frame): """ function: Received the timeout signal input : signal_num, frame output: NA """ if (self.logger is not None): self.logger.debug("Received the timeout signal: [%d]." % (signal_num)) self.print_signal_stack(frame) raise Timeout("Time out.") class Timeout(Exception): pass