]> granicus.if.org Git - postgresql/commitdiff
Fix syslogger's rotation disable/re-enable logic.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 27 Apr 2012 04:12:42 +0000 (00:12 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 27 Apr 2012 04:12:42 +0000 (00:12 -0400)
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.

src/backend/postmaster/syslogger.c

index 70e132f4e58f114bcdabc4c71c4a48d21542971f..f5ae84157c8c6b9aceae8e937ba1d35910b129ab 100644 (file)
@@ -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)