diff options
Diffstat (limited to 'src/backend/storage/lmgr/deadlock.c')
-rw-r--r-- | src/backend/storage/lmgr/deadlock.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/backend/storage/lmgr/deadlock.c b/src/backend/storage/lmgr/deadlock.c index 37cd73eaf13..757f1df2f4f 100644 --- a/src/backend/storage/lmgr/deadlock.c +++ b/src/backend/storage/lmgr/deadlock.c @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/deadlock.c,v 1.20 2003/03/31 20:32:29 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/deadlock.c,v 1.21 2003/07/24 22:04:13 tgl Exp $ * * Interface: * @@ -25,6 +25,7 @@ */ #include "postgres.h" +#include "lib/stringinfo.h" #include "miscadmin.h" #include "storage/proc.h" #include "utils/memutils.h" @@ -224,7 +225,7 @@ DeadLockCheck(PGPROC *proc) nWaitOrders = 0; if (!FindLockCycle(proc, possibleConstraints, &nSoftEdges)) - elog(FATAL, "DeadLockCheck: deadlock seems to have disappeared"); + elog(FATAL, "deadlock seems to have disappeared"); return true; /* cannot find a non-deadlocked state */ } @@ -309,7 +310,7 @@ DeadLockCheckRecurse(PGPROC *proc) { /* Regenerate the list of possible added constraints */ if (nEdges != TestConfiguration(proc)) - elog(FATAL, "DeadLockCheckRecurse: inconsistent results"); + elog(FATAL, "inconsistent results during deadlock check"); } curConstraints[nCurConstraints] = possibleConstraints[oldPossibleConstraints + i]; @@ -837,13 +838,15 @@ PrintLockQueue(LOCK *lock, const char *info) #endif /* - * Report details about a detected deadlock. + * Report a detected deadlock, with available details. */ void DeadLockReport(void) { + StringInfoData buf; int i; + initStringInfo(&buf); for (i = 0; i < nDeadlockDetails; i++) { DEADLOCK_INFO *info = &deadlockDetails[i]; @@ -855,26 +858,35 @@ DeadLockReport(void) else nextpid = deadlockDetails[0].pid; + if (i > 0) + appendStringInfoChar(&buf, '\n'); + if (info->locktag.relId == XactLockTableId && info->locktag.dbId == 0) { /* Lock is for transaction ID */ - elog(NOTICE, "Proc %d waits for %s on transaction %u; blocked by %d", - info->pid, - GetLockmodeName(info->lockmode), - info->locktag.objId.xid, - nextpid); + appendStringInfo(&buf, + gettext("Proc %d waits for %s on transaction %u; blocked by proc %d."), + info->pid, + GetLockmodeName(info->lockmode), + info->locktag.objId.xid, + nextpid); } else { /* Lock is for a relation */ - elog(NOTICE, "Proc %d waits for %s on relation %u database %u; blocked by %d", - info->pid, - GetLockmodeName(info->lockmode), - info->locktag.relId, - info->locktag.dbId, - nextpid); + appendStringInfo(&buf, + gettext("Proc %d waits for %s on relation %u of database %u; blocked by proc %d."), + info->pid, + GetLockmodeName(info->lockmode), + info->locktag.relId, + info->locktag.dbId, + nextpid); } } + ereport(ERROR, + (errcode(ERRCODE_T_R_DEADLOCK_DETECTED), + errmsg("deadlock detected"), + errdetail("%s", buf.data))); } /* |