From 83a83ed23684e6bb69d1d366c1cb87d90fe33fa8 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 19 Jul 2007 19:14:25 +0000 Subject: [PATCH] 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. --- src/backend/postmaster/postmaster.c | 11 +++++++++-- src/backend/postmaster/syslogger.c | 7 ++----- src/backend/utils/error/elog.c | 10 +++++++--- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 4b175dfc68..99a4885364 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -202,8 +202,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 @@ -217,6 +217,8 @@ static bool FatalError = false; /* T if recovering from backend crash */ bool ClientAuthInProgress = false; /* T during new-client * authentication */ +bool redirection_done = false; + static bool force_autovac = false; /* received START_AUTOVAC signal */ /* @@ -328,6 +330,7 @@ typedef struct InheritableSocket pgStatSock; pid_t PostmasterPid; TimestampTz PgStartTime; + bool redirection_done; #ifdef WIN32 HANDLE PostmasterHandle; HANDLE initial_signal_pipe; @@ -3822,6 +3825,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(¶m->initial_signal_pipe, @@ -4025,6 +4030,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; diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index c38cb951e5..4d8b786ebf 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -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; @@ -583,14 +584,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 */ @@ -624,7 +623,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) @@ -636,7 +634,6 @@ syslogger_parseArgs(int argc, char *argv[]) setvbuf(syslogFile, NULL, LBF_MODE, 0); } } - redirection_done = (bool) atoi(*argv++); #endif /* WIN32 */ } #endif /* EXEC_BACKEND */ diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 761eba477c..951933215c 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -76,7 +76,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; @@ -1720,11 +1720,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); -- 2.39.5