]> granicus.if.org Git - postgresql/commitdiff
Fix autovacuum work item error handling
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 30 Oct 2017 14:52:02 +0000 (15:52 +0100)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 30 Oct 2017 14:52:02 +0000 (15:52 +0100)
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

src/backend/postmaster/autovacuum.c

index c04c0b548d4c8b16ac69d99c626925beda37898e..48765bb01b557ab7986c478cc364ae2553ad0b0a 100644 (file)
@@ -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);