83 EDGE *softEdges,
int *nSoftEdges);
85 EDGE *softEdges,
int *nSoftEdges);
88 int depth,
EDGE *softEdges,
int *nSoftEdges);
94static void PrintLockQueue(
LOCK *lock,
const char *info);
196 "MAX_BACKENDS_BITS too big for * 4");
239 TRACE_POSTGRESQL_DEADLOCK_FOUND();
243 elog(
FATAL,
"deadlock seems to have disappeared");
259 PrintLockQueue(lock,
"DeadLockCheck:");
264 for (
int j = 0;
j < nProcs;
j++)
268 PrintLockQueue(lock,
"rearranged to:");
315 int oldPossibleConstraints;
342 for (
i = 0;
i < nEdges;
i++)
344 if (!savedList &&
i > 0)
348 elog(
FATAL,
"inconsistent results during deadlock check");
409 softFound = nSoftEdges;
415 softFound = nSoftEdges;
422 softFound = nSoftEdges;
526 memberProc != checkProc &&
576 if (leader != checkProcLeader)
578 for (lm = 1; lm <= numLockModes; lm++)
585 softEdges, nSoftEdges))
592 info->
pid = checkProc->
pid;
619 if (checkProc ==
MyProc &&
651 for (
i = 0;
i < queue_size;
i++)
666 if (leader == checkProcLeader)
674 softEdges, nSoftEdges))
681 info->
pid = checkProc->
pid;
687 softEdges[*nSoftEdges].
waiter = checkProcLeader;
688 softEdges[*nSoftEdges].
blocker = leader;
689 softEdges[*nSoftEdges].
lock = lock;
698 PGPROC *lastGroupMember = NULL;
713 lastGroupMember = checkProc;
721 lastGroupMember = proc;
723 Assert(lastGroupMember != NULL);
739 if (proc == lastGroupMember)
744 leader != checkProcLeader)
748 softEdges, nSoftEdges))
755 info->
pid = checkProc->
pid;
761 softEdges[*nSoftEdges].
waiter = checkProcLeader;
762 softEdges[*nSoftEdges].
blocker = leader;
763 softEdges[*nSoftEdges].
lock = lock;
793 int nWaitOrderProcs = 0;
804 for (
i = nConstraints; --
i >= 0;)
909 for (
i = 0;
i < nConstraints;
i++)
928 for (
j = queue_size; --
j >= 0;)
957 for (k = queue_size; --k >= 0;)
981 constraints[
i].
pred = jj;
997 last = queue_size - 1;
998 for (
i = queue_size - 1;
i >= 0;)
1006 for (
j = last;
j >= 0;
j--)
1029 for (
c = 0;
c <= last; ++
c)
1051#ifdef DEBUG_DEADLOCK
1053PrintLockQueue(
LOCK *lock,
const char *info)
1058 printf(
"%s lock %p queue ", info, lock);
1094 nextpid = info[1].
pid;
1107 _(
"Process %d waits for %s on %s; blocked by process %d."),
1126 _(
"Process %d: %s"),
1135 errmsg(
"deadlock detected"),
1138 errhint(
"See server log for query details.")));
const char * pgstat_get_backend_current_activity(int pid, bool checkUser)
#define MemSet(start, val, len)
#define StaticAssertStmt(condition, errmessage)
static bool TopoSort(LOCK *lock, EDGE *constraints, int nConstraints, PGPROC **ordering)
static int TestConfiguration(PGPROC *startProc)
static WAIT_ORDER * waitOrders
static bool FindLockCycleRecurseMember(PGPROC *checkProc, PGPROC *checkProcLeader, int depth, EDGE *softEdges, int *nSoftEdges)
static bool FindLockCycle(PGPROC *checkProc, EDGE *softEdges, int *nSoftEdges)
static int maxPossibleConstraints
static bool DeadLockCheckRecurse(PGPROC *proc)
PGPROC * GetBlockingAutoVacuumPgproc(void)
static EDGE * possibleConstraints
static PGPROC ** waitOrderProcs
void RememberSimpleDeadLock(PGPROC *proc1, LOCKMODE lockmode, LOCK *lock, PGPROC *proc2)
static PGPROC ** visitedProcs
static bool ExpandConstraints(EDGE *constraints, int nConstraints)
static int * beforeConstraints
static int nDeadlockDetails
void DeadLockReport(void)
static int * afterConstraints
static DEADLOCK_INFO * deadlockDetails
static int maxCurConstraints
void InitDeadLockChecking(void)
static int nCurConstraints
DeadLockState DeadLockCheck(PGPROC *proc)
static PGPROC * blocking_autovacuum_proc
static EDGE * curConstraints
static int nPossibleConstraints
static bool FindLockCycleRecurse(PGPROC *checkProc, int depth, EDGE *softEdges, int *nSoftEdges)
static PGPROC ** topoProcs
int errdetail_internal(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
int errdetail_log(const char *fmt,...)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
#define dlist_foreach(iter, lhead)
static void dclist_push_tail(dclist_head *head, dlist_node *node)
static uint32 dclist_count(const dclist_head *head)
static void dclist_init(dclist_head *head)
#define dlist_container(type, membername, ptr)
#define dclist_foreach(iter, lhead)
void DescribeLockTag(StringInfo buf, const LOCKTAG *tag)
const char * GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
LockMethod GetLocksMethodTable(const LOCK *lock)
#define LOCK_LOCKTAG(lock)
@ LOCKTAG_RELATION_EXTEND
@ DS_BLOCKED_BY_AUTOVACUUM
#define LOCKBIT_ON(lockmode)
MemoryContext TopMemoryContext
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define ERRCODE_T_R_DEADLOCK_DETECTED
void pgstat_report_deadlock(void)
#define PROC_IS_AUTOVACUUM
#define MAX_BACKENDS_BITS
void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
void resetStringInfo(StringInfo str)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
uint8 locktag_lockmethodid
const LOCKMASK * conflictTab
dlist_head lockGroupMembers
static struct link * links