aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2017-08-15 13:35:12 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2017-08-15 13:35:12 -0300
commit870da1e1546c9563c5ae45918392cf7bbc7e5b0e (patch)
tree5f32beae207e35751d129819f91db33a083fb9c8
parentd7ab908fbab5094e92a167441ec8d6bfb3b0c9fc (diff)
downloadpostgresql-870da1e1546c9563c5ae45918392cf7bbc7e5b0e.tar.gz
postgresql-870da1e1546c9563c5ae45918392cf7bbc7e5b0e.zip
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
-rw-r--r--src/backend/postmaster/autovacuum.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 00b1e823af4..e1019ce3957 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"
@@ -525,6 +526,26 @@ AutoVacLauncherMain(int argc, char *argv[])
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.
*/