mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Fix recently-understood problems with handling of XID freezing, particularly
in PITR scenarios. We now WAL-log the replacement of old XIDs with FrozenTransactionId, so that such replacement is guaranteed to propagate to PITR slave databases. Also, rather than relying on hint-bit updates to be preserved, pg_clog is not truncated until all instances of an XID are known to have been replaced by FrozenTransactionId. Add new GUC variables and pg_autovacuum columns to allow management of the freezing policy, so that users can trade off the size of pg_clog against the amount of freezing work done. Revise the already-existing code that forces autovacuum of tables approaching the wraparound point to make it more bulletproof; also, revise the autovacuum logic so that anti-wraparound vacuuming is done per-table rather than per-database. initdb forced because of changes in pg_class, pg_database, and pg_autovacuum catalogs. Heikki Linnakangas, Simon Riggs, and Tom Lane.
This commit is contained in:
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.252 2006/10/18 22:44:11 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.253 2006/11/05 22:42:08 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -5343,36 +5343,6 @@ GetLastSegSwitchTime(void)
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* GetRecentNextXid - get the nextXid value saved by the most recent checkpoint
|
||||
*
|
||||
* This is currently used only by the autovacuum daemon. To check for
|
||||
* impending XID wraparound, autovac needs an approximate idea of the current
|
||||
* XID counter, and it needs it before choosing which DB to attach to, hence
|
||||
* before it sets up a PGPROC, hence before it can take any LWLocks. But it
|
||||
* has attached to shared memory, and so we can let it reach into the shared
|
||||
* ControlFile structure and pull out the last checkpoint nextXID.
|
||||
*
|
||||
* Since we don't take any sort of lock, we have to assume that reading a
|
||||
* TransactionId is atomic ... but that assumption is made elsewhere, too,
|
||||
* and in any case the worst possible consequence of a bogus result is that
|
||||
* autovac issues an unnecessary database-wide VACUUM.
|
||||
*
|
||||
* Note: we could also choose to read ShmemVariableCache->nextXid in an
|
||||
* unlocked fashion, thus getting a more up-to-date result; but since that
|
||||
* changes far more frequently than the controlfile checkpoint copy, it would
|
||||
* pose a far higher risk of bogus result if we did have a nonatomic-read
|
||||
* problem.
|
||||
*
|
||||
* A (theoretically) completely safe answer is to read the actual pg_control
|
||||
* file into local process memory, but that certainly seems like overkill.
|
||||
*/
|
||||
TransactionId
|
||||
GetRecentNextXid(void)
|
||||
{
|
||||
return ControlFile->checkPointCopy.nextXid;
|
||||
}
|
||||
|
||||
/*
|
||||
* GetNextXidAndEpoch - get the current nextXid value and associated epoch
|
||||
*
|
||||
|
Reference in New Issue
Block a user