diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-09-09 17:59:11 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-09-09 17:59:11 -0400 |
commit | ca4af308c32d03db5fbacb54d6e583ceb904f268 (patch) | |
tree | 352fb06319a1c8e3efd78acaca9cc8b8ff0e7eda /src/backend | |
parent | a7801b62f21bd051444bd1119cd3745ecc8e14ec (diff) | |
download | postgresql-ca4af308c32d03db5fbacb54d6e583ceb904f268.tar.gz postgresql-ca4af308c32d03db5fbacb54d6e583ceb904f268.zip |
Simplify handling of the timezone GUC by making initdb choose the default.
We were doing some amazingly complicated things in order to avoid running
the very expensive identify_system_timezone() procedure during GUC
initialization. But there is an obvious fix for that, which is to do it
once during initdb and have initdb install the system-specific default into
postgresql.conf, as it already does for most other GUC variables that need
system-environment-dependent defaults. This means that the timezone (and
log_timezone) settings no longer have any magic behavior in the server.
Per discussion.
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/bootstrap/bootstrap.c | 4 | ||||
-rw-r--r-- | src/backend/commands/variable.c | 43 | ||||
-rw-r--r-- | src/backend/postmaster/postmaster.c | 15 | ||||
-rw-r--r-- | src/backend/tcop/postgres.c | 4 | ||||
-rw-r--r-- | src/backend/utils/error/elog.c | 29 | ||||
-rw-r--r-- | src/backend/utils/misc/guc-file.l | 1 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 21 | ||||
-rw-r--r-- | src/backend/utils/misc/postgresql.conf.sample | 4 |
8 files changed, 31 insertions, 90 deletions
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index e3dd472832e..4fe08df350a 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -333,10 +333,6 @@ AuxiliaryProcessMain(int argc, char *argv[]) { if (!SelectConfigFiles(userDoption, progname)) proc_exit(1); - /* If timezone is not set, determine what the OS uses */ - pg_timezone_initialize(); - /* If timezone_abbreviations is not set, select default */ - pg_timezone_abbrev_initialize(); } /* Validate we have been given a reasonable-looking DataDir */ diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 239acd07852..87c54b7d480 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -259,23 +259,6 @@ check_timezone(char **newval, void **extra, GucSource source) char *endptr; double hours; - if (*newval == NULL) - { - /* - * The boot_val given for TimeZone in guc.c is NULL. When we see this - * we just do nothing. If this isn't overridden from the config file - * then pg_timezone_initialize() will eventually select a default - * value from the environment. This hack has two purposes: to avoid - * wasting cycles loading values that might soon be overridden from - * the config file, and to avoid trying to read the timezone files - * during InitializeGUCOptions(). The latter doesn't work in an - * EXEC_BACKEND subprocess because my_exec_path hasn't been set yet - * and so we can't locate PGSHAREDIR. - */ - Assert(source == PGC_S_DEFAULT); - return true; - } - /* * Initialize the "extra" struct that will be passed to assign_timezone. * We don't want to change any of the three global variables except as @@ -374,7 +357,7 @@ check_timezone(char **newval, void **extra, GucSource source) return false; } - if (!tz_acceptable(new_tz)) + if (!pg_tz_acceptable(new_tz)) { GUC_check_errmsg("time zone \"%s\" appears to use leap seconds", *newval); @@ -427,10 +410,6 @@ assign_timezone(const char *newval, void *extra) { timezone_extra *myextra = (timezone_extra *) extra; - /* Do nothing for the boot_val default of NULL */ - if (!myextra) - return; - session_timezone = myextra->session_timezone; CTimeZone = myextra->CTimeZone; HasCTZSet = myextra->HasCTZSet; @@ -490,20 +469,8 @@ check_log_timezone(char **newval, void **extra, GucSource source) { pg_tz *new_tz; - if (*newval == NULL) - { - /* - * The boot_val given for log_timezone in guc.c is NULL. When we see - * this we just do nothing. If this isn't overridden from the config - * file then pg_timezone_initialize() will eventually select a default - * value from the environment. - */ - Assert(source == PGC_S_DEFAULT); - return true; - } - /* - * Otherwise assume it is a timezone name, and try to load it. + * Assume it is a timezone name, and try to load it. */ new_tz = pg_tzset(*newval); @@ -513,7 +480,7 @@ check_log_timezone(char **newval, void **extra, GucSource source) return false; } - if (!tz_acceptable(new_tz)) + if (!pg_tz_acceptable(new_tz)) { GUC_check_errmsg("time zone \"%s\" appears to use leap seconds", *newval); @@ -538,10 +505,6 @@ check_log_timezone(char **newval, void **extra, GucSource source) void assign_log_timezone(const char *newval, void *extra) { - /* Do nothing for the boot_val default of NULL */ - if (!extra) - return; - log_timezone = *((pg_tz **) extra); } diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index df4a2aa8853..94b57fa7bbd 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -796,21 +796,6 @@ PostmasterMain(int argc, char *argv[]) CreateDataDirLockFile(true); /* - * If timezone is not set, determine what the OS uses. (In theory this - * should be done during GUC initialization, but because it can take as - * much as several seconds, we delay it until after we've created the - * postmaster.pid file. This prevents problems with boot scripts that - * expect the pidfile to appear quickly. Also, we avoid problems with - * trying to locate the timezone files too early in initialization.) - */ - pg_timezone_initialize(); - - /* - * Likewise, init timezone_abbreviations if not already set. - */ - pg_timezone_abbrev_initialize(); - - /* * Initialize SSL library, if specified. */ #ifdef USE_SSL diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index b708328926a..072d50c3951 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3537,10 +3537,6 @@ PostgresMain(int argc, char *argv[], const char *username) { if (!SelectConfigFiles(userDoption, progname)) proc_exit(1); - /* If timezone is not set, determine what the OS uses */ - pg_timezone_initialize(); - /* If timezone_abbreviations is not set, select default */ - pg_timezone_abbrev_initialize(); } /* diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 6e8e5aef4e0..f0b3b1feb06 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -1805,24 +1805,20 @@ setup_formatted_log_time(void) { struct timeval tv; pg_time_t stamp_time; - pg_tz *tz; char msbuf[8]; gettimeofday(&tv, NULL); stamp_time = (pg_time_t) tv.tv_sec; /* - * Normally we print log timestamps in log_timezone, but during startup we - * could get here before that's set. If so, fall back to gmt_timezone - * (which guc.c ensures is set up before Log_line_prefix can become - * nonempty). + * Note: we expect that guc.c will ensure that log_timezone is set up + * (at least with a minimal GMT value) before Log_line_prefix can become + * nonempty or CSV mode can be selected. */ - tz = log_timezone ? log_timezone : gmt_timezone; - pg_strftime(formatted_log_time, FORMATTED_TS_LEN, /* leave room for milliseconds... */ "%Y-%m-%d %H:%M:%S %Z", - pg_localtime(&stamp_time, tz)); + pg_localtime(&stamp_time, log_timezone)); /* 'paste' milliseconds into place... */ sprintf(msbuf, ".%03d", (int) (tv.tv_usec / 1000)); @@ -1836,19 +1832,15 @@ static void setup_formatted_start_time(void) { pg_time_t stamp_time = (pg_time_t) MyStartTime; - pg_tz *tz; /* - * Normally we print log timestamps in log_timezone, but during startup we - * could get here before that's set. If so, fall back to gmt_timezone - * (which guc.c ensures is set up before Log_line_prefix can become - * nonempty). + * Note: we expect that guc.c will ensure that log_timezone is set up + * (at least with a minimal GMT value) before Log_line_prefix can become + * nonempty or CSV mode can be selected. */ - tz = log_timezone ? log_timezone : gmt_timezone; - pg_strftime(formatted_start_time, FORMATTED_TS_LEN, "%Y-%m-%d %H:%M:%S %Z", - pg_localtime(&stamp_time, tz)); + pg_localtime(&stamp_time, log_timezone)); } /* @@ -1947,14 +1939,11 @@ log_line_prefix(StringInfo buf, ErrorData *edata) case 't': { pg_time_t stamp_time = (pg_time_t) time(NULL); - pg_tz *tz; char strfbuf[128]; - tz = log_timezone ? log_timezone : gmt_timezone; - pg_strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", - pg_localtime(&stamp_time, tz)); + pg_localtime(&stamp_time, log_timezone)); appendStringInfoString(buf, strfbuf); } break; diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l index 70abf40a28e..809307da8d3 100644 --- a/src/backend/utils/misc/guc-file.l +++ b/src/backend/utils/misc/guc-file.l @@ -292,7 +292,6 @@ ProcessConfigFile(GucContext context) if (context == PGC_SIGHUP) { InitializeGUCOptionsFromEnvironment(); - pg_timezone_initialize(); pg_timezone_abbrev_initialize(); /* this selects SQL_ASCII in processes not connected to a database */ SetConfigOption("client_encoding", GetDatabaseEncodingName(), diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 6670997acde..a71729c2e70 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -187,6 +187,7 @@ static bool check_log_stats(bool *newval, void **extra, GucSource source); static bool check_canonical_path(char **newval, void **extra, GucSource source); static bool check_timezone_abbreviations(char **newval, void **extra, GucSource source); static void assign_timezone_abbreviations(const char *newval, void *extra); +static void pg_timezone_abbrev_initialize(void); static const char *show_archive_command(void); static void assign_tcp_keepalives_idle(int newval, void *extra); static void assign_tcp_keepalives_interval(int newval, void *extra); @@ -2547,7 +2548,7 @@ static struct config_string ConfigureNamesString[] = NULL }, &log_timezone_string, - NULL, + "GMT", check_log_timezone, assign_log_timezone, show_log_timezone }, @@ -2827,7 +2828,7 @@ static struct config_string ConfigureNamesString[] = GUC_REPORT }, &timezone_string, - NULL, + "GMT", check_timezone, assign_timezone, show_timezone }, { @@ -3817,7 +3818,7 @@ InitializeGUCOptions(void) * Before log_line_prefix could possibly receive a nonempty setting, make * sure that timezone processing is minimally alive (see elog.c). */ - pg_timezone_pre_initialize(); + pg_timezone_initialize(); /* * Build sorted array of all GUC variables. @@ -4115,6 +4116,15 @@ SelectConfigFiles(const char *userDoption, const char *progname) SetConfigOption("data_directory", DataDir, PGC_POSTMASTER, PGC_S_OVERRIDE); /* + * If timezone_abbreviations wasn't set in the configuration file, install + * the default value. We do it this way because we can't safely install + * a "real" value until my_exec_path is set, which may not have happened + * when InitializeGUCOptions runs, so the bootstrap default value cannot + * be the real desired default. + */ + pg_timezone_abbrev_initialize(); + + /* * Figure out where pg_hba.conf is, and make sure the path is absolute. */ if (HbaFileName) @@ -8444,8 +8454,11 @@ assign_timezone_abbreviations(const char *newval, void *extra) * This is called after initial loading of postgresql.conf. If no * timezone_abbreviations setting was found therein, select default. * If a non-default value is already installed, nothing will happen. + * + * This can also be called from ProcessConfigFile to establish the default + * value after a postgresql.conf entry for it is removed. */ -void +static void pg_timezone_abbrev_initialize(void) { SetConfigOption("timezone_abbreviations", "Default", diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index e713defea2c..a18f14ae253 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -406,7 +406,7 @@ #log_temp_files = -1 # log temporary files equal or larger # than the specified size in kilobytes; # -1 disables, 0 logs all temp files -#log_timezone = '(defaults to server environment setting)' +#log_timezone = 'GMT' #------------------------------------------------------------------------------ @@ -486,7 +486,7 @@ #datestyle = 'iso, mdy' #intervalstyle = 'postgres' -#timezone = '(defaults to server environment setting)' +#timezone = 'GMT' #timezone_abbreviations = 'Default' # Select the set of available time zone # abbreviations. Currently, there are # Default |