Commit 070518dd authored by Peter Eisentraut's avatar Peter Eisentraut

Add session_preload_libraries configuration parameter

This is like shared_preload_libraries except that it takes effect at
backend start and can be changed without a full postmaster restart.  It
is like local_preload_libraries except that it is still only settable by
a superuser.  This can be a better way to load modules such as
auto_explain.

Since there are now three preload parameters, regroup the documentation
a bit.  Put all parameters into one section, explain common
functionality only once, update the descriptions to reflect current and
future realities.
Reviewed-by: default avatarDimitri Fontaine <dimitri@2ndQuadrant.fr>
parent f3ab5d46
...@@ -24,7 +24,8 @@ LOAD 'auto_explain'; ...@@ -24,7 +24,8 @@ LOAD 'auto_explain';
</programlisting> </programlisting>
(You must be superuser to do that.) More typical usage is to preload (You must be superuser to do that.) More typical usage is to preload
it into all sessions by including <literal>auto_explain</> in it into some or all sessions by including <literal>auto_explain</> in
<xref linkend="guc-session-preload-libraries"> or
<xref linkend="guc-shared-preload-libraries"> in <xref linkend="guc-shared-preload-libraries"> in
<filename>postgresql.conf</>. Then you can track unexpectedly slow queries <filename>postgresql.conf</>. Then you can track unexpectedly slow queries
no matter when they happen. Of course there is a price in overhead for no matter when they happen. Of course there is a price in overhead for
...@@ -185,7 +186,7 @@ LOAD 'auto_explain'; ...@@ -185,7 +186,7 @@ LOAD 'auto_explain';
<programlisting> <programlisting>
# postgresql.conf # postgresql.conf
shared_preload_libraries = 'auto_explain' session_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '3s' auto_explain.log_min_duration = '3s'
</programlisting> </programlisting>
......
This diff is collapsed.
...@@ -3743,7 +3743,7 @@ PostgresMain(int argc, char *argv[], ...@@ -3743,7 +3743,7 @@ PostgresMain(int argc, char *argv[],
* process any libraries that should be preloaded at backend start (this * process any libraries that should be preloaded at backend start (this
* likewise can't be done until GUC settings are complete) * likewise can't be done until GUC settings are complete)
*/ */
process_local_preload_libraries(); process_session_preload_libraries();
/* /*
* Send this backend's cancellation info to the frontend. * Send this backend's cancellation info to the frontend.
......
...@@ -1222,6 +1222,7 @@ ValidatePgVersion(const char *path) ...@@ -1222,6 +1222,7 @@ ValidatePgVersion(const char *path)
* GUC variables: lists of library names to be preloaded at postmaster * GUC variables: lists of library names to be preloaded at postmaster
* start and at backend start * start and at backend start
*/ */
char *session_preload_libraries_string = NULL;
char *shared_preload_libraries_string = NULL; char *shared_preload_libraries_string = NULL;
char *local_preload_libraries_string = NULL; char *local_preload_libraries_string = NULL;
...@@ -1318,8 +1319,11 @@ process_shared_preload_libraries(void) ...@@ -1318,8 +1319,11 @@ process_shared_preload_libraries(void)
* process any libraries that should be preloaded at backend start * process any libraries that should be preloaded at backend start
*/ */
void void
process_local_preload_libraries(void) process_session_preload_libraries(void)
{ {
load_libraries(session_preload_libraries_string,
"session_preload_libraries",
false);
load_libraries(local_preload_libraries_string, load_libraries(local_preload_libraries_string,
"local_preload_libraries", "local_preload_libraries",
true); true);
......
...@@ -591,6 +591,8 @@ const char *const config_group_names[] = ...@@ -591,6 +591,8 @@ const char *const config_group_names[] =
gettext_noop("Client Connection Defaults / Statement Behavior"), gettext_noop("Client Connection Defaults / Statement Behavior"),
/* CLIENT_CONN_LOCALE */ /* CLIENT_CONN_LOCALE */
gettext_noop("Client Connection Defaults / Locale and Formatting"), gettext_noop("Client Connection Defaults / Locale and Formatting"),
/* CLIENT_CONN_PRELOAD */
gettext_noop("Client Connection Defaults / Shared Library Preloading"),
/* CLIENT_CONN_OTHER */ /* CLIENT_CONN_OTHER */
gettext_noop("Client Connection Defaults / Other Defaults"), gettext_noop("Client Connection Defaults / Other Defaults"),
/* LOCK_MANAGEMENT */ /* LOCK_MANAGEMENT */
...@@ -2770,7 +2772,18 @@ static struct config_string ConfigureNamesString[] = ...@@ -2770,7 +2772,18 @@ static struct config_string ConfigureNamesString[] =
}, },
{ {
{"shared_preload_libraries", PGC_POSTMASTER, RESOURCES_KERNEL, {"session_preload_libraries", PGC_SUSET, CLIENT_CONN_PRELOAD,
gettext_noop("Lists shared libraries to preload into each backend."),
NULL,
GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY
},
&session_preload_libraries_string,
"",
NULL, NULL, NULL
},
{
{"shared_preload_libraries", PGC_POSTMASTER, CLIENT_CONN_PRELOAD,
gettext_noop("Lists shared libraries to preload into server."), gettext_noop("Lists shared libraries to preload into server."),
NULL, NULL,
GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY
...@@ -2781,8 +2794,8 @@ static struct config_string ConfigureNamesString[] = ...@@ -2781,8 +2794,8 @@ static struct config_string ConfigureNamesString[] =
}, },
{ {
{"local_preload_libraries", PGC_BACKEND, CLIENT_CONN_OTHER, {"local_preload_libraries", PGC_BACKEND, CLIENT_CONN_PRELOAD,
gettext_noop("Lists shared libraries to preload into each backend."), gettext_noop("Lists unprivileged shared libraries to preload into each backend."),
NULL, NULL,
GUC_LIST_INPUT | GUC_LIST_QUOTE GUC_LIST_INPUT | GUC_LIST_QUOTE
}, },
......
...@@ -403,6 +403,7 @@ extern void BaseInit(void); ...@@ -403,6 +403,7 @@ extern void BaseInit(void);
/* in utils/init/miscinit.c */ /* in utils/init/miscinit.c */
extern bool IgnoreSystemIndexes; extern bool IgnoreSystemIndexes;
extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress; extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress;
extern char *session_preload_libraries_string;
extern char *shared_preload_libraries_string; extern char *shared_preload_libraries_string;
extern char *local_preload_libraries_string; extern char *local_preload_libraries_string;
...@@ -438,7 +439,7 @@ extern void TouchSocketLockFiles(void); ...@@ -438,7 +439,7 @@ extern void TouchSocketLockFiles(void);
extern void AddToDataDirLockFile(int target_line, const char *str); extern void AddToDataDirLockFile(int target_line, const char *str);
extern void ValidatePgVersion(const char *path); extern void ValidatePgVersion(const char *path);
extern void process_shared_preload_libraries(void); extern void process_shared_preload_libraries(void);
extern void process_local_preload_libraries(void); extern void process_session_preload_libraries(void);
extern void pg_bindtextdomain(const char *domain); extern void pg_bindtextdomain(const char *domain);
extern bool has_rolreplication(Oid roleid); extern bool has_rolreplication(Oid roleid);
......
...@@ -88,6 +88,7 @@ enum config_group ...@@ -88,6 +88,7 @@ enum config_group
CLIENT_CONN, CLIENT_CONN,
CLIENT_CONN_STATEMENT, CLIENT_CONN_STATEMENT,
CLIENT_CONN_LOCALE, CLIENT_CONN_LOCALE,
CLIENT_CONN_PRELOAD,
CLIENT_CONN_OTHER, CLIENT_CONN_OTHER,
LOCK_MANAGEMENT, LOCK_MANAGEMENT,
COMPAT_OPTIONS, COMPAT_OPTIONS,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment