]> granicus.if.org Git - postgresql/commitdiff
Adjust the recent patch for reporting of deadlocked queries so that we report
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 24 Mar 2008 18:22:36 +0000 (18:22 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 24 Mar 2008 18:22:36 +0000 (18:22 +0000)
query texts only to the server log.  This eliminates the issue of possible
leaking of security-sensitive data in other sessions' queries.  Since the
log is presumed secure, we can now log the queries of all sessions involved
in the deadlock, whether or not they belong to the same user as the one
reporting the failure.

src/backend/postmaster/pgstat.c
src/backend/storage/lmgr/deadlock.c
src/include/pgstat.h

index 8259b759e71b57214c0bd8b9e82f3e9cdb4b5828..642943c82106a7004822b282a22d33da032dcceb 100644 (file)
@@ -13,7 +13,7 @@
  *
  *     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"
@@ -2056,7 +2056,7 @@ pgstat_read_current_status(void)
  * ----------
  */
 const char *
-pgstat_get_backend_current_activity(int pid)
+pgstat_get_backend_current_activity(int pid, bool checkUser)
 {
        PgBackendStatus *beentry;
        int                     i;
@@ -2094,7 +2094,7 @@ pgstat_get_backend_current_activity(int pid)
                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>";
index e1a66456f5429ea572167b21f661933e5e957969..97be7d9dc72119381f333a43fa3f369683b870b7 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * 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:
  *
@@ -879,15 +879,16 @@ PrintLockQueue(LOCK *lock, const char *info)
 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];
@@ -905,30 +906,39 @@ DeadLockReport(void)
                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.")));
 }
 
 /*
index 49fd149d55cbad82a130e031a19c4354443d07d9..fdc846acad4b52fc117471218e5aee522feaf48e 100644 (file)
@@ -5,7 +5,7 @@
  *
  *     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
@@ -507,7 +507,7 @@ extern void pgstat_bestart(void);
 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);