You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by ma...@apache.org on 2025/09/10 08:42:33 UTC
(cloudberry) 07/11: Add one more hierarchy for resgroup cgroup root (#16732)
This is an automated email from the ASF dual-hosted git repository.
maxyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 723ee2822a0fc6841a0b7f4c9e0ebdfd8df99b74
Author: RMT <d....@outlook.com>
AuthorDate: Tue Dec 5 14:20:10 2023 +0800
Add one more hierarchy for resgroup cgroup root (#16732)
Add one more hierarchy for resource group when use cgroup v2.
Current leaf node in the gpdb cgroup hierarchy is:
/sys/fs/cgroup/gpdb/<oid>, it's ok for gpdb workflow. But for some
extensions which want to use gpdb cgroup hierarchy, it's not convenient.
Extensions like plcontainer want create sub-cgroup under
/sys/fs/cgroup/<oid> as new leaf node, it's not possible in current
hierarchy, because of no internal processes constraint of cgroup v2.
This commit use a new hierarchy to adopt extensions which want to use
gpdb cgroup hierarchy, and the modification is tiny: move processes from
/sys/fs/cgroup/<oid>/cgroup.procs to
/sys/fs/cgroup/gpdb/<oid>/queries/cgroup.procs, and keep limitations in
/sys/fs/cgroup/<oid>.
With this modification, extensions which want to use gpdb cgroup
hierarchy can create sub cgroup under /sys/fs/cgroup/gpdb/<oid>.
For example, plcontainer will create a cgroup
/sys/fs/cgroup/gpdb/<oid>/docker-12345 and put processes into it.
---
src/backend/utils/resgroup/cgroup-ops-linux-v1.c | 10 +++++-----
src/backend/utils/resgroup/cgroup-ops-linux-v2.c | 15 ++++++++++-----
src/backend/utils/resgroup/cgroup.c | 8 +++++---
src/include/utils/cgroup.h | 4 +++-
.../expected/resgroup/resgroup_auxiliary_tools_v2.out | 2 +-
.../sql/resgroup/resgroup_auxiliary_tools_v2.sql | 2 +-
6 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/src/backend/utils/resgroup/cgroup-ops-linux-v1.c b/src/backend/utils/resgroup/cgroup-ops-linux-v1.c
index fffba070a3f..0ad53ee35ab 100644
--- a/src/backend/utils/resgroup/cgroup-ops-linux-v1.c
+++ b/src/backend/utils/resgroup/cgroup-ops-linux-v1.c
@@ -652,11 +652,11 @@ createcgroup_v1(Oid group)
{
int retry = 0;
- if (!createDir(group, CGROUP_COMPONENT_CPU) ||
- !createDir(group, CGROUP_COMPONENT_CPUACCT) ||
- !createDir(group, CGROUP_COMPONENT_MEMORY) ||
+ if (!createDir(group, CGROUP_COMPONENT_CPU, "") ||
+ !createDir(group, CGROUP_COMPONENT_CPUACCT, "") ||
+ !createDir(group, CGROUP_COMPONENT_MEMORY, "") ||
(gp_resource_group_enable_cgroup_cpuset &&
- !createDir(group, CGROUP_COMPONENT_CPUSET)))
+ !createDir(group, CGROUP_COMPONENT_CPUSET, "")))
{
CGROUP_ERROR("can't create cgroup for resource group '%d': %m", group);
}
@@ -705,7 +705,7 @@ create_default_cpuset_group_v1(void)
CGroupComponentType component = CGROUP_COMPONENT_CPUSET;
int retry = 0;
- if (!createDir(DEFAULT_CPUSET_GROUP_ID, component))
+ if (!createDir(DEFAULT_CPUSET_GROUP_ID, component, ""))
{
CGROUP_ERROR("can't create cpuset cgroup for resgroup '%d': %m",
DEFAULT_CPUSET_GROUP_ID);
diff --git a/src/backend/utils/resgroup/cgroup-ops-linux-v2.c b/src/backend/utils/resgroup/cgroup-ops-linux-v2.c
index 69d2b1b0461..6b5f667fe7f 100644
--- a/src/backend/utils/resgroup/cgroup-ops-linux-v2.c
+++ b/src/backend/utils/resgroup/cgroup-ops-linux-v2.c
@@ -386,7 +386,8 @@ createcgroup_v2(Oid group)
{
int retry = 0;
- if (!createDir(group, CGROUP_COMPONENT_PLAIN))
+ if (!createDir(group, CGROUP_COMPONENT_PLAIN, "") ||
+ !createDir(group, CGROUP_COMPONENT_PLAIN, CGROUPV2_LEAF_INDENTIFIER))
{
CGROUP_ERROR("can't create cgroup for resource group '%d': %m", group);
}
@@ -418,7 +419,7 @@ create_default_cpuset_group_v2(void)
CGroupComponentType component = CGROUP_COMPONENT_PLAIN;
int retry = 0;
- if (!createDir(DEFAULT_CPUSET_GROUP_ID, component))
+ if (!createDir(DEFAULT_CPUSET_GROUP_ID, component, ""))
{
CGROUP_ERROR("can't create cpuset cgroup for resgroup '%d': %m",
DEFAULT_CPUSET_GROUP_ID);
@@ -466,6 +467,7 @@ create_default_cpuset_group_v2(void)
static void
attachcgroup_v2(Oid group, int pid, bool is_cpuset_enabled)
{
+ char path_of_leaf[MAXPATHLEN];
/*
* needn't write to file if the pid has already been written in.
* Unless it has not been written or the group has changed or
@@ -474,8 +476,9 @@ attachcgroup_v2(Oid group, int pid, bool is_cpuset_enabled)
if (IsUnderPostmaster && group == currentGroupIdInCGroup)
return;
+ pg_sprintf(path_of_leaf, "%s/cgroup.procs", CGROUPV2_LEAF_INDENTIFIER);
writeInt64(group, BASEDIR_GPDB, CGROUP_COMPONENT_PLAIN,
- "cgroup.procs", pid);
+ path_of_leaf, pid);
/*
* Do not assign the process to cgroup/memory for now.
@@ -499,6 +502,7 @@ detachcgroup_v2(Oid group, CGroupComponentType component, int fd_dir)
{
char path[MAX_CGROUP_PATHLEN];
size_t path_size = sizeof(path);
+ char path_of_leaf[MAXPATHLEN];
char *buf;
size_t buf_size;
@@ -533,7 +537,8 @@ detachcgroup_v2(Oid group, CGroupComponentType component, int fd_dir)
} \
} while (0)
- buildPath(group, BASEDIR_GPDB, component, "cgroup.procs", path, path_size);
+ pg_sprintf(path_of_leaf, "%s/cgroup.procs", CGROUPV2_LEAF_INDENTIFIER);
+ buildPath(group, BASEDIR_GPDB, component, path_of_leaf, path, path_size);
fdr = open(path, O_RDONLY);
@@ -561,7 +566,7 @@ detachcgroup_v2(Oid group, CGroupComponentType component, int fd_dir)
if (buf_len == 0)
return;
- buildPath(DEFAULTRESGROUP_OID, BASEDIR_GPDB, component, "cgroup.procs",
+ buildPath(DEFAULTRESGROUP_OID, BASEDIR_GPDB, component, path_of_leaf,
path, path_size);
fdw = open(path, O_WRONLY);
diff --git a/src/backend/utils/resgroup/cgroup.c b/src/backend/utils/resgroup/cgroup.c
index a996e31aa51..839090f39e4 100644
--- a/src/backend/utils/resgroup/cgroup.c
+++ b/src/backend/utils/resgroup/cgroup.c
@@ -285,12 +285,12 @@ lockDir(const char *path, bool block)
* Create cgroup dir
*/
bool
-createDir(Oid group, CGroupComponentType component)
+createDir(Oid group, CGroupComponentType component, char *filename)
{
char path[MAX_CGROUP_PATHLEN];
size_t path_size = sizeof(path);
- buildPath(group, BASEDIR_GPDB, component, "", path, path_size);
+ buildPath(group, BASEDIR_GPDB, component, filename, path, path_size);
if (mkdir(path, 0755) && errno != EEXIST)
return false;
@@ -468,12 +468,14 @@ deleteDir(Oid group, CGroupComponentType component, const char *filename, bool u
{
char path[MAX_CGROUP_PATHLEN];
+ char leaf_path[MAX_CGROUP_PATHLEN];
size_t path_size = sizeof(path);
int retry = unassign ? 0 : MAX_RETRY - 1;
int fd_dir;
buildPath(group, BASEDIR_GPDB, component, "", path, path_size);
+ buildPath(group, BASEDIR_GPDB, component, CGROUPV2_LEAF_INDENTIFIER, leaf_path, path_size);
/*
* To prevent race condition between multiple processes we require a dir
@@ -497,7 +499,7 @@ deleteDir(Oid group, CGroupComponentType component, const char *filename, bool u
if (unassign)
detachcgroup(group, component, fd_dir);
- if (rmdir(path))
+ if (rmdir(leaf_path) || rmdir(path))
{
int err = errno;
diff --git a/src/include/utils/cgroup.h b/src/include/utils/cgroup.h
index b9c0fa249a2..39ef82aeb52 100644
--- a/src/include/utils/cgroup.h
+++ b/src/include/utils/cgroup.h
@@ -47,6 +47,8 @@
/* This is the default value about Linux Control Group */
#define DEFAULT_CPU_PERIOD_US 100000LL
+/* The name of leaf cgroup when use cgroup v2 */
+#define CGROUPV2_LEAF_INDENTIFIER "queries"
/*
* Resource Group underlying component types.
@@ -168,7 +170,7 @@ extern void setComponentDir(CGroupComponentType component, const char *dir);
extern int lockDir(const char *path, bool block);
/* Create cgroup dir. */
-extern bool createDir(Oid group, CGroupComponentType comp);
+extern bool createDir(Oid group, CGroupComponentType comp, char *filename);
/* Delete cgroup dir. */
extern bool deleteDir(Oid group, CGroupComponentType component, const char *filename, bool unassign,
void (*detachcgroup) (Oid group, CGroupComponentType component, int fd_dir));
diff --git a/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out b/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out
index e2e959374b2..93c1d1aa4df 100644
--- a/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out
+++ b/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out
@@ -118,7 +118,7 @@ sql = "select sess_id from pg_stat_activity where pid = '%d'" % pid result = plp
sql = "select groupid from gp_toolkit.gp_resgroup_config where groupname='%s'" % groupname result = plpy.execute(sql) groupid = result[0]['groupid']
sql = "select hostname from gp_segment_configuration group by hostname" result = plpy.execute(sql) hosts = [_['hostname'] for _ in result]
def get_result(host): stdout = subprocess.run(["ssh", "{}".format(host), "ps -ef | grep postgres | grep con{} | grep -v grep | awk '{{print $2}}'".format(session_id)], stdout=subprocess.PIPE, check=True).stdout session_pids = stdout.splitlines()
-path = "/sys/fs/cgroup/gpdb/{}/cgroup.procs".format(groupid) stdout = subprocess.run(["ssh", "{}".format(host), "cat {}".format(path)], stdout=subprocess.PIPE, check=True).stdout cgroups_pids = stdout.splitlines()
+path = "/sys/fs/cgroup/gpdb/{}/queries/cgroup.procs".format(groupid) stdout = subprocess.run(["ssh", "{}".format(host), "cat {}".format(path)], stdout=subprocess.PIPE, check=True).stdout cgroups_pids = stdout.splitlines()
return set(session_pids).issubset(set(cgroups_pids))
for host in hosts: if not get_result(host): return False return True
$$ LANGUAGE plpython3u;
diff --git a/src/test/isolation2/sql/resgroup/resgroup_auxiliary_tools_v2.sql b/src/test/isolation2/sql/resgroup/resgroup_auxiliary_tools_v2.sql
index 88f66c4f18d..e2d8db51888 100644
--- a/src/test/isolation2/sql/resgroup/resgroup_auxiliary_tools_v2.sql
+++ b/src/test/isolation2/sql/resgroup/resgroup_auxiliary_tools_v2.sql
@@ -259,7 +259,7 @@ $$ LANGUAGE plpython3u;
stdout=subprocess.PIPE, check=True).stdout
session_pids = stdout.splitlines()
- path = "/sys/fs/cgroup/gpdb/{}/cgroup.procs".format(groupid)
+ path = "/sys/fs/cgroup/gpdb/{}/queries/cgroup.procs".format(groupid)
stdout = subprocess.run(["ssh", "{}".format(host), "cat {}".format(path)], stdout=subprocess.PIPE, check=True).stdout
cgroups_pids = stdout.splitlines()
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org