Re: Bug in autovacuum.c? - Mailing list pgsql-hackers

From Robert Haas
Subject Re: Bug in autovacuum.c?
Date
Msg-id AANLkTimQX_ag=xt_6bO5sEbKmLn-RUWO3hSdr3uqesAJ@mail.gmail.com
Whole thread Raw
In response to Bug in autovacuum.c?  (Bruce Momjian <bruce@momjian.us>)
Responses Re: Bug in autovacuum.c?
List pgsql-hackers
On Thu, Mar 31, 2011 at 12:17 PM, Bruce Momjian <bruce@momjian.us> wrote:
> Looking over the autovacuum.c code, I see:
>
>    /*
>     * Determine the oldest datfrozenxid/relfrozenxid that we will allow to
>     * pass without forcing a vacuum.  (This limit can be tightened for
>     * particular tables, but not loosened.)
>     */
>    recentXid = ReadNewTransactionId();
>    xidForceLimit = recentXid - autovacuum_freeze_max_age;
>    /* ensure it's a "normal" XID, else TransactionIdPrecedes misbehaves */
>    if (xidForceLimit < FirstNormalTransactionId)
>        xidForceLimit -= FirstNormalTransactionId;
>
> This last line doesn't look right to me;  should it be:
>
>        xidForceLimit = FirstNormalTransactionId;

That would probably work, but the existing coding actually makes more
sense.  It's essentially trying to scan backwards by
autovacuum_freeze_max_age XIDs through the circular XID space.  But
the XID space isn't actually circular, because there are 3 special
values.  So if we land on one of those values we want to skip backward
by 3.  Here FirstNormalTransactionId doesn't represent itself, but
rather the number of special XIDs that exist.

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


pgsql-hackers by date:

Previous
From: Gurjeet Singh
Date:
Subject: Re: Problem with pg_upgrade?
Next
From: Brendan Jurd
Date:
Subject: Re: [GENERAL] Date conversion using day of week