summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2009-01-03 20:03:08 +0000
committerTom Lane2009-01-03 20:03:08 +0000
commit4ad56ba2f9175e173253e9bac349a09092c58b21 (patch)
tree0c911b93e465e48c6e59fd25dd331c47e6cb9528
parentda47a3aa7da4cb9fb3e110a6262457572cdb86fe (diff)
Allow loadable modules to create PGC_POSTMASTER GUC variables, but only
when loaded via shared_preload_libraries. Needed for support of pg_stat_statements, or pretty much anything else that wants a GUC to control size of a shared memory allocation.
-rw-r--r--src/backend/utils/init/miscinit.c5
-rw-r--r--src/backend/utils/misc/guc.c21
-rw-r--r--src/include/miscadmin.h1
3 files changed, 26 insertions, 1 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index 3c1f00fef9..74b4078254 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -1131,6 +1131,9 @@ ValidatePgVersion(const char *path)
char *shared_preload_libraries_string = NULL;
char *local_preload_libraries_string = NULL;
+/* Flag telling that we are loading shared_preload_libraries */
+bool process_shared_preload_libraries_in_progress = false;
+
/*
* load the shared libraries listed in 'libraries'
*
@@ -1197,9 +1200,11 @@ load_libraries(const char *libraries, const char *gucname, bool restricted)
void
process_shared_preload_libraries(void)
{
+ process_shared_preload_libraries_in_progress = true;
load_libraries(shared_preload_libraries_string,
"shared_preload_libraries",
false);
+ process_shared_preload_libraries_in_progress = false;
}
/*
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 137077e104..b524c3c878 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -5625,6 +5625,17 @@ init_custom_variable(const char *name,
{
struct config_generic *gen;
+ /*
+ * Only allow custom PGC_POSTMASTER variables to be created during
+ * shared library preload; any later than that, we can't ensure that
+ * the value doesn't change after startup. This is a fatal elog if it
+ * happens; just erroring out isn't safe because we don't know what
+ * the calling loadable module might already have hooked into.
+ */
+ if (context == PGC_POSTMASTER &&
+ !process_shared_preload_libraries_in_progress)
+ elog(FATAL, "cannot create PGC_POSTMASTER variables after startup");
+
gen = (struct config_generic *) guc_malloc(ERROR, sz);
memset(gen, 0, sz);
@@ -5707,7 +5718,15 @@ define_custom_variable(struct config_generic * variable)
case PGC_S_ENV_VAR:
case PGC_S_FILE:
case PGC_S_ARGV:
- phcontext = PGC_SIGHUP;
+ /*
+ * If we got past the check in init_custom_variable, we can
+ * safely assume that any existing value for a PGC_POSTMASTER
+ * variable was set in postmaster context.
+ */
+ if (variable->context == PGC_POSTMASTER)
+ phcontext = PGC_POSTMASTER;
+ else
+ phcontext = PGC_SIGHUP;
break;
case PGC_S_DATABASE:
case PGC_S_USER:
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index 2b1382c0ab..9753d2f71c 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -328,6 +328,7 @@ extern void BaseInit(void);
/* in utils/init/miscinit.c */
extern bool IgnoreSystemIndexes;
+extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress;
extern char *shared_preload_libraries_string;
extern char *local_preload_libraries_string;