*
* Copyright (c) 2001-2008, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.170 2008/03/21 21:08:31 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.171 2008/03/24 18:22:36 tgl Exp $
* ----------
*/
#include "postgres.h"
* ----------
*/
const char *
-pgstat_get_backend_current_activity(int pid)
+pgstat_get_backend_current_activity(int pid, bool checkUser)
{
PgBackendStatus *beentry;
int i;
if (found)
{
/* Now it is safe to use the non-volatile pointer */
- if (!superuser() && beentry->st_userid != GetUserId())
+ if (checkUser && !superuser() && beentry->st_userid != GetUserId())
return "<insufficient privilege>";
else if (*(beentry->st_activity) == '\0')
return "<command string not enabled>";
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/lmgr/deadlock.c,v 1.52 2008/03/21 21:08:31 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/lmgr/deadlock.c,v 1.53 2008/03/24 18:22:36 tgl Exp $
*
* Interface:
*
void
DeadLockReport(void)
{
- StringInfoData detailbuf;
- StringInfoData contextbuf;
+ StringInfoData clientbuf; /* errdetail for client */
+ StringInfoData logbuf; /* errdetail for server log */
StringInfoData locktagbuf;
int i;
- initStringInfo(&detailbuf);
- initStringInfo(&contextbuf);
+ initStringInfo(&clientbuf);
+ initStringInfo(&logbuf);
initStringInfo(&locktagbuf);
+ /* Generate the "waits for" lines sent to the client */
for (i = 0; i < nDeadlockDetails; i++)
{
DEADLOCK_INFO *info = &deadlockDetails[i];
DescribeLockTag(&locktagbuf, &info->locktag);
if (i > 0)
- appendStringInfoChar(&detailbuf, '\n');
+ appendStringInfoChar(&clientbuf, '\n');
- appendStringInfo(&detailbuf,
+ appendStringInfo(&clientbuf,
_("Process %d waits for %s on %s; blocked by process %d."),
info->pid,
GetLockmodeName(info->locktag.locktag_lockmethodid,
info->lockmode),
locktagbuf.data,
nextpid);
+ }
- if (i > 0)
- appendStringInfoChar(&contextbuf, '\n');
+ /* Duplicate all the above for the server ... */
+ appendStringInfoString(&logbuf, clientbuf.data);
+
+ /* ... and add info about query strings */
+ for (i = 0; i < nDeadlockDetails; i++)
+ {
+ DEADLOCK_INFO *info = &deadlockDetails[i];
+
+ appendStringInfoChar(&logbuf, '\n');
- appendStringInfo(&contextbuf,
+ appendStringInfo(&logbuf,
_("Process %d: %s"),
info->pid,
- pgstat_get_backend_current_activity(info->pid));
+ pgstat_get_backend_current_activity(info->pid, false));
}
ereport(ERROR,
(errcode(ERRCODE_T_R_DEADLOCK_DETECTED),
errmsg("deadlock detected"),
- errdetail("%s", detailbuf.data),
- errcontext("%s", contextbuf.data)));
+ errdetail("%s", clientbuf.data),
+ errdetail_log("%s", logbuf.data),
+ errhint("See server log for query details.")));
}
/*
*
* Copyright (c) 2001-2008, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/include/pgstat.h,v 1.72 2008/03/21 21:08:31 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/pgstat.h,v 1.73 2008/03/24 18:22:36 tgl Exp $
* ----------
*/
#ifndef PGSTAT_H
extern void pgstat_report_activity(const char *what);
extern void pgstat_report_xact_timestamp(TimestampTz tstamp);
extern void pgstat_report_waiting(bool waiting);
-extern const char *pgstat_get_backend_current_activity(int pid);
+extern const char *pgstat_get_backend_current_activity(int pid, bool checkUser);
extern void pgstat_initstats(Relation rel);