aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2017-10-30 15:52:02 +0100
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2017-10-30 15:52:02 +0100
commitbe72b9c378bfe99a3d175c98d36dc150229f4faf (patch)
treefa9fdd0b62e905ebd1fa9881eb00d0fe8da9c96a /src/backend
parent77954f996cdb31ead2718aa3a9b4878da382e385 (diff)
downloadpostgresql-be72b9c378bfe99a3d175c98d36dc150229f4faf.tar.gz
postgresql-be72b9c378bfe99a3d175c98d36dc150229f4faf.zip
Fix autovacuum work item error handling
In autovacuum's "work item" processing, a few strings were allocated in the current transaction's memory context, which goes away during error handling; if an error happened during execution of the work item, the pfree() calls to clean up afterwards would try to release already-released memory, possibly leading to a crash. In branch master, this was already fixed by commit 335f3d04e4c8, so backpatch that to REL_10_STABLE to fix the problem there too. As a secondary problem, verify that the autovacuum worker is connected to the right database for each work item; otherwise some items would be discarded by workers in other databases. Reported-by: Justin Pryzby Discussion: https://postgr.es/m/20171014035732.GB31726@telsasoft.com
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/postmaster/autovacuum.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index c04c0b548d4..48765bb01b5 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2531,6 +2531,8 @@ 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;
@@ -2606,9 +2608,7 @@ 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.
*/
Assert(CurrentMemoryContext == AutovacMemCxt);