121 lines
5.2 KiB
Python
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
|