summaryrefslogtreecommitdiff
path: root/src/backend/storage/lmgr/deadlock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/lmgr/deadlock.c')
-rw-r--r--src/backend/storage/lmgr/deadlock.c42
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)));
}
/*