Skip to content

Commit 74ffc77

Browse files
committed
Code review for log_line_prefix patch. Cooperate with StringInfo instead
of fighting it, avoid hard-wired (and wrong) assumption about max length of prefix, cause %l to actually work as documented, don't compute data we may not need.
1 parent 8726591 commit 74ffc77

File tree

3 files changed

+150
-140
lines changed

3 files changed

+150
-140
lines changed

src/backend/utils/error/elog.c

Lines changed: 135 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.128 2004/03/15 15:56:23 momjian Exp $
40+
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.129 2004/03/19 02:23:59 tgl Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -69,7 +69,7 @@ ErrorContextCallback *error_context_stack = NULL;
6969

7070
/* GUC parameters */
7171
PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
72-
char *Log_line_prefix = ""; /* format for extra log line info */
72+
char *Log_line_prefix = NULL; /* format for extra log line info */
7373

7474
#ifdef HAVE_SYSLOG
7575
/*
@@ -136,13 +136,14 @@ static int recursion_depth = 0; /* to detect actual recursion */
136136
} while (0)
137137

138138

139+
static void log_line_prefix(StringInfo buf);
139140
static void send_message_to_server_log(ErrorData *edata);
140141
static void send_message_to_frontend(ErrorData *edata);
141142
static char *expand_fmt_string(const char *fmt, ErrorData *edata);
142143
static const char *useful_strerror(int errnum);
143144
static const char *error_severity(int elevel);
144145
static void append_with_tabs(StringInfo buf, const char *str);
145-
static const char *log_line_prefix(void);
146+
146147

147148
/*
148149
* errstart --- begin an error-reporting cycle
@@ -1019,135 +1020,139 @@ write_syslog(int level, const char *line)
10191020
#endif /* HAVE_SYSLOG */
10201021

10211022
/*
1022-
* Format tag info for log lines
1023+
* Format tag info for log lines; append to the provided buffer.
10231024
*/
1024-
static const char *
1025-
log_line_prefix(void)
1025+
static void
1026+
log_line_prefix(StringInfo buf)
10261027
{
1028+
/* static counter for line numbers */
1029+
static long log_line_number = 0;
1030+
/* has counter been reset in current process? */
1031+
static int log_my_pid = 0;
1032+
1033+
int format_len;
1034+
int i;
1035+
1036+
/*
1037+
* This is one of the few places where we'd rather not inherit a
1038+
* static variable's value from the postmaster. But since we will,
1039+
* reset it when MyProcPid changes.
1040+
*/
1041+
if (log_my_pid != MyProcPid)
1042+
{
1043+
log_line_number = 0;
1044+
log_my_pid = MyProcPid;
1045+
}
1046+
log_line_number++;
10271047

1028-
/* static accumulator for line numbers */
1029-
static int log_line_number = 0;
1030-
1031-
/* space for option string + one of each option, plus some room to spare */
1032-
/* Note: if more identifiers are built in this will have to increase */
1033-
static char *result = NULL;
1034-
int format_len = strlen(Log_line_prefix);
1035-
int result_len = 2*NAMEDATALEN + format_len +120 ;
1048+
if (Log_line_prefix == NULL)
1049+
return; /* in case guc hasn't run yet */
10361050

1037-
if (result == NULL)
1038-
result = malloc(result_len);
1039-
result[0] = '\0';
1051+
format_len = strlen(Log_line_prefix);
10401052

1041-
if (format_len > 0)
1053+
for (i = 0; i < format_len; i++)
10421054
{
1043-
int i,j;
1044-
char * dbname = NULL;
1045-
char * username = NULL;
1046-
time_t stamp_time;
1047-
log_line_number++;
1048-
if (MyProcPort != NULL)
1055+
if (Log_line_prefix[i] != '%')
10491056
{
1050-
dbname = MyProcPort->database_name;
1051-
username = MyProcPort->user_name;
1052-
if (dbname == NULL || *dbname == '\0')
1053-
dbname = gettext("[unknown]");
1054-
if (username == NULL || *username == '\0')
1055-
username = gettext("[unknown]");
1057+
/* literal char, just copy */
1058+
appendStringInfoChar(buf, Log_line_prefix[i]);
1059+
continue;
1060+
}
1061+
/* go to char after '%' */
1062+
i++;
1063+
if (i >= format_len)
1064+
{
1065+
/* format error - ignore it */
1066+
break;
10561067
}
10571068

1058-
/*
1059-
* invariant through each iteration of this loop:
1060-
* . j is the index of the trailing null on result
1061-
* . result_len - j is the number of chars we have room for
1062-
* including the trailing null
1063-
* . there is room to write at least one more non-null char plus the
1064-
* trailing null
1065-
*/
1066-
for (i = 0, j=0; i < format_len && j < result_len-1; i++)
1069+
/* process the option */
1070+
switch (Log_line_prefix[i])
10671071
{
1068-
if(Log_line_prefix[i] != '%')
1069-
{
1070-
/* literal char, just copy */
1071-
result[j]=Log_line_prefix[i];
1072-
j++;
1073-
result[j] = '\0';
1074-
continue;
1075-
}
1076-
else if (i == format_len - 1)
1077-
{
1078-
/* format error - skip it */
1079-
continue;
1080-
}
1072+
case 'u':
1073+
if (MyProcPort)
1074+
{
1075+
const char *username = MyProcPort->user_name;
10811076

1082-
/* go to char after '%' */
1083-
i++;
1077+
if (username == NULL || *username == '\0')
1078+
username = gettext("[unknown]");
1079+
appendStringInfo(buf, "%s", username);
1080+
}
1081+
break;
1082+
case 'd':
1083+
if (MyProcPort)
1084+
{
1085+
const char *dbname = MyProcPort->database_name;
10841086

1085-
/* in postmaster and friends, skip non-applicable options,
1086-
* stop if %x is seen
1087-
*/
1088-
if (MyProcPort == NULL)
1089-
{
1090-
if (Log_line_prefix[i] == 'x')
1091-
break;
1092-
if (strchr("udcsir",Log_line_prefix[i]) != NULL)
1093-
continue;
1094-
}
1087+
if (dbname == NULL || *dbname == '\0')
1088+
dbname = gettext("[unknown]");
1089+
appendStringInfo(buf, "%s", dbname);
1090+
}
1091+
break;
1092+
case 'c':
1093+
if (MyProcPort)
1094+
{
1095+
appendStringInfo(buf, "%lx.%lx",
1096+
(long)(MyProcPort->session_start.tv_sec),
1097+
(long)MyProcPid);
1098+
}
1099+
break;
1100+
case 'p':
1101+
appendStringInfo(buf, "%ld", (long)MyProcPid);
1102+
break;
1103+
case 'l':
1104+
appendStringInfo(buf, "%ld", log_line_number);
1105+
break;
1106+
case 't':
1107+
{
1108+
time_t stamp_time = time(NULL);
1109+
char strfbuf[32];
10951110

1096-
/* process the option */
1097-
switch (Log_line_prefix[i])
1098-
{
1099-
case 'u':
1100-
j += snprintf(result+j,result_len-j,"%s",username);
1101-
break;
1102-
case 'd':
1103-
j += snprintf(result+j,result_len-j,"%s",dbname);
1104-
break;
1105-
case 'c':
1106-
j += snprintf(result+j,result_len-j,"%lx.%lx",
1107-
(long)(MyProcPort->session_start.tv_sec),
1108-
(long)MyProcPid);
1109-
break;
1110-
case 'p':
1111-
j += snprintf(result+j,result_len-j,"%ld",(long)MyProcPid);
1112-
break;
1113-
case 'l':
1114-
j += snprintf(result+j,result_len-j,"%d",log_line_number);
1115-
break;
1116-
case 't':
1117-
stamp_time = time(NULL);
1118-
j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
1111+
strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S",
11191112
localtime(&stamp_time));
1120-
break;
1121-
case 's':
1122-
j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
1123-
localtime(&(MyProcPort->session_start.tv_sec)));
1124-
break;
1125-
case 'i':
1126-
j += snprintf(result+j,result_len-j,"%s",
1127-
MyProcPort->commandTag);
1128-
break;
1129-
case 'r':
1130-
j += snprintf(result+j,result_len-j,"%s",
1131-
MyProcPort->remote_host);
1113+
appendStringInfoString(buf, strfbuf);
1114+
}
1115+
break;
1116+
case 's':
1117+
if (MyProcPort)
1118+
{
1119+
time_t stamp_time = MyProcPort->session_start.tv_sec;
1120+
char strfbuf[32];
1121+
1122+
strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S",
1123+
localtime(&stamp_time));
1124+
appendStringInfoString(buf, strfbuf);
1125+
}
1126+
break;
1127+
case 'i':
1128+
if (MyProcPort)
1129+
{
1130+
appendStringInfo(buf, "%s", MyProcPort->commandTag);
1131+
}
1132+
break;
1133+
case 'r':
1134+
if (MyProcPort)
1135+
{
1136+
appendStringInfo(buf, "%s", MyProcPort->remote_host);
11321137
if (strlen(MyProcPort->remote_port) > 0)
1133-
j += snprintf(result+j,result_len-j,"(%s)",
1134-
MyProcPort->remote_port);
1135-
break;
1136-
case 'x':
1137-
/* non-postmaster case - just ignore */
1138-
break;
1139-
case '%':
1140-
result[j] = '%';
1141-
j++;
1142-
result[j] = '\0';
1143-
break;
1144-
default:
1145-
/* format error - skip it */
1146-
break;
1147-
}
1138+
appendStringInfo(buf, "(%s)",
1139+
MyProcPort->remote_port);
1140+
}
1141+
break;
1142+
case 'x':
1143+
/* in postmaster and friends, stop if %x is seen */
1144+
/* in a backend, just ignore */
1145+
if (MyProcPort == NULL)
1146+
i = format_len;
1147+
break;
1148+
case '%':
1149+
appendStringInfoChar(buf, '%');
1150+
break;
1151+
default:
1152+
/* format error - ignore it */
1153+
break;
11481154
}
11491155
}
1150-
return result;
11511156
}
11521157

11531158

@@ -1161,8 +1166,8 @@ send_message_to_server_log(ErrorData *edata)
11611166

11621167
initStringInfo(&buf);
11631168

1164-
appendStringInfo(&buf, "%s%s: ",
1165-
log_line_prefix(), error_severity(edata->elevel));
1169+
log_line_prefix(&buf);
1170+
appendStringInfo(&buf, "%s: ", error_severity(edata->elevel));
11661171

11671172
if (Log_error_verbosity >= PGERROR_VERBOSE)
11681173
{
@@ -1195,21 +1200,21 @@ send_message_to_server_log(ErrorData *edata)
11951200
{
11961201
if (edata->detail)
11971202
{
1198-
appendStringInfoString(&buf, log_line_prefix() );
1203+
log_line_prefix(&buf);
11991204
appendStringInfoString(&buf, gettext("DETAIL: "));
12001205
append_with_tabs(&buf, edata->detail);
12011206
appendStringInfoChar(&buf, '\n');
12021207
}
12031208
if (edata->hint)
12041209
{
1205-
appendStringInfoString(&buf, log_line_prefix() );
1210+
log_line_prefix(&buf);
12061211
appendStringInfoString(&buf, gettext("HINT: "));
12071212
append_with_tabs(&buf, edata->hint);
12081213
appendStringInfoChar(&buf, '\n');
12091214
}
12101215
if (edata->context)
12111216
{
1212-
appendStringInfoString(&buf, log_line_prefix() );
1217+
log_line_prefix(&buf);
12131218
appendStringInfoString(&buf, gettext("CONTEXT: "));
12141219
append_with_tabs(&buf, edata->context);
12151220
appendStringInfoChar(&buf, '\n');
@@ -1218,14 +1223,18 @@ send_message_to_server_log(ErrorData *edata)
12181223
{
12191224
/* assume no newlines in funcname or filename... */
12201225
if (edata->funcname && edata->filename)
1221-
appendStringInfo(&buf, gettext("%sLOCATION: %s, %s:%d\n"),
1222-
log_line_prefix(),
1226+
{
1227+
log_line_prefix(&buf);
1228+
appendStringInfo(&buf, gettext("LOCATION: %s, %s:%d\n"),
12231229
edata->funcname, edata->filename,
12241230
edata->lineno);
1231+
}
12251232
else if (edata->filename)
1226-
appendStringInfo(&buf, gettext("%sLOCATION: %s:%d\n"),
1227-
log_line_prefix(),
1233+
{
1234+
log_line_prefix(&buf);
1235+
appendStringInfo(&buf, gettext("LOCATION: %s:%d\n"),
12281236
edata->filename, edata->lineno);
1237+
}
12291238
}
12301239
}
12311240

@@ -1234,7 +1243,7 @@ send_message_to_server_log(ErrorData *edata)
12341243
*/
12351244
if (edata->elevel >= log_min_error_statement && debug_query_string != NULL)
12361245
{
1237-
appendStringInfoString(&buf, log_line_prefix() );
1246+
log_line_prefix(&buf);
12381247
appendStringInfoString(&buf, gettext("STATEMENT: "));
12391248
append_with_tabs(&buf, debug_query_string);
12401249
appendStringInfoChar(&buf, '\n');
@@ -1284,11 +1293,7 @@ send_message_to_server_log(ErrorData *edata)
12841293
/* Write to stderr, if enabled */
12851294
if (Use_syslog <= 1 || whereToSendOutput == Debug)
12861295
{
1287-
/*
1288-
* Timestamp and PID are only used for stderr output --- we assume
1289-
* the syslog daemon will supply them for us in the other case.
1290-
*/
1291-
fprintf(stderr, "%s",buf.data);
1296+
fprintf(stderr, "%s", buf.data);
12921297
}
12931298

12941299
pfree(buf.data);

src/backend/utils/misc/ps_status.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* to contain some useful information. Mechanism differs wildly across
66
* platforms.
77
*
8-
* $PostgreSQL: pgsql/src/backend/utils/misc/ps_status.c,v 1.18 2004/03/09 04:43:07 momjian Exp $
8+
* $PostgreSQL: pgsql/src/backend/utils/misc/ps_status.c,v 1.19 2004/03/19 02:23:59 tgl Exp $
99
*
1010
* Copyright (c) 2000-2003, PostgreSQL Global Development Group
1111
* various details abducted from various places
@@ -277,15 +277,14 @@ init_ps_display(const char *username, const char *dbname,
277277
void
278278
set_ps_display(const char *activity)
279279
{
280-
/* no ps display for stand-alone backend */
281-
if (!IsUnderPostmaster)
282-
return;
283-
284-
/* save it for logging context */
280+
/* save tag for possible use by elog.c */
285281
if (MyProcPort)
286-
MyProcPort->commandTag = (char *) activity;
282+
MyProcPort->commandTag = activity;
287283

288284
#ifndef PS_USE_NONE
285+
/* no ps display for stand-alone backend */
286+
if (!IsUnderPostmaster)
287+
return;
289288

290289
#ifdef PS_USE_CLOBBER_ARGV
291290
/* If ps_buffer is a pointer, it might still be null */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy