From f853f3b0921f190f89471e4ef97805713fbbcde1 Mon Sep 17 00:00:00 2001 From: Pengzhou Tang Date: Mon, 27 Feb 2017 01:27:24 -0500 Subject: [PATCH] Add GUC gp_resource_manager to switch between resource queue and resource group gp_resource_manager is reserved for later use to switch resource control stratagy from resource queue to an under-developing resource statagy named resource group. Eg: gpconfig -c gp_resource_manager -v 'group' gpconfig -c gp_resource_manager -v 'queue' To make it work, a restart of cluster is needed. --- src/backend/cdb/cdbvars.c | 41 +++++++++++++++++++ src/backend/utils/Makefile | 2 +- src/backend/utils/misc/guc_gp.c | 9 ++++ src/backend/utils/resource_manager/Makefile | 17 ++++++++ .../utils/resource_manager/resource_manager.c | 21 ++++++++++ src/backend/utils/resscheduler/resscheduler.c | 1 - src/include/cdb/cdbvars.h | 4 ++ src/include/utils/resource_manager.h | 29 +++++++++++++ src/include/utils/resscheduler.h | 2 +- 9 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 src/backend/utils/resource_manager/Makefile create mode 100644 src/backend/utils/resource_manager/resource_manager.c create mode 100644 src/include/utils/resource_manager.h diff --git a/src/backend/cdb/cdbvars.c b/src/backend/cdb/cdbvars.c index f5e39d79b6..83488f4e13 100644 --- a/src/backend/cdb/cdbvars.c +++ b/src/backend/cdb/cdbvars.c @@ -25,6 +25,7 @@ #include "lib/stringinfo.h" #include "libpq/libpq-be.h" #include "utils/memutils.h" +#include "utils/resource_manager.h" #include "storage/bfz.h" #include "storage/proc.h" #include "cdb/memquota.h" @@ -1191,6 +1192,46 @@ gpvars_assign_gp_fts_probe_pause(bool newval, bool doit, GucSource source) return true; } +/* + * gpvars_assign_gp_resource_manager_policy + * gpvars_show_gp_resource_manager_policy + */ +const char * +gpvars_assign_gp_resource_manager_policy(const char *newval, bool doit, GucSource source __attribute__((unused))) +{ + ResourceManagerPolicy newtype = RESOURCE_MANAGER_POLICY_QUEUE; + + if (newval == NULL || newval[0] == 0 ) + newtype = RESOURCE_MANAGER_POLICY_QUEUE; + else if (!pg_strcasecmp("queue", newval)) + newtype = RESOURCE_MANAGER_POLICY_QUEUE; + else if (!pg_strcasecmp("group", newval)) + newtype = RESOURCE_MANAGER_POLICY_GROUP; + else + elog(ERROR, "unknown resource manager policy: current policy is '%s'", gpvars_show_gp_resource_manager_policy()); + + if (doit) + { + Gp_resource_manager_policy = newtype; + } + + return newval; +} + +const char * +gpvars_show_gp_resource_manager_policy(void) +{ + switch (Gp_resource_manager_policy) + { + case RESOURCE_MANAGER_POLICY_QUEUE: + return "queue"; + case RESOURCE_MANAGER_POLICY_GROUP: + return "group"; + default: + Assert(!"unexpected resource manager policy"); + return "unknown"; + } +} /* * gpvars_assign_gp_resqueue_memory_policy * gpvars_show_gp_resqueue_memory_policy diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile index 4b65ad81f5..0b97139ebc 100644 --- a/src/backend/utils/Makefile +++ b/src/backend/utils/Makefile @@ -10,7 +10,7 @@ include $(top_builddir)/src/Makefile.global OBJS = fmgrtab.o session_state.o SUBDIRS = adt cache datumstream error fmgr hash init mb misc mmgr resowner \ - resgroup resscheduler sort stat time gpmon gp workfile_manager + resgroup resscheduler sort stat time gpmon gp workfile_manager resource_manager include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/utils/misc/guc_gp.c b/src/backend/utils/misc/guc_gp.c index 1e6588fec5..cdbc419d33 100644 --- a/src/backend/utils/misc/guc_gp.c +++ b/src/backend/utils/misc/guc_gp.c @@ -334,6 +334,7 @@ static char *gp_log_fts_str; static char *gp_log_interconnect_str; static char *gp_interconnect_type_str; static char *gp_interconnect_fc_method_str; +static char *gp_resource_manager_str; /* * These variables are all dummies that don't do anything, except in some @@ -5119,6 +5120,14 @@ struct config_string ConfigureNamesString_gp[] = "MEDIUM", gpvars_assign_gp_resqueue_priority_default_value, NULL }, + { + {"gp_resource_manager", PGC_POSTMASTER, RESOURCES, + gettext_noop("Sets the type of resource manager."), + gettext_noop("Only support \"queue\" and \"group\" for now.") + }, + &gp_resource_manager_str, + "queue", gpvars_assign_gp_resource_manager_policy, gpvars_show_gp_resource_manager_policy, + }, { {"gp_email_smtp_server", PGC_SUSET, LOGGING, gettext_noop("Sets the SMTP server and port used to send email alerts."), diff --git a/src/backend/utils/resource_manager/Makefile b/src/backend/utils/resource_manager/Makefile new file mode 100644 index 0000000000..55cbd1c4ab --- /dev/null +++ b/src/backend/utils/resource_manager/Makefile @@ -0,0 +1,17 @@ +#------------------------------------------------------------------------- +# +# Makefile-- +# Makefile for utils/resource_manager +# +# IDENTIFICATION +# src/backend/utils/resource_manager/Makefile +# +#------------------------------------------------------------------------- + +subdir = src/backend/utils/resource_manager +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global + +OBJS = resource_manager.o + +include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/utils/resource_manager/resource_manager.c b/src/backend/utils/resource_manager/resource_manager.c new file mode 100644 index 0000000000..ca6dcfa7fc --- /dev/null +++ b/src/backend/utils/resource_manager/resource_manager.c @@ -0,0 +1,21 @@ +/*------------------------------------------------------------------------- + * + * resource_manager.c + * GPDB resource manager code. + * + * + * Copyright (c) 2006-2017, Greenplum inc. + * + * + ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "utils/guc.h" +#include "utils/resource_manager.h" + +/* + * GUC variables. + */ +bool ResourceScheduler; /* Is scheduling enabled? */ +ResourceManagerPolicy Gp_resource_manager_policy; diff --git a/src/backend/utils/resscheduler/resscheduler.c b/src/backend/utils/resscheduler/resscheduler.c index 158f8c55ad..4d8a84242e 100644 --- a/src/backend/utils/resscheduler/resscheduler.c +++ b/src/backend/utils/resscheduler/resscheduler.c @@ -42,7 +42,6 @@ /* * GUC variables. */ -bool ResourceScheduler; /* Is scheduling enabled? */ int MaxResourceQueues; /* Max # of queues. */ int MaxResourcePortalsPerXact; /* Max # tracked portals - * per backend . */ diff --git a/src/include/cdb/cdbvars.h b/src/include/cdb/cdbvars.h index 8d601e2f77..056291de6b 100644 --- a/src/include/cdb/cdbvars.h +++ b/src/include/cdb/cdbvars.h @@ -1020,6 +1020,10 @@ extern void write_log(const char *fmt,...) __attribute__((format(printf, 1, 2))) extern void verifyGpIdentityIsSet(void); +extern const char *gpvars_assign_gp_resource_manager_policy(const char *newval, bool doit, GucSource source __attribute__((unused)) ); + +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 __attribute__((unused)) ); extern const char *gpvars_show_gp_resqueue_memory_policy(void); diff --git a/src/include/utils/resource_manager.h b/src/include/utils/resource_manager.h new file mode 100644 index 0000000000..cacb008be6 --- /dev/null +++ b/src/include/utils/resource_manager.h @@ -0,0 +1,29 @@ +/*------------------------------------------------------------------------- + * + * resource_manager.h + * GPDB resource manager definitions. + * + * + * Copyright (c) 2006-2017, Greenplum inc. + * + * IDENTIFICATION + * src/include/utils/resource_manager.h + * + *------------------------------------------------------------------------- + */ +#ifndef RESOURCEMANAGER_H +#define RESOURCEMANAGER_H + +typedef enum +{ + RESOURCE_MANAGER_POLICY_QUEUE, + RESOURCE_MANAGER_POLICY_GROUP, +} ResourceManagerPolicy; + +/* + * GUC variables. + */ +extern bool ResourceScheduler; +extern ResourceManagerPolicy Gp_resource_manager_policy; + +#endif /* RESOURCEMANAGER_H */ diff --git a/src/include/utils/resscheduler.h b/src/include/utils/resscheduler.h index c331670d1d..bc18a8262e 100644 --- a/src/include/utils/resscheduler.h +++ b/src/include/utils/resscheduler.h @@ -19,11 +19,11 @@ #include "nodes/plannodes.h" #include "storage/lock.h" #include "tcop/dest.h" +#include "utils/resource_manager.h" /* * GUC variables. */ -extern bool ResourceScheduler; extern int MaxResourceQueues; extern int MaxResourcePortalsPerXact; extern bool ResourceSelectOnly; -- GitLab