The following code is in the ProcSleep at proc.c:1138. GetBlockingAutoVacuumPgproc() should presumably always return a vacuum pgproc entry since the deadlock state says it's blocked by autovacuum. But I'm not really familiar enough with this codepath to know whether there's not a race condition here where it can sometimes return null. The following code checks autovac != NULL but the PGXACT initializer would have seg faulted if it returned NULL if that's possible.
if (deadlock_state == DS_BLOCKED_BY_AUTOVACUUM && allow_autovacuum_cancel) { PGPROC *autovac = GetBlockingAutoVacuumPgproc(); PGXACT *autovac_pgxact = &ProcGlobal->allPgXact[autovac->pgprocno]; LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); /* * Only do it if the worker is not working to protect against Xid * wraparound. */ if ((autovac != NULL) && (autovac_pgxact->vacuumFlags & PROC_IS_AUTOVACUUM) && !(autovac_pgxact->vacuumFlags & PROC_VACUUM_FOR_WRAPAROUND)) { -- greg -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers