Hi,
On 2014-05-16 19:54:56 +0200, Andres Freund wrote:
> Hi,
>
> elog.c's log_line_prefix() processes %d with:
> case 'd':
> if (MyProcPort)
> {
> const char *dbname = MyProcPort->database_name;
>
> if (dbname == NULL || *dbname == '\0')
> dbname = _("[unknown]");
> if (padding != 0)
> appendStringInfo(buf, "%*s", padding, dbname);
> else
> appendStringInfoString(buf, dbname);
> }
> else if (padding != 0)
> appendStringInfoSpaces(buf,
> padding > 0 ? padding : -padding);
> write_csvlog() uses similar logic.
>
> Unfortunately MyProcPort only exists in user initiated backends.
>
> It's imo pretty annoying that neither bgworkers nor autovacuum workers
> show the proper database in the log. Why don't we just populate a global
> variable in InitPostgres() once we're sure which database the backend is
> connected to? We could fill fake MyProcPorts, but that doesn't seem like
> a good idea to me.
The attached simple patch implements the former idea.
We could probably replace a couple of get_database_name(MyDatabaseId)
calls by it, but that doesn't look that important.
Greetings,
Andres Freund
--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
>From e0b5bae6323f22494ba8aad79a50a8fd69a0d21c Mon Sep 17 00:00:00 2001
From: Andres Freund <[email protected]>
Date: Fri, 16 May 2014 22:34:47 +0200
Subject: [PATCH] Support showing the database in log messages originating in a
background process.
---
src/backend/utils/error/elog.c | 11 +++++++++--
src/backend/utils/init/globals.c | 1 +
src/backend/utils/init/postinit.c | 3 +++
src/include/miscadmin.h | 1 +
4 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 0d92dcd..db6cc43 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -2320,9 +2320,14 @@ log_line_prefix(StringInfo buf, ErrorData *edata)
padding > 0 ? padding : -padding);
break;
case 'd':
- if (MyProcPort)
+ if (MyProcPort || MyDatabaseName)
{
- const char *dbname = MyProcPort->database_name;
+ const char *dbname;
+
+ if (MyProcPort)
+ dbname = MyProcPort->database_name;
+ else
+ dbname = MyDatabaseName;
if (dbname == NULL || *dbname == '\0')
dbname = _("[unknown]");
@@ -2577,6 +2582,8 @@ write_csvlog(ErrorData *edata)
/* database name */
if (MyProcPort)
appendCSVLiteral(&buf, MyProcPort->database_name);
+ else if (MyDatabaseName)
+ appendCSVLiteral(&buf, MyDatabaseName);
appendStringInfoChar(&buf, ',');
/* Process id */
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
index be74835..46d4cf4 100644
--- a/src/backend/utils/init/globals.c
+++ b/src/backend/utils/init/globals.c
@@ -62,6 +62,7 @@ char postgres_exec_path[MAXPGPATH]; /* full path to backend */
BackendId MyBackendId = InvalidBackendId;
Oid MyDatabaseId = InvalidOid;
+char *MyDatabaseName = NULL;
Oid MyDatabaseTableSpace = InvalidOid;
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index ed936d7..0f5aaa8 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -51,6 +51,7 @@
#include "utils/acl.h"
#include "utils/fmgroids.h"
#include "utils/guc.h"
+#include "utils/memutils.h"
#include "utils/pg_locale.h"
#include "utils/portal.h"
#include "utils/ps_status.h"
@@ -795,6 +796,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
MyDatabaseTableSpace = dbform->dattablespace;
/* take database name from the caller, just for paranoia */
strlcpy(dbname, in_dbname, sizeof(dbname));
+ MyDatabaseName = MemoryContextStrdup(TopMemoryContext, in_dbname);
}
else
{
@@ -815,6 +817,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
/* pass the database name back to the caller */
if (out_dbname)
strcpy(out_dbname, dbname);
+ MyDatabaseName = MemoryContextStrdup(TopMemoryContext, dbname);
}
/* Now we can mark our PGPROC entry with the database ID */
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index c2b786e..91710d3 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -165,6 +165,7 @@ extern char postgres_exec_path[];
* extern BackendId MyBackendId;
*/
extern PGDLLIMPORT Oid MyDatabaseId;
+extern PGDLLIMPORT char *MyDatabaseName;
extern PGDLLIMPORT Oid MyDatabaseTableSpace;
--
2.0.0.rc2.4.g1dc51c6.dirty
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers