aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/heap/vacuumlazy.c7
-rw-r--r--src/backend/commands/vacuum.c8
2 files changed, 12 insertions, 3 deletions
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);