Deadlock detection changes, PG Commit: d137cb52cb7fd44a3f24f3c750fbf7924a4e9532

pg16_kickoff
onderkalaci 2023-04-26 22:52:36 +03:00
parent 9085beb819
commit a0cf8361a4
1 changed files with 24 additions and 17 deletions

View File

@ -737,12 +737,13 @@ AddEdgesForLockWaits(WaitGraph *waitGraph, PGPROC *waitingProc, PROCStack *remai
int conflictMask = lockMethodTable->conflictTab[waitingProc->waitLockMode]; int conflictMask = lockMethodTable->conflictTab[waitingProc->waitLockMode];
/* iterate through the queue of processes holding the lock */ /* iterate through the queue of processes holding the lock */
SHM_QUEUE *procLocks = &waitLock->procLocks; dlist_head *procLocks = &waitLock->procLocks;
PROCLOCK *procLock = (PROCLOCK *) SHMQueueNext(procLocks, procLocks,
offsetof(PROCLOCK, lockLink));
while (procLock != NULL) dlist_iter iter;
dlist_foreach(iter, procLocks)
{ {
PROCLOCK *procLock = dlist_container(PROCLOCK, lockLink, iter.cur);
PGPROC *currentProc = procLock->tag.myProc; PGPROC *currentProc = procLock->tag.myProc;
/* /*
@ -755,9 +756,6 @@ AddEdgesForLockWaits(WaitGraph *waitGraph, PGPROC *waitingProc, PROCStack *remai
{ {
AddWaitEdge(waitGraph, waitingProc, currentProc, remaining); AddWaitEdge(waitGraph, waitingProc, currentProc, remaining);
} }
procLock = (PROCLOCK *) SHMQueueNext(procLocks, &procLock->lockLink,
offsetof(PROCLOCK, lockLink));
} }
} }
@ -777,16 +775,25 @@ AddEdgesForWaitQueue(WaitGraph *waitGraph, PGPROC *waitingProc, PROCStack *remai
int conflictMask = lockMethodTable->conflictTab[waitingProc->waitLockMode]; int conflictMask = lockMethodTable->conflictTab[waitingProc->waitLockMode];
/* iterate through the wait queue */ /* iterate through the wait queue */
PROC_QUEUE *waitQueue = &(waitLock->waitProcs); dclist_head *waitQueue = &waitLock->waitProcs;
int queueSize = waitQueue->size; int queueSize = waitQueue->count;
PGPROC *currentProc = (PGPROC *) waitQueue->links.next;
dlist_iter iter;
dclist_foreach(iter, waitQueue)
{
PGPROC *currentProc = dlist_container(PGPROC, links, iter.cur);
if (currentProc == waitingProc)
{
/* /*
* Iterate through the queue from the start until we encounter waitingProc, * Iterate through the queue from the start until we encounter waitingProc,
* since we only care about processes in front of waitingProc in the queue. * since we only care about processes in front of waitingProc in the queue.
*/ */
while (queueSize-- > 0 && currentProc != waitingProc) break;
{ }
int awaitMask = LOCKBIT_ON(currentProc->waitLockMode); int awaitMask = LOCKBIT_ON(currentProc->waitLockMode);
/* /*