Handle lack of DSM slots in parallel btree build.
authorThomas Munro
Thu, 30 Jan 2020 21:25:34 +0000 (10:25 +1300)
committerThomas Munro
Thu, 30 Jan 2020 22:12:21 +0000 (11:12 +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 16f57557776908519ea376f8ea2a5803acc50131..bc00799b964b91437ef932bd3ddd6c9c781e9283 100644 (file)
@@ -1256,6 +1256,15 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request)
    Assert(request > 0);
    pcxt = CreateParallelContext("postgres", "_bt_parallel_build_main",
                                 request, true);
+
+   /* If no DSM segment was available, back out (do serial build) */
+   if (pcxt->seg == NULL)
+   {
+       DestroyParallelContext(pcxt);
+       ExitParallelMode();
+       return;
+   }
+
    scantuplesortstates = leaderparticipates ? request + 1 : request;
 
    /*