mirror of
https://github.com/postgres/postgres.git
synced 2025-07-14 08:21:07 +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:
@ -37,7 +37,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.500 2006/10/04 00:29:56 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.501 2006/11/05 22:42:09 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
@ -217,6 +217,8 @@ static bool FatalError = false; /* T if recovering from backend crash */
|
||||
bool ClientAuthInProgress = false; /* T during new-client
|
||||
* authentication */
|
||||
|
||||
static bool force_autovac = false; /* received START_AUTOVAC signal */
|
||||
|
||||
/*
|
||||
* State for assigning random salts and cancel keys.
|
||||
* Also, the global MyCancelKey passes the cancel key assigned to a given
|
||||
@ -1231,9 +1233,13 @@ ServerLoop(void)
|
||||
* (It'll die relatively quickly.) We check that it's not started too
|
||||
* frequently in autovac_start.
|
||||
*/
|
||||
if (AutoVacuumingActive() && AutoVacPID == 0 &&
|
||||
if ((AutoVacuumingActive() || force_autovac) && AutoVacPID == 0 &&
|
||||
StartupPID == 0 && !FatalError && Shutdown == NoShutdown)
|
||||
{
|
||||
AutoVacPID = autovac_start();
|
||||
if (AutoVacPID != 0)
|
||||
force_autovac = false; /* signal successfully processed */
|
||||
}
|
||||
|
||||
/* If we have lost the archiver, try to start a new one */
|
||||
if (XLogArchivingActive() && PgArchPID == 0 &&
|
||||
@ -2100,9 +2106,7 @@ reaper(SIGNAL_ARGS)
|
||||
/*
|
||||
* Was it the autovacuum process? Normal exit can be ignored; we'll
|
||||
* start a new one at the next iteration of the postmaster's main
|
||||
* loop, if necessary.
|
||||
*
|
||||
* An unexpected exit must crash the system.
|
||||
* loop, if necessary. An unexpected exit is treated as a crash.
|
||||
*/
|
||||
if (AutoVacPID != 0 && pid == AutoVacPID)
|
||||
{
|
||||
@ -3424,12 +3428,16 @@ sigusr1_handler(SIGNAL_ARGS)
|
||||
|
||||
if (CheckPostmasterSignal(PMSIGNAL_START_AUTOVAC))
|
||||
{
|
||||
/* start one iteration of the autovacuum daemon */
|
||||
if (Shutdown == NoShutdown)
|
||||
{
|
||||
Assert(!AutoVacuumingActive());
|
||||
AutoVacPID = autovac_start();
|
||||
}
|
||||
/*
|
||||
* Start one iteration of the autovacuum daemon, even if autovacuuming
|
||||
* is nominally not enabled. This is so we can have an active defense
|
||||
* against transaction ID wraparound. We set a flag for the main loop
|
||||
* to do it rather than trying to do it here --- this is because the
|
||||
* autovac process itself may send the signal, and we want to handle
|
||||
* that by launching another iteration as soon as the current one
|
||||
* completes.
|
||||
*/
|
||||
force_autovac = true;
|
||||
}
|
||||
|
||||
PG_SETMASK(&UnBlockSig);
|
||||
|
Reference in New Issue
Block a user