]> granicus.if.org Git - postgresql/commitdiff
Only use the pipe chunking protocol if we know the syslogger should
authorAndrew Dunstan <andrew@dunslane.net>
Thu, 19 Jul 2007 19:14:54 +0000 (19:14 +0000)
committerAndrew Dunstan <andrew@dunslane.net>
Thu, 19 Jul 2007 19:14:54 +0000 (19:14 +0000)
be catching stderr output, and we are not ourselves the
syslogger. Otherwise, go directly to stderr.
Bug noticed by Tom Lane.
Backpatch as far as 8.0.

src/backend/postmaster/postmaster.c
src/backend/postmaster/syslogger.c
src/backend/utils/error/elog.c

index 09485ed5f93248a2d163ce3dd9563f671213ab34..9bf5acbd5bc8152f8118e7b26261e597db83228f 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.475.2.7 2007/02/11 15:12:48 mha Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.475.2.8 2007/07/19 19:14:54 adunstan Exp $
  *
  * NOTES
  *
@@ -211,8 +211,8 @@ static pid_t StartupPID = 0,
                        BgWriterPID = 0,
                        AutoVacPID = 0,
                        PgArchPID = 0,
-                       PgStatPID = 0;
-pid_t                  SysLoggerPID = 0; /* Needs to be accessed from elog.c */
+               PgStatPID = 0,
+               SysLoggerPID = 0;
 
 /* Startup/shutdown state */
 #define                        NoShutdown              0
@@ -225,6 +225,7 @@ static bool FatalError = false; /* T if recovering from backend crash */
 
 bool           ClientAuthInProgress = false;           /* T during new-client
                                                                                                 * authentication */
+bool redirection_done = false; 
 
 /*
  * State for assigning random salts and cancel keys.
@@ -336,6 +337,7 @@ typedef struct
        InheritableSocket pgStatPipe1;
        pid_t           PostmasterPid;
        TimestampTz PgStartTime;
+       bool        redirection_done;
 #ifdef WIN32
        HANDLE          PostmasterHandle;
        HANDLE          initial_signal_pipe;
@@ -3704,6 +3706,8 @@ save_backend_variables(BackendParameters * param, Port *port,
        param->PostmasterPid = PostmasterPid;
        param->PgStartTime = PgStartTime;
 
+       param->redirection_done = redirection_done;
+
 #ifdef WIN32
        param->PostmasterHandle = PostmasterHandle;
        write_duplicated_handle(&param->initial_signal_pipe,
@@ -3909,6 +3913,8 @@ restore_backend_variables(BackendParameters * param, Port *port)
        PostmasterPid = param->PostmasterPid;
        PgStartTime = param->PgStartTime;
 
+       redirection_done = param->redirection_done;
+
 #ifdef WIN32
        PostmasterHandle = param->PostmasterHandle;
        pgwin32_initial_signal_pipe = param->initial_signal_pipe;
index 6cb3a48baff72575f7bf7c861e53f64d07d0db55..2fb82c252f963ed6fa86e0f04de5fe4c546e3ef1 100644 (file)
@@ -18,7 +18,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.20.2.2 2007/06/14 01:50:14 adunstan Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.20.2.3 2007/07/19 19:14:54 adunstan Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -79,11 +79,12 @@ bool                Log_truncate_on_rotation = false;
  */
 bool           am_syslogger = false;
 
+extern bool redirection_done;
+
 /*
  * Private state
  */
 static pg_time_t next_rotation_time;
-static bool redirection_done = false;
 static bool pipe_eof_seen = false;
 static FILE *syslogFile = NULL;
 static char *last_file_name = NULL;
@@ -573,14 +574,12 @@ syslogger_forkexec(void)
                snprintf(numbuf[bufc++], 32, "%d", fileno(syslogFile));
        else
                strcpy(numbuf[bufc++], "-1");
-       snprintf(numbuf[bufc++], 32, "%d", (int) redirection_done);
 #else                                                  /* WIN32 */
        if (syslogFile != NULL)
                snprintf(numbuf[bufc++], 32, "%ld",
                                 _get_osfhandle(_fileno(syslogFile)));
        else
                strcpy(numbuf[bufc++], "0");
-       snprintf(numbuf[bufc++], 32, "%d", (int) redirection_done);
 #endif   /* WIN32 */
 
        /* Add to the arg list */
@@ -614,7 +613,6 @@ syslogger_parseArgs(int argc, char *argv[])
                syslogFile = fdopen(fd, "a");
                setvbuf(syslogFile, NULL, LBF_MODE, 0);
        }
-       redirection_done = (bool) atoi(*argv++);
 #else                                                  /* WIN32 */
        fd = atoi(*argv++);
        if (fd != 0)
@@ -626,7 +624,6 @@ syslogger_parseArgs(int argc, char *argv[])
                        setvbuf(syslogFile, NULL, LBF_MODE, 0);
                }
        }
-       redirection_done = (bool) atoi(*argv++);
 #endif   /* WIN32 */
 }
 #endif   /* EXEC_BACKEND */
index c91531ee27c235a82bd8693cd90cab87f41f44ee..5e1a807fd40e902b5956587f751d0acfc1220a14 100644 (file)
@@ -42,7 +42,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.167.2.3 2007/06/14 01:50:14 adunstan Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.167.2.4 2007/07/19 19:14:54 adunstan Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -75,7 +75,7 @@ ErrorContextCallback *error_context_stack = NULL;
 
 sigjmp_buf *PG_exception_stack = NULL;
 
-extern pid_t SysLoggerPID;
+extern bool redirection_done;
 
 /* GUC parameters */
 PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
@@ -1706,11 +1706,15 @@ send_message_to_server_log(ErrorData *edata)
                 * that's really a pipe to the syslogger process. Unless we're in the
                 * postmaster, and the syslogger process isn't started yet.
                 */
-               if ((!Redirect_stderr || am_syslogger || (!IsUnderPostmaster && SysLoggerPID==0)) && pgwin32_is_service())
+               if (pgwin32_is_service() && (!redirection_done || am_syslogger) )
                        write_eventlog(edata->elevel, buf.data);
                else
 #endif
-                       if (Redirect_stderr)
+                       /* only use the chunking protocol if we know the syslogger should
+                        * be catching stderr output, and we are not ourselves the
+                        * syslogger. Otherwise, go directly to stderr.
+                        */
+                       if (redirection_done && !am_syslogger)
                                write_pipe_chunks(fileno(stderr), buf.data, buf.len);
                        else
                                write(fileno(stderr), buf.data, buf.len);