From d9a622cee162775ae42aa5c1ac592760d0d777d9 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Tue, 15 Aug 2017 13:35:12 -0300 Subject: [PATCH] Fix error handling path in autovacuum launcher 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 | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 00b1e823af..e1019ce395 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -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.