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 36b6ddd460a3db6cf3438d71641530ab2e21968e Author: RMT <[email protected]> AuthorDate: Tue Dec 19 14:07:51 2023 +0800 Add guc: gp_resource_group_cgroup_parent (#16738) Add guc: gp_resource_group_cgroup_parent (only for cgroup v2). Current gpdb doesn't support change root cgroup path of resource group. For some situations, it's better if gpdb can change the root cgroup path of resource group. For example, on the OS with systemd, user maybe want to create a delegated cgroup to gpdb via systemd, but the delegated cgroup must end with .service which typically is /sys/fs/cgroup/gpdb.service. And in other OS without systemd, user maybe want to use /sys/fs/cgroup/gpdb or other locations directly. So add the gp_resource_group_cgroup_parent can make the resource group more flexible. --- gpMgmt/bin/gpconfig | 15 ++++++++ src/backend/cdb/cdbvars.c | 40 ++++++++++++++++++++++ src/backend/utils/misc/guc_gp.c | 12 +++++++ src/backend/utils/resgroup/cgroup.c | 2 +- src/include/utils/guc.h | 1 + src/include/utils/resgroup.h | 1 + src/include/utils/unsync_guc_name.h | 1 + .../resgroup/resgroup_auxiliary_tools_v2.out | 2 ++ .../sql/resgroup/resgroup_auxiliary_tools_v2.sql | 1 + 9 files changed, 74 insertions(+), 1 deletion(-) diff --git a/gpMgmt/bin/gpconfig b/gpMgmt/bin/gpconfig index 3d5495bd01b..f4e3ce7c62d 100755 --- a/gpMgmt/bin/gpconfig +++ b/gpMgmt/bin/gpconfig @@ -15,6 +15,7 @@ import os import sys import re +import psutil try: from gppylib.gpparseopts import OptParser, OptChecker @@ -170,6 +171,20 @@ class Guc: return msg elif newval != "'queue'": return "the value of gp_resource_manager must be 'group' or 'group-v2' or 'queue'" + elif self.name == "gp_resource_group_cgroup_parent": + base = newval.strip("'") + if not re.match("^[0-9a-zA-Z][-._0-9a-zA-Z]*$", base): + return "resource group cgroup parent can only contains alphabet, number, and non-leading . _ -" + + path = None + for partition in psutil.disk_partitions(all=True): + if partition.fstype == "cgroup2": + path = partition.mountpoint + "/" + base + break + if path is None: + return "cannot find cgroup v2 mountpoint" + if not os.path.isdir(path): + return "'%s' doesn't exists or is not a directory" % path elif self.name == 'unix_socket_permissions': if newval[0] != '0': diff --git a/src/backend/cdb/cdbvars.c b/src/backend/cdb/cdbvars.c index 9db3389e0bf..04c81848b05 100644 --- a/src/backend/cdb/cdbvars.c +++ b/src/backend/cdb/cdbvars.c @@ -17,9 +17,11 @@ * *------------------------------------------------------------------------- */ +#include "catalog/pg_collation_d.h" #include "postgres.h" #include "miscadmin.h" +#include "regex/regex.h" #include "utils/guc.h" #include "cdb/cdbvars.h" #include "libpq-fe.h" @@ -567,6 +569,44 @@ gpvars_show_gp_resource_manager_policy(void) } } +bool gpvars_check_gp_resource_group_cgroup_parent(char **newval, void **extra, GucSource source) +{ + int regres; + char err[128]; + regex_t re; + char *pattern = "^[0-9a-zA-Z][-._0-9a-zA-Z]*$"; + pg_wchar *wpattern = palloc((strlen(pattern) + 1) * sizeof(pg_wchar)); + int wlen = pg_mb2wchar_with_len(pattern, wpattern, strlen(pattern)); + pg_wchar *data = palloc((strlen(*newval) + 1) * sizeof(pg_wchar)); + int data_len = pg_mb2wchar_with_len(*newval, data, sizeof(*newval)); + bool match = true; + + regres = pg_regcomp(&re, wpattern, wlen, REG_ADVANCED, DEFAULT_COLLATION_OID); + if (regres != REG_OKAY) + { + pg_regerror(regres, &re, err, sizeof(err)); + GUC_check_errmsg("compile regex failed: %s", err); + + pfree(wpattern); + pfree(data); + + return false; + } + + regres = pg_regexec(&re, data, data_len, 0, NULL, 0, NULL, 0); + if (regres != REG_OKAY) + { + match = false; + GUC_check_errmsg("gp_resource_group_cgroup_parent can only contains alphabet, number and non-leading . _ -"); + } + + pg_regfree(&re); + pfree(wpattern); + pfree(data); + + return match; +} + /* * gpvars_assign_statement_mem */ diff --git a/src/backend/utils/misc/guc_gp.c b/src/backend/utils/misc/guc_gp.c index 2c373e5a582..cc98e66c089 100644 --- a/src/backend/utils/misc/guc_gp.c +++ b/src/backend/utils/misc/guc_gp.c @@ -239,6 +239,7 @@ double gp_resource_group_cpu_limit; bool gp_resource_group_bypass; bool gp_resource_group_bypass_catalog_query; bool gp_resource_group_bypass_direct_dispatch; +char *gp_resource_group_cgroup_parent; /* Metrics collector debug GUC */ bool vmem_process_interrupt = false; @@ -4900,6 +4901,17 @@ struct config_string ConfigureNamesString_gp[] = gpvars_show_gp_resource_manager_policy, }, + { + {"gp_resource_group_cgroup_parent", PGC_POSTMASTER, RESOURCES, + gettext_noop("The root of gpdb cgroup hierarchy."), + NULL, + GUC_SUPERUSER_ONLY + }, + &gp_resource_group_cgroup_parent, + "gpdb.service", + gpvars_check_gp_resource_group_cgroup_parent, NULL, NULL + }, + /* for pljava */ { {"pljava_vmoptions", PGC_SUSET, CUSTOM_OPTIONS, diff --git a/src/backend/utils/resgroup/cgroup.c b/src/backend/utils/resgroup/cgroup.c index 504c8c2fcba..7c783fbbf6d 100644 --- a/src/backend/utils/resgroup/cgroup.c +++ b/src/backend/utils/resgroup/cgroup.c @@ -174,7 +174,7 @@ buildPathSafe(Oid group, * for cgroup v2, we just have the top level and child level, * don't need to care about the component. */ - base_dir = base == BASEDIR_GPDB ? "gpdb" : ""; + base_dir = base == BASEDIR_GPDB ? gp_resource_group_cgroup_parent : ""; len = snprintf(path, path_size, "%s/%s%s/%s", cgroupSystemInfo->cgroup_dir, base_dir, group_dir, filename); } diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index b12d29f1e16..13d7e79e262 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -860,6 +860,7 @@ extern void gpvars_assign_gp_resource_manager_policy(const char *newval, void *e extern const char *gpvars_show_gp_resource_manager_policy(void); extern const char *gpvars_assign_gp_resqueue_memory_policy(const char *newval, bool doit, GucSource source); extern const char *gpvars_show_gp_resqueue_memory_policy(void); +extern bool gpvars_check_gp_resource_group_cgroup_parent(char **newval, void **extra, GucSource source); extern bool gpvars_check_statement_mem(int *newval, void **extra, GucSource source); extern bool gpvars_check_rg_query_fixed_mem(int *newval, void **extra, GucSource source); extern int guc_name_compare(const char *namea, const char *nameb); diff --git a/src/include/utils/resgroup.h b/src/include/utils/resgroup.h index 035fc180161..dd03b842fd2 100644 --- a/src/include/utils/resgroup.h +++ b/src/include/utils/resgroup.h @@ -109,6 +109,7 @@ extern int gp_resource_group_queuing_timeout; extern bool gp_resource_group_bypass_catalog_query; extern int gp_resource_group_move_timeout; extern bool gp_resource_group_bypass_direct_dispatch; +extern char *gp_resource_group_cgroup_parent; /* * Non-GUC global variables. diff --git a/src/include/utils/unsync_guc_name.h b/src/include/utils/unsync_guc_name.h index 37f629e6e97..97b9df29814 100644 --- a/src/include/utils/unsync_guc_name.h +++ b/src/include/utils/unsync_guc_name.h @@ -260,6 +260,7 @@ "gp_resource_group_bypass_direct_dispatch", "gp_resource_group_queuing_timeout", "gp_resource_group_move_timeout", + "gp_resource_group_cgroup_parent", "gp_resource_manager", "gp_resqueue_memory_policy", "gp_resqueue_priority", 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 93c1d1aa4df..bc5e8764091 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out +++ b/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out @@ -23,6 +23,8 @@ ERROR: language "plpython3u" already exists -- start_ignore ! gpconfig -c gp_resource_manager -v group-v2; +! gpconfig -c gp_resource_group_cgroup_parent -v "gpdb" + ! gpconfig -c max_connections -v 250 -m 25; ! gpconfig -c runaway_detector_activation_percent -v 100; 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 e2d8db51888..b762850468c 100644 --- a/src/test/isolation2/sql/resgroup/resgroup_auxiliary_tools_v2.sql +++ b/src/test/isolation2/sql/resgroup/resgroup_auxiliary_tools_v2.sql @@ -21,6 +21,7 @@ CREATE LANGUAGE plpython3u; -- enable resource group and restart cluster. -- start_ignore ! gpconfig -c gp_resource_manager -v group-v2; +! gpconfig -c gp_resource_group_cgroup_parent -v "gpdb" ! gpconfig -c max_connections -v 250 -m 25; ! gpconfig -c runaway_detector_activation_percent -v 100; ! gpstop -rai; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
