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

Reply via email to