From 2543c9ee25245f63653bf342a0240eaa8a1dcd6f Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 23 Oct 2017 18:55:12 +0200 Subject: [PATCH] Fix autovacuum work items --- src/backend/postmaster/autovacuum.c | 39 +++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 776b1c0a9d..f5aa520d39 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2525,12 +2525,15 @@ deleted: continue; if (workitem->avw_active) continue; + if (workitem->avw_database != MyDatabaseId) + continue; /* claim this one, and release lock while performing it */ workitem->avw_active = true; LWLockRelease(AutovacuumLock); perform_work_item(workitem); + /* we intentially do not set did_vacuum here */ /* * Check for config changes before acquiring lock for further @@ -2601,16 +2604,22 @@ perform_work_item(AutoVacuumWorkItem *workitem) /* * Save the relation name for a possible error message, to avoid a catalog * lookup in case of an error. If any of these return NULL, then the - * relation has been dropped since last we checked; skip it. Note: they - * must live in a long-lived memory context because we call vacuum and - * analyze in different transactions. + * relation has been dropped since last we checked; skip it. */ - + MemoryContextSwitchTo(TopTransactionContext); cur_relname = get_rel_name(workitem->avw_relation); cur_nspname = get_namespace_name(get_rel_namespace(workitem->avw_relation)); cur_datname = get_database_name(MyDatabaseId); if (!cur_relname || !cur_nspname || !cur_datname) - goto deleted2; + { + if (cur_datname) + pfree(cur_datname); + if (cur_nspname) + pfree(cur_nspname); + if (cur_relname) + pfree(cur_relname); + return; + } autovac_report_workitem(workitem, cur_nspname, cur_datname); @@ -2623,7 +2632,6 @@ perform_work_item(AutoVacuumWorkItem *workitem) PG_TRY(); { /* have at it */ - MemoryContextSwitchTo(TopTransactionContext); switch (workitem->avw_type) { @@ -2645,6 +2653,14 @@ perform_work_item(AutoVacuumWorkItem *workitem) * point.) */ QueryCancelPending = false; + + /* be tidy */ + if (cur_datname) + pfree(cur_datname); + if (cur_nspname) + pfree(cur_nspname); + if (cur_relname) + pfree(cur_relname); } PG_CATCH(); { @@ -2667,17 +2683,6 @@ perform_work_item(AutoVacuumWorkItem *workitem) RESUME_INTERRUPTS(); } PG_END_TRY(); - - /* We intentionally do not set did_vacuum here */ - - /* be tidy */ -deleted2: - if (cur_datname) - pfree(cur_datname); - if (cur_nspname) - pfree(cur_nspname); - if (cur_relname) - pfree(cur_relname); } /* -- 2.11.0