diff options
-rw-r--r-- | doc/src/sgml/config.sgml | 8 | ||||
-rw-r--r-- | src/backend/access/heap/vacuumlazy.c | 7 | ||||
-rw-r--r-- | src/backend/commands/vacuum.c | 8 |
3 files changed, 18 insertions, 5 deletions
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index fcb53c69974..5bad13d24ad 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -9320,8 +9320,12 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; </para> <para> When the failsafe is triggered, any cost-based delay that is - in effect will no longer be applied, and further non-essential - maintenance tasks (such as index vacuuming) are bypassed. + in effect will no longer be applied, further non-essential + maintenance tasks (such as index vacuuming) are bypassed, and any + <glossterm linkend="glossary-buffer-access-strategy">Buffer Access Strategy</glossterm> + in use will be disabled resulting in <command>VACUUM</command> being + free to make use of all of + <glossterm linkend="glossary-shared-memory">shared buffers</glossterm>. </para> <para> The default is 1.6 billion transactions. Although users can diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index ae628d747dc..3e5d3982c7d 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -2623,6 +2623,13 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel) { vacrel->failsafe_active = true; + /* + * Abandon use of a buffer access strategy to allow use of all of + * shared buffers. We assume the caller who allocated the memory for + * the BufferAccessStrategy will free it. + */ + vacrel->bstrategy = NULL; + /* Disable index vacuuming, index cleanup, and heap rel truncation */ vacrel->do_index_vacuuming = false; vacrel->do_index_cleanup = false; diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 1c3437336d9..da85330ef40 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -391,11 +391,13 @@ vacuum(List *relations, VacuumParams *params, /* * If caller didn't give us a buffer strategy object, make one in the - * cross-transaction memory context. + * cross-transaction memory context. We needn't bother making this for + * VACUUM (FULL) or VACUUM (ONLY_DATABASE_STATS) as they'll not make use + * of it. */ if (bstrategy == NULL && - !(params->options & VACOPT_ONLY_DATABASE_STATS || - params->options & VACOPT_FULL)) + (params->options & (VACOPT_ONLY_DATABASE_STATS | + VACOPT_FULL)) == 0) { MemoryContext old_context = MemoryContextSwitchTo(vac_context); |