From a0cf8361a4a2d3568c4b189273df3f6e69ee6f0f Mon Sep 17 00:00:00 2001 From: onderkalaci Date: Wed, 26 Apr 2023 22:52:36 +0300 Subject: [PATCH] Deadlock detection changes, PG Commit: d137cb52cb7fd44a3f24f3c750fbf7924a4e9532 --- .../distributed/transaction/lock_graph.c | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/backend/distributed/transaction/lock_graph.c b/src/backend/distributed/transaction/lock_graph.c index 8c09160b0..ed21c6727 100644 --- a/src/backend/distributed/transaction/lock_graph.c +++ b/src/backend/distributed/transaction/lock_graph.c @@ -737,13 +737,14 @@ AddEdgesForLockWaits(WaitGraph *waitGraph, PGPROC *waitingProc, PROCStack *remai int conflictMask = lockMethodTable->conflictTab[waitingProc->waitLockMode]; /* iterate through the queue of processes holding the lock */ - SHM_QUEUE *procLocks = &waitLock->procLocks; - PROCLOCK *procLock = (PROCLOCK *) SHMQueueNext(procLocks, procLocks, - offsetof(PROCLOCK, lockLink)); + dlist_head *procLocks = &waitLock->procLocks; - while (procLock != NULL) + dlist_iter iter; + + dlist_foreach(iter, procLocks) { - PGPROC *currentProc = procLock->tag.myProc; + PROCLOCK *procLock = dlist_container(PROCLOCK, lockLink, iter.cur); + PGPROC *currentProc = procLock->tag.myProc; /* * Skip processes from the same lock group, processes that don't conflict, @@ -754,10 +755,7 @@ AddEdgesForLockWaits(WaitGraph *waitGraph, PGPROC *waitingProc, PROCStack *remai !IsProcessWaitingForSafeOperations(currentProc)) { 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]; /* iterate through the wait queue */ - PROC_QUEUE *waitQueue = &(waitLock->waitProcs); - int queueSize = waitQueue->size; - PGPROC *currentProc = (PGPROC *) waitQueue->links.next; + dclist_head *waitQueue = &waitLock->waitProcs; + int queueSize = waitQueue->count; - /* - * Iterate through the queue from the start until we encounter waitingProc, - * since we only care about processes in front of waitingProc in the queue. - */ - while (queueSize-- > 0 && currentProc != waitingProc) + + 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, + * since we only care about processes in front of waitingProc in the queue. + */ + break; + } + int awaitMask = LOCKBIT_ON(currentProc->waitLockMode); /*