Only use the pipe chunking protocol if we know the syslogger should

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.
This commit is contained in:
Andrew Dunstan 2007-07-19 19:15:25 +00:00
parent a41c4b218f
commit 19c9660ca8
3 changed files with 15 additions and 10 deletions

View file

@ -37,7 +37,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.443.4.8 2006/07/16 18:17:35 tgl Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.443.4.9 2007/07/19 19:15:25 adunstan Exp $
* *
* NOTES * NOTES
* *
@ -221,6 +221,7 @@ static bool FatalError = false; /* T if recovering from backend crash */
bool ClientAuthInProgress = false; /* T during new-client bool ClientAuthInProgress = false; /* T during new-client
* authentication */ * authentication */
bool redirection_done = false;
/* /*
* State for assigning random salts and cancel keys. * State for assigning random salts and cancel keys.
@ -330,6 +331,7 @@ typedef struct
InheritableSocket pgStatPipe0; InheritableSocket pgStatPipe0;
InheritableSocket pgStatPipe1; InheritableSocket pgStatPipe1;
pid_t PostmasterPid; pid_t PostmasterPid;
bool redirection_done;
#ifdef WIN32 #ifdef WIN32
HANDLE PostmasterHandle; HANDLE PostmasterHandle;
HANDLE initial_signal_pipe; HANDLE initial_signal_pipe;
@ -3718,6 +3720,8 @@ save_backend_variables(BackendParameters *param, Port *port,
param->PostmasterPid = PostmasterPid; param->PostmasterPid = PostmasterPid;
param->redirection_done = redirection_done;
#ifdef WIN32 #ifdef WIN32
param->PostmasterHandle = PostmasterHandle; param->PostmasterHandle = PostmasterHandle;
write_duplicated_handle(&param->initial_signal_pipe, write_duplicated_handle(&param->initial_signal_pipe,
@ -3920,6 +3924,8 @@ restore_backend_variables(BackendParameters *param, Port *port)
PostmasterPid = param->PostmasterPid; PostmasterPid = param->PostmasterPid;
redirection_done = param->redirection_done;
#ifdef WIN32 #ifdef WIN32
PostmasterHandle = param->PostmasterHandle; PostmasterHandle = param->PostmasterHandle;
pgwin32_initial_signal_pipe = param->initial_signal_pipe; pgwin32_initial_signal_pipe = param->initial_signal_pipe;

View file

@ -18,7 +18,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.12.4.2 2007/06/14 01:50:34 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.12.4.3 2007/07/19 19:15:25 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -78,11 +78,12 @@ bool Log_truncate_on_rotation = false;
*/ */
bool am_syslogger = false; bool am_syslogger = false;
extern bool redirection_done;
/* /*
* Private state * Private state
*/ */
static pg_time_t next_rotation_time; static pg_time_t next_rotation_time;
static bool redirection_done = false;
static bool pipe_eof_seen = false; static bool pipe_eof_seen = false;
static FILE *syslogFile = NULL; static FILE *syslogFile = NULL;
static char *last_file_name = NULL; static char *last_file_name = NULL;
@ -600,14 +601,12 @@ syslogger_forkexec(void)
snprintf(numbuf[bufc++], 32, "%d", fileno(syslogFile)); snprintf(numbuf[bufc++], 32, "%d", fileno(syslogFile));
else else
strcpy(numbuf[bufc++], "-1"); strcpy(numbuf[bufc++], "-1");
snprintf(numbuf[bufc++], 32, "%d", (int) redirection_done);
#else /* WIN32 */ #else /* WIN32 */
if (syslogFile != NULL) if (syslogFile != NULL)
snprintf(numbuf[bufc++], 32, "%ld", snprintf(numbuf[bufc++], 32, "%ld",
_get_osfhandle(_fileno(syslogFile))); _get_osfhandle(_fileno(syslogFile)));
else else
strcpy(numbuf[bufc++], "0"); strcpy(numbuf[bufc++], "0");
snprintf(numbuf[bufc++], 32, "%d", (int) redirection_done);
#endif /* WIN32 */ #endif /* WIN32 */
/* Add to the arg list */ /* Add to the arg list */
@ -641,7 +640,6 @@ syslogger_parseArgs(int argc, char *argv[])
syslogFile = fdopen(fd, "a"); syslogFile = fdopen(fd, "a");
setvbuf(syslogFile, NULL, LBF_MODE, 0); setvbuf(syslogFile, NULL, LBF_MODE, 0);
} }
redirection_done = (bool) atoi(*argv++);
#else /* WIN32 */ #else /* WIN32 */
fd = atoi(*argv++); fd = atoi(*argv++);
if (fd != 0) if (fd != 0)
@ -653,7 +651,6 @@ syslogger_parseArgs(int argc, char *argv[])
setvbuf(syslogFile, NULL, LBF_MODE, 0); setvbuf(syslogFile, NULL, LBF_MODE, 0);
} }
} }
redirection_done = (bool) atoi(*argv++);
#endif /* WIN32 */ #endif /* WIN32 */
} }
#endif /* EXEC_BACKEND */ #endif /* EXEC_BACKEND */

View file

@ -42,7 +42,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.155.4.5 2007/06/14 01:50:34 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.155.4.6 2007/07/19 19:15:25 adunstan Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -75,6 +75,8 @@ ErrorContextCallback *error_context_stack = NULL;
sigjmp_buf *PG_exception_stack = NULL; sigjmp_buf *PG_exception_stack = NULL;
extern bool redirection_done;
/* GUC parameters */ /* GUC parameters */
PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE; PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
char *Log_line_prefix = NULL; /* format for extra log line info */ char *Log_line_prefix = NULL; /* format for extra log line info */
@ -1670,11 +1672,11 @@ send_message_to_server_log(ErrorData *edata)
* If stderr redirection is active, it's ok to write to stderr * If stderr redirection is active, it's ok to write to stderr
* because that's really a pipe to the syslogger process. * because that's really a pipe to the syslogger process.
*/ */
if ((!Redirect_stderr || am_syslogger) && pgwin32_is_service()) if (pgwin32_is_service() && (!redirection_done || am_syslogger) )
write_eventlog(edata->elevel, buf.data); write_eventlog(edata->elevel, buf.data);
else else
#endif #endif
if (Redirect_stderr) if (redirection_done && !am_syslogger)
write_pipe_chunks(fileno(stderr), buf.data, buf.len); write_pipe_chunks(fileno(stderr), buf.data, buf.len);
else else
write(fileno(stderr), buf.data, buf.len); write(fileno(stderr), buf.data, buf.len);