summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera2017-06-22 17:50:26 +0000
committerAlvaro Herrera2017-06-22 17:50:26 +0000
commita4f06606a328664d79f34b6041e816908d93e063 (patch)
treec1ec6a6b29f47a01118bd61b54354f37dc5ec4ac
parent2a6db5eba69c0d6c842360f836cadd20e6cd9a0c (diff)
Fix autovacuum launcher attachment to its DSA
The autovacuum launcher doesn't actually do anything with its DSA other than creating it and attaching to it, but it's been observed that after longjmp'ing to the standard error handling block (for example after getting SIGINT) the autovacuum enters an infinite loop reporting that it cannot attach to its DSA anymore (which is correct, because it's already attached to it.) Fix by only attempting to attach if not already attached. I introduced this bug together with BRIN autosummarization in 7526e10224f0. Reported-by: Yugo Nagata. Author: Thomas Munro. I added the comment to go with it. Discussion: https://postgr.es/m/[email protected]
-rw-r--r--src/backend/postmaster/autovacuum.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index d75feda481..00b1e823af 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -612,7 +612,8 @@ AutoVacLauncherMain(int argc, char *argv[])
/*
* Set up our DSA so that backends can install work-item requests. It may
- * already exist as created by a previous launcher.
+ * already exist as created by a previous launcher; and we may even be
+ * already attached to it, if we're here after longjmp'ing above.
*/
if (!AutoVacuumShmem->av_dsa_handle)
{
@@ -626,7 +627,7 @@ AutoVacLauncherMain(int argc, char *argv[])
AutoVacuumShmem->av_workitems = InvalidDsaPointer;
LWLockRelease(AutovacuumLock);
}
- else
+ else if (AutoVacuumDSA == NULL)
{
AutoVacuumDSA = dsa_attach(AutoVacuumShmem->av_dsa_handle);
dsa_pin_mapping(AutoVacuumDSA);