On Thu, Mar 31, 2011 at 12:17 PM, Bruce Momjian <br...@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 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers