]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Handle lack of DSM slots in parallel btree build.
authorThomas Munro <tmunro@postgresql.org>
Thu, 30 Jan 2020 21:25:34 +0000 (10:25 +1300)
committerThomas Munro <tmunro@postgresql.org>
Thu, 30 Jan 2020 21:25:34 +0000 (10:25 +1300)
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

index f163491d6007b86d97ceff12f300460c20e2fbbc..e6be7bba5946ea08edc94828391ba1ca1e879bff 100644 (file)
@@ -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;
 
        /*