aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2009-09-01 04:46:49 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2009-09-01 04:46:49 +0000
commit794e3e81a0e8068de2606015352c1254cb071a78 (patch)
tree1801a9097fb75dd172f37dc9ec560d4edb635db6 /src
parent14f445fccf3735bf5bddf0a90ce0a15be263b576 (diff)
downloadpostgresql-794e3e81a0e8068de2606015352c1254cb071a78.tar.gz
postgresql-794e3e81a0e8068de2606015352c1254cb071a78.zip
Force VACUUM to recalculate oldestXmin even when we haven't changed our
own database's datfrozenxid, if the current value is old enough to be forcing autovacuums or warning messages. This ensures that a bogus value is replaced as soon as possible. Per a comment from Heikki.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/varsup.c23
-rw-r--r--src/backend/commands/vacuum.c7
-rw-r--r--src/include/access/transam.h4
3 files changed, 22 insertions, 12 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;
}
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 260eab82d1b..51c44c80dd5 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 87609e6f81c..6f3370dcd2c 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 */