From d761ef2c2fef336fae908d802237715ab38cdf2c Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 14 Aug 2017 13:54:57 -0300 Subject: [PATCH 1/2] Release lwlocks in autovacuum launcher error handling path For regular processes, lwlock release is handling via AbortCurrentTransaction(), which autovacuum already does. However, autovacuum launcher sometimes obtains lock outside of any transaction, in which case AbortCurrentTransaction is a no-op. Continuing after error recovery would block if we tried to obtain an lwlock that we failed to release. Reported-by: Robert Haas Discussion: https://postgr.es/m/CA+TgmobQVbz4K_+RSmiM9HeRKpy3vS5xnbkL95gSEnWijzprKQ@mail.gmail.com --- src/backend/postmaster/autovacuum.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 00b1e823af..ed1a288475 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -525,6 +525,12 @@ AutoVacLauncherMain(int argc, char *argv[]) AbortCurrentTransaction(); /* + * Release lwlocks. Normally done as part of AbortCurrentTransaction, + * but launcher is not in a transaction at all times. + */ + LWLockReleaseAll(); + + /* * Now return to normal top-level context and clear ErrorContext for * next time. */ -- 2.11.0