134 lines
4.4 KiB
Python
134 lines
4.4 KiB
Python
# -*- 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
|