Re: [PATCH] Fixed creation of empty .log files during log rotation - Mailing list pgsql-hackers

From Arseny Kositsin
Subject Re: [PATCH] Fixed creation of empty .log files during log rotation
Date
Msg-id 4dc16c9a-a546-48a6-a8df-ab7441a008a6@postgrespro.ru
Whole thread Raw
In response to Re: [PATCH] Fixed creation of empty .log files during log rotation  (Tomas Vondra <tomas@vondra.me>)
List pgsql-hackers
Hi, Tomas.

08.12.2024 01:06, Tomas Vondra wrote:

 > Yeah, creating all those files seems rather unnecessary. But wouldn't it
 > be easier to do the check in logfile_rotate_dest(), instead of for each
 > call? I think something like this would do the trick:
 >
 > @@ -1292,6 +1292,9 @@ logfile_rotate_dest(bool time_based_rotation, int
 > size_rotation_for,
 >      if (!time_based_rotation && (size_rotation_for & target_dest) == 0)
 >          return true;
 >
 > +    if ((Log_destination & target_dest) == 0)
 > +        return true;
 > +
 >      /* file extension depends on the destination type */
 >      if (target_dest == LOG_DESTINATION_STDERR)
 >          logFileExt = NULL;

Thanks for the comments, I agree that it is better to move the check to
logfile_rotate_dest().

 > In fact, isn't it wrong to do the check outside? logfile_rotate_dest()
 > is responsible for closing the log files too, and with the check outside
 > we keep the first .log file open forever (lsof shows that).
 >
 > FWIW my fix has the same issue, but IMO that just means the logic needs
 > to be more complex, but still in logfile_rotate_dest().

You can close the first file if you remove the second part of the 
condition in
if (because it is stderr). I checked it in lsof and the first log file is
closing:

@@ -1274,8 +1274,7 @@ logfile_rotate_dest(bool time_based_rotation, int
size_rotation_for,
       * is assumed to be always opened even if stderr is disabled in
       * log_destination.
       */
-    if ((Log_destination & target_dest) == 0 &&
-        target_dest != LOG_DESTINATION_STDERR)
+    if ((Log_destination & target_dest) == 0)
   {
     if (*logFile != NULL)
       fclose(*logFile);

But the comment above says that stderr should always remain open, even if
disabled in log_destination. Is it really necessary to do more complex 
logic
in order to close this file? I'm sorry if I misunderstood something.

What do you think about this?

Best regards,
Arseny Kositsin.



pgsql-hackers by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: Allow FDW extensions to support MERGE command via CustomScan
Next
From: Ashutosh Bapat
Date:
Subject: Re: Allow subfield references without parentheses