summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-04-27 00:12:53 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-04-27 00:12:53 -0400
commita6708e2571ac6d2d2b1dc4cdae39acb282c0c5a9 (patch)
tree1a4235dd8af9f2c722b08312a62923550f4739f8 /src
parentb0f24b5626727f81ecd7024ed5cefbaa336c8100 (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/postmaster/syslogger.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
index 460615bd7d2..0c6ae194769 100644
--- a/src/backend/postmaster/syslogger.c
+++ b/src/backend/postmaster/syslogger.c
@@ -87,6 +87,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;
@@ -315,6 +316,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)
{
@@ -332,9 +338,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);
@@ -343,7 +359,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)
@@ -1106,8 +1122,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)
@@ -1164,8 +1179,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)