Files
openGauss-OM/script/gspylib/inspection/items/database/CheckSysTabSize.py
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

追加合入
2022-03-05 18:51:52 +08:00

145 lines
5.9 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.
# ----------------------------------------------------------------------------
from gspylib.inspection.common import SharedFuncs
from gspylib.inspection.common.CheckItem import BaseItem
from gspylib.inspection.common.CheckResult import ResultStatus
import os
from base_utils.os.cmd_util import CmdUtil
from base_utils.os.file_util import FileUtil
DUMMY_STANDBY_INSTANCE = 2
INSTANCE_ROLE_COODINATOR = 3
class CheckSysTabSize(BaseItem):
def __init__(self):
super(CheckSysTabSize, self).__init__(self.__class__.__name__)
def doCheck(self):
instance = []
allDisk = []
# Get all disk and the avail size
cmd_df = "df -B M"
diskinfo = SharedFuncs.runShellCmd(cmd_df, self.user, self.mpprcFile)
# split with \n and remove the title
diskList_space = diskinfo.split("\n")
diskList_space.remove(diskList_space[0])
# loop the list, remove space and remove the size unit "MB",
# only keep disk path and avail size
for disk_space in diskList_space:
disk = disk_space.split()
disk_new = []
disk_new.append(disk[0])
disk_new.append(int(disk[3].replace("M", "")))
allDisk.append(disk_new)
# Get the port and datadir list of instance
nodeInfo = self.cluster.getDbNodeByName(self.host)
CN = nodeInfo.coordinators
# check if CN exists
if (len(CN) > 0):
instance.append(CN[0])
else:
# no CN in instance, do nothing
pass
for DnInstance in nodeInfo.datanodes:
if (DnInstance.instanceType != DUMMY_STANDBY_INSTANCE):
instance.append(DnInstance)
# check if no instances in this node
if (len(instance) == 0):
return
else:
pass
for inst in instance:
cmd_dir = CmdUtil.getDiskFreeCmd(inst.datadir)
result = SharedFuncs.runShellCmd(cmd_dir, self.user,
self.mpprcFile)
diskInfo_withspace = result.split("\n")
diskInfo = diskInfo_withspace[1].split()
for disk in allDisk:
if (diskInfo[0] == disk[0]):
disk.append(inst)
masterDnList = SharedFuncs.getMasterDnNum(self.user, self.mpprcFile)
# Get the database in the node, remove template0
sqldb = "select datname from pg_database;"
needm = False
if (instance[0].instanceRole == INSTANCE_ROLE_COODINATOR):
needm = False
elif (instance[0].instanceId in masterDnList):
needm = False
else:
needm = True
output = SharedFuncs.runSqlCmd(sqldb, self.user, "", instance[0].port,
self.tmpPath, "postgres",
self.mpprcFile, needm)
dbList = output.split("\n")
dbList.remove("template0")
# loop all database with port list
value = ""
Flag = []
for disk in allDisk:
sumSize = 0
for inst in disk[2:]:
for db in dbList:
# Calculate the size with sql cmd
cmd = "select sum(pg_total_relation_size(oid)/1024)/1024" \
" from pg_class where oid<16384 and relkind='r';"
needm = False
if (inst.instanceRole == INSTANCE_ROLE_COODINATOR):
needm = False
elif (inst.instanceId in masterDnList):
needm = False
else:
needm = True
output = SharedFuncs.runSqlCmd(cmd, self.user, "",
inst.port, self.tmpPath, db,
self.mpprcFile, needm)
sumSize = sumSize + float(output)
# Calculate the size of datadir
strdir = inst.datadir
clog = FileUtil.getDirSize(os.path.join(strdir, 'pg_clog'), "M")
size_clog = int(clog[0].replace("M", ""))
xlog = FileUtil.getDirSize(os.path.join(strdir, 'pg_xlog'), "M")
size_xlog = int(xlog[0].replace("M", ""))
sumSize = sumSize + size_clog + size_xlog
if (sumSize == 0):
continue
# Compare system table size with avail disk size
if (sumSize < disk[1]):
Flag.append(True)
FileSystem = "FileSystem: %s" % disk[0]
SystemTableSize = "SystemTableSize: %sM" % sumSize
DiskAvailSize = "DiskAvailSize: %sM" % disk[1]
value += FileSystem.ljust(35) + SystemTableSize.ljust(35) \
+ DiskAvailSize.ljust(35) + "Status: OK; \n"
elif (sumSize >= disk[1]):
Flag.append(False)
FileSystem = "FileSystem: %s" % disk[0]
SystemTableSize = "SystemTableSize: %sM" % sumSize
DiskAvailSize = "DiskAvailSize: %sM" % disk[1]
value += FileSystem.ljust(35) + SystemTableSize.ljust(35) \
+ DiskAvailSize.ljust(35) + "Status: NG; \n"
self.result.val = value
if (False not in Flag):
self.result.rst = ResultStatus.OK
else:
self.result.rst = ResultStatus.NG