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]

Reply via email to