aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-09-09 17:59:11 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-09-09 17:59:11 -0400
commitca4af308c32d03db5fbacb54d6e583ceb904f268 (patch)
tree352fb06319a1c8e3efd78acaca9cc8b8ff0e7eda /src/backend
parenta7801b62f21bd051444bd1119cd3745ecc8e14ec (diff)
downloadpostgresql-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.c4
-rw-r--r--src/backend/commands/variable.c43
-rw-r--r--src/backend/postmaster/postmaster.c15
-rw-r--r--src/backend/tcop/postgres.c4
-rw-r--r--src/backend/utils/error/elog.c29
-rw-r--r--src/backend/utils/misc/guc-file.l1
-rw-r--r--src/backend/utils/misc/guc.c21
-rw-r--r--src/backend/utils/misc/postgresql.conf.sample4
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