diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index e44cf0d45057215fda3d7e68eeecd1c1a0cfa5fc..425bc3f403a2a947ec6721e8c1282c5bd5ee1f14 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -6,7 +6,7 @@ * Copyright (c) 2000-2009, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/varsup.c,v 1.85 2009/08/31 02:23:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/varsup.c,v 1.86 2009/09/01 04:46:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -372,32 +372,41 @@ SetTransactionIdLimit(TransactionId oldest_datfrozenxid, Oid oldest_datoid) /* - * TransactionIdLimitIsValid -- is the shared XID wrap-limit data sane? + * ForceTransactionIdLimitUpdate -- does the XID wrap-limit data need updating? * * We primarily check whether oldestXidDB is valid. The cases we have in * mind are that that database was dropped, or the field was reset to zero * by pg_resetxlog. In either case we should force recalculation of the - * wrap limit. In future we might add some more sanity checks here. + * wrap limit. Also do it if oldestXid is old enough to be forcing + * autovacuums or other actions; this ensures we update our state as soon + * as possible once extra overhead is being incurred. */ bool -TransactionIdLimitIsValid(void) +ForceTransactionIdLimitUpdate(void) { + TransactionId nextXid; + TransactionId xidVacLimit; TransactionId oldestXid; Oid oldestXidDB; /* Locking is probably not really necessary, but let's be careful */ LWLockAcquire(XidGenLock, LW_SHARED); + nextXid = ShmemVariableCache->nextXid; + xidVacLimit = ShmemVariableCache->xidVacLimit; oldestXid = ShmemVariableCache->oldestXid; oldestXidDB = ShmemVariableCache->oldestXidDB; LWLockRelease(XidGenLock); if (!TransactionIdIsNormal(oldestXid)) - return false; /* shouldn't happen, but just in case */ + return true; /* shouldn't happen, but just in case */ + if (TransactionIdFollowsOrEquals(nextXid, xidVacLimit) && + TransactionIdIsValid(xidVacLimit)) + return true; /* past VacLimit, don't delay updating */ if (!SearchSysCacheExists(DATABASEOID, ObjectIdGetDatum(oldestXidDB), 0, 0, 0)) - return false; /* could happen, per comment above */ - return true; + return true; /* could happen, per comments above */ + return false; } diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 260eab82d1bda7f61fad60cc777ff35385e335f7..51c44c80dd5ee84b2aded2c05d3205083b34f8f3 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.392 2009/09/01 02:54:51 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.393 2009/09/01 04:46:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -893,9 +893,10 @@ vac_update_datfrozenxid(void) /* * If we were able to advance datfrozenxid, see if we can truncate pg_clog. - * Also do it if the shared XID-wrap-limit info is stale. + * Also do it if the shared XID-wrap-limit info is stale, since this + * action will update that too. */ - if (dirty || !TransactionIdLimitIsValid()) + if (dirty || ForceTransactionIdLimitUpdate()) vac_truncate_clog(newFrozenXid); } diff --git a/src/include/access/transam.h b/src/include/access/transam.h index 87609e6f81cf8bf177e4b968cebc46c1e3eb1b5c..6f3370dcd2c4a632ed32094ae2220fce34fe1e7a 100644 --- a/src/include/access/transam.h +++ b/src/include/access/transam.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/transam.h,v 1.69 2009/08/31 02:23:23 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/transam.h,v 1.70 2009/09/01 04:46:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -156,7 +156,7 @@ extern TransactionId GetNewTransactionId(bool isSubXact); extern TransactionId ReadNewTransactionId(void); extern void SetTransactionIdLimit(TransactionId oldest_datfrozenxid, Oid oldest_datoid); -extern bool TransactionIdLimitIsValid(void); +extern bool ForceTransactionIdLimitUpdate(void); extern Oid GetNewObjectId(void); #endif /* TRAMSAM_H */