diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2012-04-27 00:12:47 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2012-04-27 00:12:47 -0400 |
commit | 1869f000b0a31d71906ad6ac6e86b08a65f723f0 (patch) | |
tree | 7c98f37dc5db24ae14611bb65f8a72f2b34ff1d4 | |
parent | 4fa520f147992616a08e5dbb34620dc46d664fc2 (diff) | |
download | postgresql-1869f000b0a31d71906ad6ac6e86b08a65f723f0.tar.gz postgresql-1869f000b0a31d71906ad6ac6e86b08a65f723f0.zip |
Fix syslogger's rotation disable/re-enable logic.
If it fails to open a new log file, the syslogger assumes there's something
wrong with its parameters (such as log_directory), and stops attempting
automatic time-based or size-based log file rotations. Sending it SIGHUP
is supposed to start that up again. However, the original coding for that
was really bogus, involving clobbering a couple of GUC variables and hoping
that SIGHUP processing would restore them. Get rid of that technique in
favor of maintaining a separate flag showing we've turned rotation off.
Per report from Mark Kirkwood.
Also, the syslogger will automatically attempt to create the log_directory
directory if it doesn't exist, but that was only happening at startup.
For consistency and ease of use, it should do the same whenever the value
of log_directory is changed by SIGHUP.
Back-patch to all supported branches.
-rw-r--r-- | src/backend/postmaster/syslogger.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index 3d54d9c6459..cc007bf5c9d 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -88,6 +88,7 @@ extern bool redirection_done; */ static pg_time_t next_rotation_time; static bool pipe_eof_seen = false; +static bool rotation_disabled = false; static FILE *syslogFile = NULL; static FILE *csvlogFile = NULL; static char *last_file_name = NULL; @@ -318,6 +319,11 @@ SysLoggerMain(int argc, char *argv[]) pfree(currentLogDir); currentLogDir = pstrdup(Log_directory); rotation_requested = true; + + /* + * Also, create new directory if not present; ignore errors + */ + mkdir(Log_directory, S_IRWXU); } if (strcmp(Log_filename, currentLogFilename) != 0) { @@ -335,9 +341,19 @@ SysLoggerMain(int argc, char *argv[]) currentLogRotationAge = Log_RotationAge; set_next_rotation_time(); } + + /* + * If we had a rotation-disabling failure, re-enable rotation + * attempts after SIGHUP, and force one immediately. + */ + if (rotation_disabled) + { + rotation_disabled = false; + rotation_requested = true; + } } - if (!rotation_requested && Log_RotationAge > 0) + if (!rotation_requested && Log_RotationAge > 0 && !rotation_disabled) { /* Do a logfile rotation if it's time */ pg_time_t now = (pg_time_t) time(NULL); @@ -346,7 +362,7 @@ SysLoggerMain(int argc, char *argv[]) rotation_requested = time_based_rotation = true; } - if (!rotation_requested && Log_RotationSize > 0) + if (!rotation_requested && Log_RotationSize > 0 && !rotation_disabled) { /* Do a rotation if file is too big */ if (ftell(syslogFile) >= Log_RotationSize * 1024L) @@ -1122,8 +1138,7 @@ logfile_rotate(bool time_based_rotation, int size_rotation_for) { ereport(LOG, (errmsg("disabling automatic rotation (use SIGHUP to re-enable)"))); - Log_RotationAge = 0; - Log_RotationSize = 0; + rotation_disabled = true; } if (filename) @@ -1167,8 +1182,7 @@ logfile_rotate(bool time_based_rotation, int size_rotation_for) { ereport(LOG, (errmsg("disabling automatic rotation (use SIGHUP to re-enable)"))); - Log_RotationAge = 0; - Log_RotationSize = 0; + rotation_disabled = true; } if (filename) |