From d5b3f5fe44e91d35aefdd570758d5b2a9e9c1a36 Mon Sep 17 00:00:00 2001 From: Sehrope Sarkuni Date: Wed, 10 Jul 2019 10:02:31 -0400 Subject: [PATCH 1/3] Adds separate dest field to log protocol PipeProtoHeader Adds a separate dest field to PipeProtoHeader to store the log destination requested by the sending process. Also changes the is_last field to only store whether the chunk is the last one for a message rather than also including whether the destination is csvlog. --- src/backend/postmaster/syslogger.c | 15 ++++++--------- src/backend/utils/error/elog.c | 4 +++- src/include/postmaster/syslogger.h | 4 ++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index cad43bdef2..edd8f33204 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -878,7 +878,6 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) { char *cursor = logbuffer; int count = *bytes_in_logbuffer; - int dest = LOG_DESTINATION_STDERR; /* While we have enough for a header, process data... */ while (count >= (int) (offsetof(PipeProtoHeader, data) + 1)) @@ -891,8 +890,9 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) if (p.nuls[0] == '\0' && p.nuls[1] == '\0' && p.len > 0 && p.len <= PIPE_MAX_PAYLOAD && p.pid != 0 && - (p.is_last == 't' || p.is_last == 'f' || - p.is_last == 'T' || p.is_last == 'F')) + (p.is_last == 't' || p.is_last == 'f') && + (p.dest == LOG_DESTINATION_CSVLOG || + p.dest == LOG_DESTINATION_STDERR)) { List *buffer_list; ListCell *cell; @@ -906,9 +906,6 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) if (count < chunklen) break; - dest = (p.is_last == 'T' || p.is_last == 'F') ? - LOG_DESTINATION_CSVLOG : LOG_DESTINATION_STDERR; - /* Locate any existing buffer for this source pid */ buffer_list = buffer_lists[p.pid % NBUFFER_LISTS]; foreach(cell, buffer_list) @@ -924,7 +921,7 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) free_slot = buf; } - if (p.is_last == 'f' || p.is_last == 'F') + if (p.is_last == 'f') { /* * Save a complete non-final chunk in a per-pid buffer @@ -970,7 +967,7 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) appendBinaryStringInfo(str, cursor + PIPE_HEADER_SIZE, p.len); - write_syslogger_file(str->data, str->len, dest); + write_syslogger_file(str->data, str->len, p.dest); /* Mark the buffer unused, and reclaim string storage */ existing_slot->pid = 0; pfree(str->data); @@ -979,7 +976,7 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) { /* The whole message was one chunk, evidently. */ write_syslogger_file(cursor + PIPE_HEADER_SIZE, p.len, - dest); + p.dest); } } diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index a3e1c59a82..cd13111708 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -3250,6 +3250,8 @@ write_pipe_chunks(char *data, int len, int dest) p.proto.nuls[0] = p.proto.nuls[1] = '\0'; p.proto.pid = MyProcPid; + p.proto.dest = (int32) dest; + p.proto.is_last = 'f'; /* write all but the last chunk */ while (len > PIPE_MAX_PAYLOAD) @@ -3264,7 +3266,7 @@ write_pipe_chunks(char *data, int len, int dest) } /* write the last chunk */ - p.proto.is_last = (dest == LOG_DESTINATION_CSVLOG ? 'T' : 't'); + p.proto.is_last = 't'; p.proto.len = len; memcpy(p.proto.data, data, len); rc = write(fd, &p, PIPE_HEADER_SIZE + len); diff --git a/src/include/postmaster/syslogger.h b/src/include/postmaster/syslogger.h index 1491eecb0f..41d026a474 100644 --- a/src/include/postmaster/syslogger.h +++ b/src/include/postmaster/syslogger.h @@ -46,8 +46,8 @@ typedef struct char nuls[2]; /* always \0\0 */ uint16 len; /* size of this chunk (counts data only) */ int32 pid; /* writer's pid */ - char is_last; /* last chunk of message? 't' or 'f' ('T' or - * 'F' for CSV case) */ + int32 dest; /* log destination */ + char is_last; /* last chunk of message? 't' or 'f'*/ char data[FLEXIBLE_ARRAY_MEMBER]; /* data payload starts here */ } PipeProtoHeader; -- 2.17.1