8000 Reduce memory requirements for writing CSVlogs, so it will work with … · postgrespro/postgres_cluster@44b5efb · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit 44b5efb

Browse files
committed
Reduce memory requirements for writing CSVlogs, so it will work with about
the same amount of memory in ErrorContext as standard logs.
1 parent 1535f26 commit 44b5efb

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

src/backend/utils/error/elog.c

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
*
4343
*
4444
* IDENTIFICATION
45-
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.194 2007/08/19 01:41:25 adunstan Exp $
45+
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.195 2007/08/23 01:24:43 adunstan Exp $
4646
*
4747
*-------------------------------------------------------------------------
4848
*/
@@ -133,7 +133,8 @@ static const char *error_severity(int elevel);
133133
static void append_with_tabs(StringInfo buf, const char *str);
134134
static bool is_log_level_output(int elevel, int log_min_level);
135135
static void write_pipe_chunks(char *data, int len, int dest);
136-
static void get_error_message(StringInfo buf, ErrorData *edata);
136+
static void get_csv_error_message(StringInfo buf, ErrorData *edata);
137+
static void write_csvlog(ErrorData *edata);
137138

138139
/*
139140
* errstart --- begin an error-reporting cycle
@@ -1809,9 +1810,7 @@ write_csvlog(ErrorData *edata)
18091810
appendStringInfoChar(&buf, ',');
18101811

18111812
/* Error message and cursor position if any */
1812-
get_error_message(&msgbuf, edata);
1813-
1814-
appendCSVLiteral(&buf, msgbuf.data);
1813+
get_csv_error_message(&buf, edata);
18151814

18161815
appendStringInfoChar(&buf, '\n');
18171816

@@ -1826,22 +1825,32 @@ write_csvlog(ErrorData *edata)
18261825
}
18271826

18281827
/*
1829-
* Appends the buffer with the error message and the cursor position.
1828+
* Appends the buffer with the error message and the cursor position, all
1829+
* CSV escaped.
18301830
*/
18311831
static void
1832-
get_error_message(StringInfo buf, ErrorData *edata)
1832+
get_csv_error_message(StringInfo buf, ErrorData *edata)
18331833
{
1834-
if (edata->message)
1835-
appendStringInfo(buf, "%s", edata->message);
1836-
else
1837-
appendStringInfo(buf, "%s", _("missing error text"));
1834+
char *msg = edata->message ? edata-> message : _("missing error text");
1835+
char c;
1836+
1837+
appendStringInfoCharMacro(buf, '"');
1838+
1839+
while ( (c = *msg++) != '\0' )
1840+
{
1841+
if (c == '"')
1842+
appendStringInfoCharMacro(buf, '"');
1843+
appendStringInfoCharMacro(buf, c);
1844+
}
18381845

18391846
if (edata->cursorpos > 0)
18401847
appendStringInfo(buf, _(" at character %d"),
18411848
edata->cursorpos);
18421849
else if (edata->internalpos > 0)
18431850
appendStringInfo(buf, _(" at character %d"),
18441851
edata->internalpos);
1852+
1853+
appendStringInfoCharMacro(buf, '"');
18451854
}
18461855

18471856
/*
@@ -2032,13 +2041,19 @@ send_message_to_server_log(ErrorData *edata)
20322041
write(fileno(stderr), buf.data, buf.len);
20332042
}
20342043

2044+
/* If in the syslogger process, try to write messages direct to file */
2045+
if (am_syslogger)
2046+
write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_STDERR);
2047+
2048+
/* Write to CSV log if enabled */
20352049
if (Log_destination & LOG_DESTINATION_CSVLOG)
20362050
{
20372051
if (redirection_done || am_syslogger)
20382052
{
20392053
/* send CSV data if it's safe to do so (syslogger doesn't need
2040-
* the pipe)
2054+
* the pipe). First get back the space in the message buffer.
20412055
*/
2056+
pfree(buf.data);
20422057
write_csvlog(edata);
20432058
}
20442059
else
@@ -2051,14 +2066,13 @@ send_message_to_server_log(ErrorData *edata)
20512066
/* write message to stderr unless we just sent it above */
20522067
write(fileno(stderr), buf.data, buf.len);
20532068
}
2069+
pfree(buf.data);
20542070
}
20552071
}
2056-
2057-
/* If in the syslogger process, try to write messages direct to file */
2058-
if (am_syslogger)
2059-
write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_STDERR);
2060-
2061-
pfree(buf.data);
2072+
else
2073+
{
2074+
pfree(buf.data);
2075+
}
20622076
}
20632077

20642078
/*

0 commit comments

Comments
 (0)
0