postgres.git / summary / log / commit / refs

commit    74618e77b43cfce670b4725d5b9a300a2afd12d1
Author:   Thomas Munro <tmunro@postgresql.org>
Date:     Thu Jan 30 21:25:34 2020 +0000
First released in: 13.0, 11.7, 12.2

    Handle lack of DSM slots in parallel btree build.
    
    If no DSM slots are available, a ParallelContext can still be
    created, but its seg pointer is NULL.  Teach parallel btree build
    to cope with that by falling back to a regular non-parallel build,
    to avoid crashing with a segmentation fault.
    
    Back-patch to 11, where parallel CREATE INDEX landed.
    
    Reported-by: Nicola Contu
    Reviewed-by: Peter Geoghegan
    Discussion: https://postgr.es/m/CA%2BhUKGJgJEBnkuODBVomyK3MWFvDBbMVj%3Dgdt6DnRPU-5sQ6UQ%40mail.gmail.com


src/backend/access/nbtree/nbtsort.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index f163491d600..e6be7bba594 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -1331,6 +1331,15 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request) Assert(request > 0); pcxt = CreateParallelContext("postgres", "_bt_parallel_build_main", request); + + /* If no DSM segment was available, back out (do serial build) */ + if (pcxt->seg == NULL) + { + DestroyParallelContext(pcxt); + ExitParallelMode(); + return; + } + scantuplesortstates = leaderparticipates ? request + 1 : request; /* [parent: c9d297751959]