On 5 May 2014 17:22, Andres Freund <and...@2ndquadrant.com> wrote: > On 2014-05-05 13:07:48 -0400, Tom Lane wrote: > > Andres Freund <and...@2ndquadrant.com> writes: > > > On 2014-05-05 10:07:46 -0400, Tom Lane wrote: > > >> Also, -1 for adding another log_line_prefix escape. If you're routing > > >> multiple clusters logging to the same place (which is already a bit > > >> unlikely IMO), you can put distinguishing strings in log_line_prefix > > >> already. And it's not like we've got an infinite supply of letters > > >> for those escapes. > > > > > Using syslog and including the same config file from multiple clusters > > > isn't that uncommon. But I can live without it. > > > > So, if you are sharing a config file, how is it that you can set a > > per-cluster cluster_name but not a per-cluster log_line_prefix? > > Well, it's a included file. With log_line_prefix support just > cluster_name has to be set per cluster. Without you need string > interpolation in the config management to include cluster_name in > log_line_prefix. >
Attached as cluster-name-in-ps-v3-a.patch is a new version with the following changes: * the brackets removed, as suggested by Tom Lane * static initialization of cluster_name to avoid any possibility of an uninitialized/null pointer being used before GUC initialization, as suggested by Andres Freund * cluster_name moved to config group CONN_AUTH_SETTINGS, on the basis that it's similar to bonjour_name, but it isn't really... open to suggestions for a better config_group! * a small amount of documentation in config.sgml (with cluster_name under Connection Settings, which probably isn't right either) * sample conf file updated to show cluster_name and %C in log_line_prefix A shorter version without the log_line_prefix support that Tom didn't like is attached as cluster-name-in-ps-v3-b.patch. I will try to add these to the open commitfest, and see if there is something I can usefully review in return. I verified that SHOW cluster_name works as expected and you can't change it with SET. Thanks, Thomas Munro
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 4a33f87..0fd414e 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -681,6 +681,24 @@ include 'filename' </listitem> </varlistentry> + <varlistentry id="guc-cluster-name" xreflabel="cluster_name"> + <term><varname>cluster_name</varname> (<type>string</type>)</term> + <indexterm> + <primary><varname>cluster_name</> configuration parameter</primary> + </indexterm> + <listitem> + <para> + Sets the cluster name that appears in the process title for all + processes in this cluster. No name is shown if this parameter is set + to the empty string <literal>''</> (which is the default). The + process title is typically viewed by the <command>ps</> command, or in + Windows by using the <application>Process Explorer</>. The cluster + name can also be included in the <varname>log_line_prefix</varname>. + This parameter can only be set at server start. + </para> + </listitem> + </varlistentry> + <varlistentry id="guc-tcp-keepalives-idle" xreflabel="tcp_keepalives_idle"> <term><varname>tcp_keepalives_idle</varname> (<type>integer</type>)</term> <indexterm> @@ -4212,6 +4230,11 @@ local0.* /var/log/postgresql </thead> <tbody> <row> + <entry><literal>%C</literal></entry> + <entry>Cluster name</entry> + <entry>no</entry> + </row> + <row> <entry><literal>%a</literal></entry> <entry>Application name</entry> <entry>yes</entry> diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 977fc66..0adfee7 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -2345,6 +2345,12 @@ log_line_prefix(StringInfo buf, ErrorData *edata) else appendStringInfo(buf, "%lx.%x", (long) (MyStartTime), MyProcPid); break; + case 'C': + if (padding != 0) + appendStringInfo(buf, "%*s", padding, cluster_name); + else + appendStringInfoString(buf, cluster_name); + break; case 'p': if (padding != 0) appendStringInfo(buf, "%*d", padding, MyProcPid); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 15020c4..71897b8 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -449,6 +449,7 @@ int temp_file_limit = -1; int num_temp_buffers = 1024; +const char *cluster_name = ""; char *data_directory; char *ConfigFileName; char *HbaFileName; @@ -3091,6 +3092,17 @@ static struct config_string ConfigureNamesString[] = }, { + {"cluster_name", PGC_POSTMASTER, CONN_AUTH_SETTINGS, + gettext_noop("Sets the name of the cluster that appears in 'ps' output."), + NULL, + GUC_IS_NAME + }, + &cluster_name, + "", + NULL, NULL, NULL + }, + + { {"data_directory", PGC_POSTMASTER, FILE_LOCATIONS, gettext_noop("Sets the server's data directory."), NULL, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 70e5a51..8ad292a 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -74,6 +74,8 @@ # (change requires restart) #bonjour_name = '' # defaults to the computer name # (change requires restart) +#cluster_name = '' # defaults to the computer name + # (change requires restart) # - Security and Authentication - @@ -410,6 +412,7 @@ #log_error_verbosity = default # terse, default, or verbose messages #log_hostname = off #log_line_prefix = '' # special values: + # %C = cluster name # %a = application name # %u = user name # %d = database name diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c index 6294ca3..80a3fef 100644 --- a/src/backend/utils/misc/ps_status.c +++ b/src/backend/utils/misc/ps_status.c @@ -29,6 +29,7 @@ #include "libpq/libpq.h" #include "miscadmin.h" #include "utils/ps_status.h" +#include "utils/guc.h" extern char **environ; bool update_process_title = true; @@ -264,15 +265,24 @@ init_ps_display(const char *username, const char *dbname, * apparently setproctitle() already adds a `progname:' prefix to the ps * line */ - snprintf(ps_buffer, ps_buffer_size, - "%s %s %s ", - username, dbname, host_info); +#define PROGRAM_NAME_PREFIX "" #else - snprintf(ps_buffer, ps_buffer_size, - "postgres: %s %s %s ", - username, dbname, host_info); +#define PROGRAM_NAME_PREFIX "postgres: " #endif + if (*cluster_name == '\0') + { + snprintf(ps_buffer, ps_buffer_size, + PROGRAM_NAME_PREFIX "%s %s %s ", + username, dbname, host_info); + } + else + { + snprintf(ps_buffer, ps_buffer_size, + PROGRAM_NAME_PREFIX "%s %s %s %s ", + cluster_name, username, dbname, host_info); + } + ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer); set_ps_display(initial_str, true); diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index be68f35..4dd2c58 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -223,6 +223,7 @@ extern int temp_file_limit; extern int num_temp_buffers; +extern const char *cluster_name; extern char *data_directory; extern char *ConfigFileName; extern char *HbaFileName;
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 4a33f87..104f0bc 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -681,6 +681,23 @@ include 'filename' </listitem> </varlistentry> + <varlistentry id="guc-cluster-name" xreflabel="cluster_name"> + <term><varname>cluster_name</varname> (<type>string</type>)</term> + <indexterm> + <primary><varname>cluster_name</> configuration parameter</primary> + </indexterm> + <listitem> + <para> + Sets the cluster name that appears in the process title for all + processes in this cluster. No name is shown if this parameter is set + to the empty string <literal>''</> (which is the default). The + process title is typically viewed by the <command>ps</> command, or in + Windows by using the <application>Process Explorer</>. + This parameter can only be set at server start. + </para> + </listitem> + </varlistentry> + <varlistentry id="guc-tcp-keepalives-idle" xreflabel="tcp_keepalives_idle"> <term><varname>tcp_keepalives_idle</varname> (<type>integer</type>)</term> <indexterm> diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 15020c4..71897b8 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -449,6 +449,7 @@ int temp_file_limit = -1; int num_temp_buffers = 1024; +const char *cluster_name = ""; char *data_directory; char *ConfigFileName; char *HbaFileName; @@ -3091,6 +3092,17 @@ static struct config_string ConfigureNamesString[] = }, { + {"cluster_name", PGC_POSTMASTER, CONN_AUTH_SETTINGS, + gettext_noop("Sets the name of the cluster that appears in 'ps' output."), + NULL, + GUC_IS_NAME + }, + &cluster_name, + "", + NULL, NULL, NULL + }, + + { {"data_directory", PGC_POSTMASTER, FILE_LOCATIONS, gettext_noop("Sets the server's data directory."), NULL, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 70e5a51..84ae5f3 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -74,6 +74,8 @@ # (change requires restart) #bonjour_name = '' # defaults to the computer name # (change requires restart) +#cluster_name = '' # defaults to the computer name + # (change requires restart) # - Security and Authentication - diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c index 6294ca3..80a3fef 100644 --- a/src/backend/utils/misc/ps_status.c +++ b/src/backend/utils/misc/ps_status.c @@ -29,6 +29,7 @@ #include "libpq/libpq.h" #include "miscadmin.h" #include "utils/ps_status.h" +#include "utils/guc.h" extern char **environ; bool update_process_title = true; @@ -264,15 +265,24 @@ init_ps_display(const char *username, const char *dbname, * apparently setproctitle() already adds a `progname:' prefix to the ps * line */ - snprintf(ps_buffer, ps_buffer_size, - "%s %s %s ", - username, dbname, host_info); +#define PROGRAM_NAME_PREFIX "" #else - snprintf(ps_buffer, ps_buffer_size, - "postgres: %s %s %s ", - username, dbname, host_info); +#define PROGRAM_NAME_PREFIX "postgres: " #endif + if (*cluster_name == '\0') + { + snprintf(ps_buffer, ps_buffer_size, + PROGRAM_NAME_PREFIX "%s %s %s ", + username, dbname, host_info); + } + else + { + snprintf(ps_buffer, ps_buffer_size, + PROGRAM_NAME_PREFIX "%s %s %s %s ", + cluster_name, username, dbname, host_info); + } + ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer); set_ps_display(initial_str, true); diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index be68f35..4dd2c58 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -223,6 +223,7 @@ extern int temp_file_limit; extern int num_temp_buffers; +extern const char *cluster_name; extern char *data_directory; extern char *ConfigFileName; extern char *HbaFileName;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers