提交 2f6e842d 编写于 作者: Z Zhenghua Lyu 提交者: GitHub

Detect cgroup mount point in test code and fix some bugs.

1. Detect cgroup mount point in test code.
2. Fix bug when buflen is 0.
3. Check cgroup status on master in gpconfig.
4. Fix coverity warnings.
上级 75bea788
......@@ -5,15 +5,24 @@
import os
import sys
import psutil
class dummy(object):
def validate_all(self):
exit("resource group is not supported on this platform")
def detectCgroupMountPoint():
for dp_info in psutil.disk_partitions(all=True):
if dp_info.fstype == 'cgroup':
mountpoint = os.path.dirname(dp_info.mountpoint)
return mountpoint
return ""
class cgroup(object):
mount_point = "/sys/fs/cgroup/"
mount_point = detectCgroupMountPoint()
tab = { 'r': os.R_OK, 'w': os.W_OK, 'x': os.X_OK, 'f': os.F_OK }
impl = "cgroup"
error_prefix = " is not properly configured: "
......@@ -26,6 +35,9 @@ class cgroup(object):
src/backend/utils/resgroup/resgroup-ops-cgroup.c
"""
if not self.mount_point:
self.die("failed to detect cgroup mount point.")
self.validate_permission("cpu/gpdb/", "rwx")
self.validate_permission("cpu/gpdb/cgroup.procs", "rw")
self.validate_permission("cpu/gpdb/cpu.cfs_period_us", "rw")
......
......@@ -18,11 +18,11 @@ class GpResGroup(object):
def validate(self):
pool = base.WorkerPool()
gp_array = GpArray.initFromCatalog(dbconn.DbURL(), utility=True)
host_cache = GpHostCache(gp_array, pool)
host_list = list(set(gp_array.get_hostlist(True)))
msg = None
for h in host_cache.get_hosts():
cmd = Command(h.hostname, "gpcheckresgroupimpl", REMOTE, h.hostname)
for h in host_list:
cmd = Command(h, "gpcheckresgroupimpl", REMOTE, h)
pool.addCommand(cmd)
pool.join()
......@@ -30,7 +30,7 @@ class GpResGroup(object):
failed = []
for i in items:
if not i.was_successful():
failed.append("[%s:%s]"%(i.remoteHost, i.get_stderr()))
failed.append("[%s:%s]"%(i.remoteHost, i.get_stderr().rstrip()))
pool.haltWork()
pool.joinWorkers()
if failed:
......
......@@ -17,7 +17,7 @@ import gpcheckresgroupimpl
@unittest.skipUnless(sys.platform.startswith("linux"), "requires linux")
class GpCheckResGroupImplCGroup(unittest.TestCase):
cgroup_mntpnt = None
cgroup_default_mntpnt = "/sys/fs/cgroup"
cgroup_default_mntpnt = gpcheckresgroupimpl.detectCgroupMountPoint()
def setUp(self):
self.cgroup_mntpnt = tempfile.mkdtemp(prefix='fake-cgroup-mnt-')
......@@ -59,96 +59,96 @@ class GpCheckResGroupImplCGroup(unittest.TestCase):
def test_when_cpu_gpdb_dir_missing(self):
shutil.rmtree(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb"))
with self.assertRaisesRegexp(AssertionError, "directory '/sys/fs/cgroup/cpu/gpdb/' does not exist"):
with self.assertRaisesRegexp(AssertionError, "directory '.*/cpu/gpdb/' does not exist"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_dir_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb"), 0500)
with self.assertRaisesRegexp(AssertionError, "directory '/sys/fs/cgroup/cpu/gpdb/' permission denied: require permission 'rwx'"):
with self.assertRaisesRegexp(AssertionError, "directory '.*/cpu/gpdb/' permission denied: require permission 'rwx'"):
self.cgroup.validate_all()
# restore permission for the dir to be removed in tearDown()
os.chmod(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb"), 0700)
def test_when_cpu_gpdb_cgroup_procs_missing(self):
os.unlink(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cgroup.procs"))
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cgroup.procs' does not exist"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cgroup.procs' does not exist"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_cgroup_procs_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cgroup.procs"), 0100)
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw'"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw'"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_cpu_cfs_period_us_missing(self):
os.unlink(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cpu.cfs_period_us"))
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cpu.cfs_period_us' does not exist"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cpu.cfs_period_us' does not exist"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_cpu_cfs_period_us_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cpu.cfs_period_us"), 0100)
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cpu.cfs_period_us' permission denied: require permission 'rw'"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cpu.cfs_period_us' permission denied: require permission 'rw'"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_cpu_cfs_quota_us_missing(self):
os.unlink(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cpu.cfs_quota_us"))
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cpu.cfs_quota_us' does not exist"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cpu.cfs_quota_us' does not exist"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_cpu_cfs_quota_us_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cpu.cfs_quota_us"), 0100)
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cpu.cfs_quota_us' permission denied: require permission 'rw'"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cpu.cfs_quota_us' permission denied: require permission 'rw'"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_cpu_shares_missing(self):
os.unlink(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cpu.shares"))
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cpu.shares' does not exist"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cpu.shares' does not exist"):
self.cgroup.validate_all()
def test_when_cpu_gpdb_cpu_shares_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpu", "gpdb", "cpu.shares"), 0100)
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpu/gpdb/cpu.shares' permission denied: require permission 'rw'"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpu/gpdb/cpu.shares' permission denied: require permission 'rw'"):
self.cgroup.validate_all()
def test_when_cpuacct_gpdb_dir_missing(self):
shutil.rmtree(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb"))
with self.assertRaisesRegexp(AssertionError, "directory '/sys/fs/cgroup/cpuacct/gpdb/' does not exist"):
with self.assertRaisesRegexp(AssertionError, "directory '.*/cpuacct/gpdb/' does not exist"):
self.cgroup.validate_all()
def test_when_cpuacct_gpdb_dir_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb"), 0500)
with self.assertRaisesRegexp(AssertionError, "directory '/sys/fs/cgroup/cpuacct/gpdb/' permission denied: require permission 'rwx'"):
with self.assertRaisesRegexp(AssertionError, "directory '.*/cpuacct/gpdb/' permission denied: require permission 'rwx'"):
self.cgroup.validate_all()
# restore permission for the dir to be removed in tearDown()
os.chmod(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb"), 0700)
def test_when_cpuacct_gpdb_cgroup_procs_missing(self):
os.unlink(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb", "cgroup.procs"))
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpuacct/gpdb/cgroup.procs' does not exist"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpuacct/gpdb/cgroup.procs' does not exist"):
self.cgroup.validate_all()
def test_when_cpuacct_gpdb_cgroup_procs_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb", "cgroup.procs"), 0100)
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpuacct/gpdb/cgroup.procs' permission denied: require permission 'rw'"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpuacct/gpdb/cgroup.procs' permission denied: require permission 'rw'"):
self.cgroup.validate_all()
def test_when_cpuacct_gpdb_cpuacct_usage_missing(self):
os.unlink(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb", "cpuacct.usage"))
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpuacct/gpdb/cpuacct.usage' does not exist"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpuacct/gpdb/cpuacct.usage' does not exist"):
self.cgroup.validate_all()
def test_when_cpuacct_gpdb_cpuacct_usage_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb", "cpuacct.usage"), 0100)
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpuacct/gpdb/cpuacct.usage' permission denied: require permission 'r'"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpuacct/gpdb/cpuacct.usage' permission denied: require permission 'r'"):
self.cgroup.validate_all()
def test_when_cpuacct_gpdb_cpuacct_stat_missing(self):
os.unlink(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb", "cpuacct.stat"))
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpuacct/gpdb/cpuacct.stat' does not exist"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpuacct/gpdb/cpuacct.stat' does not exist"):
self.cgroup.validate_all()
def test_when_cpuacct_gpdb_cpuacct_stat_bad_permission(self):
os.chmod(os.path.join(self.cgroup_mntpnt, "cpuacct", "gpdb", "cpuacct.stat"), 0100)
with self.assertRaisesRegexp(AssertionError, "file '/sys/fs/cgroup/cpuacct/gpdb/cpuacct.stat' permission denied: require permission 'r'"):
with self.assertRaisesRegexp(AssertionError, "file '.*/cpuacct/gpdb/cpuacct.stat' permission denied: require permission 'r'"):
self.cgroup.validate_all()
if __name__ == '__main__':
......
......@@ -160,6 +160,8 @@ unassignGroup(Oid group, const char *comp, int fddir)
}
close(fdr);
if (buflen == 0)
return;
buildPath(0, NULL, comp, "cgroup.procs", path, pathsize);
......@@ -560,10 +562,8 @@ detectCgroupMountPoint(void)
fp = setmntent(PROC_MOUNTS, "r");
if (fp == NULL)
{
CGROUP_ERROR("can not open '%s' for read: %s",
PROC_MOUNTS, strerror(errno));
}
CGROUP_ERROR("can not open '%s' for read", PROC_MOUNTS);
while ((me = getmntent(fp)))
{
......@@ -572,19 +572,20 @@ detectCgroupMountPoint(void)
if (strcmp(me->mnt_type, "cgroup"))
continue;
Assert(strlen(me->mnt_dir) < sizeof(cgdir));
strncpy(cgdir, me->mnt_dir, sizeof(cgdir));
strncpy(cgdir, me->mnt_dir, sizeof(cgdir) - 1);
p = strrchr(cgdir, '/');
Assert(p != NULL);
*p = 0;
if (p == NULL)
CGROUP_ERROR("cgroup mount point parse error: %s", cgdir);
else
*p = 0;
break;
}
endmntent(fp);
if (!cgdir[0])
CGROUP_ERROR("can not find cgroup mount point: %s", strerror(errno));
CGROUP_ERROR("can not find cgroup mount point");
}
/* Return the name for the OS group implementation */
......
resgroup_memory_statistic.out
resgroup_memory_limit.out
disable_resgroup.out
enable_resgroup.out
enable_resgroup_validate.out
resgroup_cpu_rate_limit.out
-- for all removed resgroups the cgroup dirs should also be removed
! ls -d /sys/fs/cgroup/cpu/gpdb/*/;
! ls -d /sys/fs/cgroup/cpuacct/gpdb/*/;
! ls -d @cgroup_mnt_point@/cpu/gpdb/*/;
! ls -d @cgroup_mnt_point@/cpuacct/gpdb/*/;
-- reset the GUC and restart cluster.
-- start_ignore
......
-- start_ignore
! rmdir /sys/fs/cgroup/cpu/gpdb;
! rmdir /sys/fs/cgroup/cpuacct/gpdb;
! mkdir /sys/fs/cgroup/cpu/gpdb;
! mkdir /sys/fs/cgroup/cpuacct/gpdb;
! rmdir @cgroup_mnt_point@/cpu/gpdb;
! rmdir @cgroup_mnt_point@/cpuacct/gpdb;
! mkdir @cgroup_mnt_point@/cpu/gpdb;
! mkdir @cgroup_mnt_point@/cpuacct/gpdb;
-- end_ignore
-- enable resource group and restart cluster.
......
-- start_ignore
! chmod 755 /sys/fs/cgroup/cpu/gpdb/*/;
! chmod 755 /sys/fs/cgroup/cpuacct/gpdb/*/;
! rmdir /sys/fs/cgroup/cpu/gpdb/*/;
! rmdir /sys/fs/cgroup/cpuacct/gpdb/*/;
! rmdir /sys/fs/cgroup/cpu/gpdb;
! rmdir /sys/fs/cgroup/cpuacct/gpdb;
! chmod 755 @cgroup_mnt_point@/cpu/gpdb/*/;
! chmod 755 @cgroup_mnt_point@/cpuacct/gpdb/*/;
! rmdir @cgroup_mnt_point@/cpu/gpdb/*/;
! rmdir @cgroup_mnt_point@/cpuacct/gpdb/*/;
! rmdir @cgroup_mnt_point@/cpu/gpdb;
! rmdir @cgroup_mnt_point@/cpuacct/gpdb;
-- end_ignore
-- gpdb top group is not created
! gpconfig -c gp_resource_manager -v group;
-- start_ignore
! mkdir /sys/fs/cgroup/cpu/gpdb;
! mkdir /sys/fs/cgroup/cpuacct/gpdb;
! chmod 644 /sys/fs/cgroup/cpu/gpdb;
! mkdir @cgroup_mnt_point@/cpu/gpdb;
! mkdir @cgroup_mnt_point@/cpuacct/gpdb;
! chmod 644 @cgroup_mnt_point@/cpu/gpdb;
-- end_ignore
-- gpdb directory should have rwx permission
! gpconfig -c gp_resource_manager -v group;
-- start_ignore
! chmod 755 /sys/fs/cgroup/cpu/gpdb;
! chmod 444 /sys/fs/cgroup/cpu/gpdb/cgroup.procs;
! chmod 444 /sys/fs/cgroup/cpu/gpdb/cpu.cfs_quota_us;
! chmod 244 /sys/fs/cgroup/cpu/gpdb/cpu.cfs_period_us;
! chmod 244 /sys/fs/cgroup/cpuacct/gpdb/cpuacct.usage;
! chmod 755 @cgroup_mnt_point@/cpu/gpdb;
! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cgroup.procs;
! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_quota_us;
! chmod 244 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_period_us;
! chmod 244 @cgroup_mnt_point@/cpuacct/gpdb/cpuacct.usage;
-- end_ignore
-- cgroup.procs should have writepermission
......
......@@ -58,9 +58,9 @@ CREATE VIEW cancel_all AS
-- shares := 1024 * ncores
--
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/cpu.cfs_quota_us) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.cfs_period_us) * $(nproc) * $(psql -d isolation2resgrouptest -Aqtc "SHOW gp_resource_group_cpu_limit"))";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_quota_us) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_period_us) * $(nproc) * $(psql -d isolation2resgrouptest -Aqtc "SHOW gp_resource_group_cpu_limit"))";
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) == 1024 * 256";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) == 1024 * 256";
--
-- check default groups configuration
......@@ -68,19 +68,19 @@ CREATE VIEW cancel_all AS
-- SUB/shares := TOP/shares * cpu_rate_limit
--
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='default_group'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='default_group'") / 100)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='default_group'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='default_group'") / 100)";
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='admin_group'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='admin_group'") / 100)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='admin_group'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='admin_group'") / 100)";
-- create two resource groups
CREATE RESOURCE GROUP rg1_cpu_test WITH (concurrency=5, cpu_rate_limit=10, memory_limit=20);
CREATE RESOURCE GROUP rg2_cpu_test WITH (concurrency=5, cpu_rate_limit=20, memory_limit=20);
-- check rg1_cpu_test configuration
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg1_cpu_test'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * 0.1)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg1_cpu_test'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * 0.1)";
-- check rg2_cpu_test configuration
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg2_cpu_test'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * 0.2)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg2_cpu_test'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * 0.2)";
-- create two roles and assign them to above groups
CREATE ROLE role1_cpu_test RESOURCE GROUP rg1_cpu_test;
......
-- for all removed resgroups the cgroup dirs should also be removed
! ls -d /sys/fs/cgroup/cpu/gpdb/*/;
/sys/fs/cgroup/cpu/gpdb/6437/
/sys/fs/cgroup/cpu/gpdb/6438/
! ls -d @cgroup_mnt_point@/cpu/gpdb/*/;
@cgroup_mnt_point@/cpu/gpdb/6437/
@cgroup_mnt_point@/cpu/gpdb/6438/
! ls -d /sys/fs/cgroup/cpuacct/gpdb/*/;
/sys/fs/cgroup/cpuacct/gpdb/6437/
/sys/fs/cgroup/cpuacct/gpdb/6438/
! ls -d @cgroup_mnt_point@/cpuacct/gpdb/*/;
@cgroup_mnt_point@/cpuacct/gpdb/6437/
@cgroup_mnt_point@/cpuacct/gpdb/6438/
-- reset the GUC and restart cluster.
......
-- start_ignore
! rmdir /sys/fs/cgroup/cpu/gpdb;
! rmdir @cgroup_mnt_point@/cpu/gpdb;
! rmdir /sys/fs/cgroup/cpuacct/gpdb;
! rmdir @cgroup_mnt_point@/cpuacct/gpdb;
! mkdir /sys/fs/cgroup/cpu/gpdb;
! mkdir @cgroup_mnt_point@/cpu/gpdb;
! mkdir /sys/fs/cgroup/cpuacct/gpdb;
! mkdir @cgroup_mnt_point@/cpuacct/gpdb;
! chmod 755 /sys/fs/cgroup/cpu/gpdb;
! chmod 755 @cgroup_mnt_point@/cpu/gpdb;
! chmod 755 /sys/fs/cgroup/cpuacct/gpdb;
! chmod 755 @cgroup_mnt_point@/cpuacct/gpdb;
-- end_ignore
......
-- start_ignore
! chmod 755 /sys/fs/cgroup/cpu/gpdb/*/;
! chmod 755 @cgroup_mnt_point@/cpu/gpdb/*/;
! chmod 755 /sys/fs/cgroup/cpuacct/gpdb/*/;
! chmod 755 @cgroup_mnt_point@/cpuacct/gpdb/*/;
! rmdir /sys/fs/cgroup/cpu/gpdb/*/;
! rmdir @cgroup_mnt_point@/cpu/gpdb/*/;
! rmdir /sys/fs/cgroup/cpuacct/gpdb/*/;
! rmdir @cgroup_mnt_point@/cpuacct/gpdb/*/;
! rmdir /sys/fs/cgroup/cpu/gpdb;
! rmdir @cgroup_mnt_point@/cpu/gpdb;
! rmdir /sys/fs/cgroup/cpuacct/gpdb;
! rmdir @cgroup_mnt_point@/cpuacct/gpdb;
-- end_ignore
-- gpdb top group is not created
! gpconfig -c gp_resource_manager -v group;
20170517:11:54:17:011348 gpconfig:nyu-vm-centos:gpadmin-[WARNING]:-Managing queries with resource groups is an experimental feature. A work-in-progress version is enabled.
20170517:11:54:18:011348 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '/sys/fs/cgroup/cpu/gpdb/' does not exist
]
new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '/sys/fs/cgroup/cpu/gpdb/' does not exist
]
20170517:11:54:18:011348 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' does not exist]
new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' does not exist]
-- start_ignore
! mkdir /sys/fs/cgroup/cpu/gpdb;
! mkdir @cgroup_mnt_point@/cpu/gpdb;
! mkdir /sys/fs/cgroup/cpuacct/gpdb;
! mkdir @cgroup_mnt_point@/cpuacct/gpdb;
! chmod 644 /sys/fs/cgroup/cpu/gpdb;
! chmod 644 @cgroup_mnt_point@/cpu/gpdb;
-- end_ignore
-- gpdb directory should have rwx permission
! gpconfig -c gp_resource_manager -v group;
20170517:11:54:18:011409 gpconfig:nyu-vm-centos:gpadmin-[WARNING]:-Managing queries with resource groups is an experimental feature. A work-in-progress version is enabled.
20170517:11:54:18:011409 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '/sys/fs/cgroup/cpu/gpdb/' permission denied: require permission 'rwx'
]
new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '/sys/fs/cgroup/cpu/gpdb/' permission denied: require permission 'rwx'
]
20170517:11:54:18:011409 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' permission denied: require permission 'rwx']
new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: directory '@cgroup_mnt_point@/cpu/gpdb/' permission denied: require permission 'rwx']
-- start_ignore
! chmod 755 /sys/fs/cgroup/cpu/gpdb;
! chmod 755 @cgroup_mnt_point@/cpu/gpdb;
! chmod 444 /sys/fs/cgroup/cpu/gpdb/cgroup.procs;
! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cgroup.procs;
! chmod 444 /sys/fs/cgroup/cpu/gpdb/cpu.cfs_quota_us;
! chmod 444 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_quota_us;
! chmod 244 /sys/fs/cgroup/cpu/gpdb/cpu.cfs_period_us;
! chmod 244 @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_period_us;
! chmod 244 /sys/fs/cgroup/cpuacct/gpdb/cpuacct.usage;
! chmod 244 @cgroup_mnt_point@/cpuacct/gpdb/cpuacct.usage;
-- end_ignore
......@@ -59,8 +55,6 @@ new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configure
-- cpuacct.usage should have read permission
! gpconfig -c gp_resource_manager -v group;
20170517:11:54:18:011466 gpconfig:nyu-vm-centos:gpadmin-[WARNING]:-Managing queries with resource groups is an experimental feature. A work-in-progress version is enabled.
20170517:11:54:18:011466 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: file '/sys/fs/cgroup/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw'
]
new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: file '/sys/fs/cgroup/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw'
]
20170517:11:54:18:011466 gpconfig:nyu-vm-centos:gpadmin-[CRITICAL]:-new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: file '@cgroup_mnt_point@/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw']
new GUC value failed validation: [nyu-vm-centos:cgroup is not properly configured: file '@cgroup_mnt_point@/cpu/gpdb/cgroup.procs' permission denied: require permission 'rw']
......@@ -48,11 +48,11 @@ CREATE
-- shares := 1024 * ncores
--
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/cpu.cfs_quota_us) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.cfs_period_us) * $(nproc) * $(psql -d isolation2resgrouptest -Aqtc "SHOW gp_resource_group_cpu_limit"))";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_quota_us) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.cfs_period_us) * $(nproc) * $(psql -d isolation2resgrouptest -Aqtc "SHOW gp_resource_group_cpu_limit"))";
True
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) == 1024 * 256";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) == 1024 * 256";
True
......@@ -62,11 +62,11 @@ True
-- SUB/shares := TOP/shares * cpu_rate_limit
--
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='default_group'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='default_group'") / 100)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='default_group'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='default_group'") / 100)";
True
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='admin_group'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='admin_group'") / 100)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='admin_group'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * $(psql -d isolation2resgrouptest -Aqtc "SELECT value FROM pg_resgroupcapability c, pg_resgroup g WHERE c.resgroupid=g.oid AND reslimittype=2 AND g.rsgname='admin_group'") / 100)";
True
......@@ -77,12 +77,12 @@ CREATE RESOURCE GROUP rg2_cpu_test WITH (concurrency=5, cpu_rate_limit=20, memor
CREATE
-- check rg1_cpu_test configuration
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg1_cpu_test'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * 0.1)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg1_cpu_test'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * 0.1)";
True
-- check rg2_cpu_test configuration
! python -c "print $(cat /sys/fs/cgroup/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg2_cpu_test'")/cpu.shares) == int($(cat /sys/fs/cgroup/cpu/gpdb/cpu.shares) * 0.2)";
! python -c "print $(cat @cgroup_mnt_point@/cpu/gpdb/$(psql -d isolation2resgrouptest -Aqtc "SELECT oid FROM pg_resgroup WHERE rsgname='rg2_cpu_test'")/cpu.shares) == int($(cat @cgroup_mnt_point@/cpu/gpdb/cpu.shares) * 0.2)";
True
......
resgroup_memory_statistic.sql
resgroup_memory_limit.sql
disable_resgroup.sql
enable_resgroup.sql
enable_resgroup_validate.sql
resgroup_cpu_rate_limit.sql
......@@ -24,6 +24,10 @@
#include <signal.h>
#include <unistd.h>
#ifdef __linux__
#include <mntent.h>
#endif
#ifdef HAVE_SYS_RESOURCE_H
#include <sys/time.h>
#include <sys/resource.h>
......@@ -145,6 +149,8 @@ typedef BOOL (WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_
#define DISABLE_MAX_PRIVILEGE 0x1
#endif
static bool detectCgroupMountPoint(char *cgdir, int len);
/*
* allow core files if possible.
*/
......@@ -417,11 +423,51 @@ typedef struct replacements
char *dlsuffix;
char *bindir;
char *orientation;
char *cgroup_mnt_point;
} replacements;
/* Internal helper function to detect cgroup mount point at runtime.*/
static bool
detectCgroupMountPoint(char *cgdir, int len)
{
#ifdef __linux__
struct mntent *me;
FILE *fp;
bool ret = false;
fp = setmntent("/proc/self/mounts", "r");
if (fp == NULL)
return ret;
while ((me = getmntent(fp)))
{
char *p;
if (strcmp(me->mnt_type, "cgroup"))
continue;
strncpy(cgdir, me->mnt_dir, len);
p = strrchr(cgdir, '/');
if (p != NULL)
{
*p = 0;
ret = true;
}
break;
}
endmntent(fp);
return ret;
#else
return false;
#endif
}
static void
convert_line(char *line, replacements *repls)
{
replace_string(line, "@cgroup_mnt_point@", repls->cgroup_mnt_point);
replace_string(line, "@abs_srcdir@", repls->abs_srcdir);
replace_string(line, "@abs_builddir@", repls->abs_builddir);
replace_string(line, "@testtablespace@", repls->testtablespace);
......@@ -591,6 +637,8 @@ convert_sourcefiles_in(char *source, char * dest_dir, char *dest, char *suffix)
char abs_builddir[MAXPGPATH];
char testtablespace[MAXPGPATH];
char indir[MAXPGPATH];
char cgroup_mnt_point[MAXPGPATH];
replacements repls;
struct stat st;
int ret;
......@@ -674,12 +722,18 @@ convert_sourcefiles_in(char *source, char * dest_dir, char *dest, char *suffix)
make_directory(testtablespace);
#endif
memset(cgroup_mnt_point, 0, sizeof(cgroup_mnt_point));
if (!detectCgroupMountPoint(cgroup_mnt_point,
sizeof(cgroup_mnt_point) - 1))
strcpy(cgroup_mnt_point, "/sys/fs/cgroup");
memset(&repls, 0, sizeof(repls));
repls.abs_srcdir = abs_srcdir;
repls.abs_builddir = abs_builddir;
repls.testtablespace = testtablespace;
repls.dlsuffix = DLSUFFIX;
repls.bindir = bindir;
repls.cgroup_mnt_point = cgroup_mnt_point;
/* finally loop on each file and do the replacement */
for (name = names; *name; name++)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册