]> granicus.if.org Git - postgresql/commitdiff
Fix error handling path in autovacuum launcher
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 15 Aug 2017 16:35:12 +0000 (13:35 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 15 Aug 2017 16:35:12 +0000 (13:35 -0300)
The original code (since 00e6a16d01) was assuming aborting the
transaction in autovacuum launcher was sufficient to release all
resources, but in reality the launcher runs quite a lot of code out of
any transactions.  Re-introduce individual cleanup calls to make abort
more robust.

Reported-by: Robert Haas
Discussion: https://postgr.es/m/CA+TgmobQVbz4K_+RSmiM9HeRKpy3vS5xnbkL95gSEnWijzprKQ@mail.gmail.com

src/backend/postmaster/autovacuum.c

index 00b1e823af4b3e97215e07c8ec4a37802f7d7d74..e1019ce39570745fa76f0a53ab1fae14f7c81984 100644 (file)
@@ -91,6 +91,7 @@
 #include "storage/proc.h"
 #include "storage/procsignal.h"
 #include "storage/sinvaladt.h"
+#include "storage/smgr.h"
 #include "tcop/tcopprot.h"
 #include "utils/dsa.h"
 #include "utils/fmgroids.h"
@@ -524,6 +525,26 @@ AutoVacLauncherMain(int argc, char *argv[])
                /* Abort the current transaction in order to recover */
                AbortCurrentTransaction();
 
+               /*
+                * Release any other resources, for the case where we were not in a
+                * transaction.
+                */
+               LWLockReleaseAll();
+               pgstat_report_wait_end();
+               AbortBufferIO();
+               UnlockBuffers();
+               if (CurrentResourceOwner)
+               {
+                       ResourceOwnerRelease(CurrentResourceOwner,
+                                                                RESOURCE_RELEASE_BEFORE_LOCKS,
+                                                                false, true);
+                       /* we needn't bother with the other ResourceOwnerRelease phases */
+               }
+               AtEOXact_Buffers(false);
+               AtEOXact_SMgr();
+               AtEOXact_Files();
+               AtEOXact_HashTables(false);
+
                /*
                 * Now return to normal top-level context and clear ErrorContext for
                 * next time.