From 5bea95009b3fb6ca47a5bbc3e4fca3c89c696199 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Wed, 15 Nov 2017 11:17:37 +0200 Subject: [PATCH] Skip autovacuum processes for distributed deadlock detection Autovacuum process cancels itself if any modification starts on the table in order to avoid blocking your regular Postgres sessions. That's normal and expected. Thus, any locks held by autovacuum process cannot involve in a distributed deadlock since it'll be released if needed. --- src/backend/distributed/transaction/lock_graph.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/distributed/transaction/lock_graph.c b/src/backend/distributed/transaction/lock_graph.c index fde08e8ff..793fa3cca 100644 --- a/src/backend/distributed/transaction/lock_graph.c +++ b/src/backend/distributed/transaction/lock_graph.c @@ -496,6 +496,10 @@ BuildLocalWaitGraph(void) * IsProcessWaitingForSafeOperations returns true if the given PROC * waiting on relation extension locks, page locks or speculative locks. * + * The function also returns true if the waiting process is an autovacuum + * process given that autovacuum cannot contribute to any distributed + * deadlocks. + * * In general for the purpose of distributed deadlock detection, we should * skip if the process blocked on the locks that may not be part of deadlocks. * Those locks are held for a short duration while the relation or the index @@ -509,12 +513,20 @@ IsProcessWaitingForSafeOperations(PGPROC *proc) { PROCLOCK *waitProcLock = NULL; LOCK *waitLock = NULL; + PGXACT *pgxact = NULL; if (proc->waitStatus != STATUS_WAITING) { return false; } + /* get the transaction that the backend associated with */ + pgxact = &ProcGlobal->allPgXact[proc->pgprocno]; + if (pgxact->vacuumFlags & PROC_IS_AUTOVACUUM) + { + return true; + } + waitProcLock = proc->waitProcLock; waitLock = waitProcLock->tag.myLock;