2020-12-16 17:25:24 +08:00

121 lines
5.2 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.
# ----------------------------------------------------------------------------
import os
import json
import multiprocessing
from gspylib.inspection.common import SharedFuncs
from gspylib.inspection.common.CheckItem import BaseItem
from gspylib.inspection.common.CheckResult import ResultStatus
from gspylib.common.ErrorCode import ErrorCode
# master
MASTER_INSTANCE = 0
# standby
STANDBY_INSTANCE = 1
class CheckFilehandle(BaseItem):
def __init__(self):
super(CheckFilehandle, self).__init__(self.__class__.__name__)
self.Threshold_Warning = None
def preCheck(self):
super(CheckFilehandle, self).preCheck()
if (not self.threshold.__contains__('Threshold_Warning')):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53013"]
% "The Threshold_Warning")
if (not self.threshold['Threshold_Warning'].isdigit()):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53014"]
% "The Threshold_Warning")
self.Threshold_Warning = int(self.threshold['Threshold_Warning'])
def doCheck(self):
masterDNs = []
slaveDNs = []
masterDNhander = {}
salveDNhander = {}
overvalueDNs = []
overmasterDNs = []
flag = False
nodeInfo = self.cluster.getDbNodeByName(self.host)
for DnInstance in nodeInfo.datanodes:
if (DnInstance.instanceType == MASTER_INSTANCE):
masterDNs.append(DnInstance)
elif (DnInstance.instanceType == STANDBY_INSTANCE):
slaveDNs.append(DnInstance)
for dn in masterDNs:
getpidcmd = "ps -ef| grep %s|grep -v 'grep'|awk '{print $2}'" \
% dn.datadir
pid = SharedFuncs.runShellCmd(getpidcmd)
getfilehander = "lsof | grep %s|wc -l" % pid
filehander = SharedFuncs.runShellCmd(getfilehander)
instanceName = "dn_%s" % (dn.instanceId)
if (not filehander.isdigit()):
num = filehander.splitlines()
filehander = num[-1]
if (not filehander.isdigit()):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53018"]
% (pid, getfilehander))
masterDNhander[instanceName] = filehander
for dn in slaveDNs:
getpidcmd = "ps -ef| grep '%s'|grep -v 'grep'|awk '{print $2}'" \
% dn.datadir
pid = SharedFuncs.runShellCmd(getpidcmd)
getfilehander = "lsof | grep %s|wc -l" % pid
filehander = SharedFuncs.runShellCmd(getfilehander)
instanceName = "dn_%s" % (dn.instanceId)
if (not filehander.isdigit()):
num = filehander.splitlines()
filehander = num[-1]
if (not filehander.isdigit()):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53018"]
% (pid, getfilehander))
salveDNhander[instanceName] = filehander
for key, value in (masterDNhander.items()):
if (int(value) > self.Threshold_Warning):
overvalueDNs.append(key)
for key, value in (salveDNhander.items()):
if (int(value) > self.Threshold_Warning):
overvalueDNs.append(key)
for key, value in salveDNhander.items():
for mkey, mastervalue in masterDNhander.items():
if (int(value) > int(mastervalue)):
overmasterDNs.append(key)
flag = True
if (overvalueDNs and flag):
self.result.val = "Some slave database node open more file " \
"hander than master database node %s;" \
"Some gaussdb process open file handler over" \
" %s:\n%s" % ("\n".join(overmasterDNs),
self.Threshold_Warning,
"\n".join(overvalueDNs))
self.result.rst = ResultStatus.WARNING
elif (overvalueDNs):
self.result.val = "Some gaussdb process open file handler" \
" over %s:\n%s" % (
self.Threshold_Warning,
"\n".join(overvalueDNs))
self.result.rst = ResultStatus.WARNING
elif (flag):
self.result.val = "There is some slave database node open " \
"more file hander than master database node" \
" %s" % "\n".join(overmasterDNs)
self.result.rst = ResultStatus.WARNING
else:
self.result.val = "File hander check pass"
self.result.rst = ResultStatus.OK