postgres.git / summary / log / commit / refs

commit    a4f06606a328664d79f34b6041e816908d93e063
Author:   Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:     Thu Jun 22 17:50:26 2017 +0000

    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/20170621211538.0c9eae73.nagata@sraoss.co.jp


src/backend/postmaster/autovacuum.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index d75feda481d..00b1e823af4 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); [parent: 2a6db5eba69c]