On Wed, Sep 18, 2013 at 6:20 PM, Greg Stark <st...@mit.edu> wrote:
> 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))
>             {

Hmm, yeah.  I remember noticing this some time ago but never got
around to fixing it.  +1 for rearranging things there somehow.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
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