aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/varsup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/varsup.c')
-rw-r--r--src/backend/access/transam/varsup.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index e44cf0d4505..425bc3f403a 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;
}