From c300f8a7b20195b6415c64a146e15a7071ba983b Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 30 Jan 2020 20:25:37 +1300 Subject: [PATCH] Handle lack of DSM segment slots in parallel btree build. If no DSM slots are available, a ParallelContext can still be created by its seg pointer is NULL. Teach parallel btree build to cope with that by falling back to a regular non-parallel build, to avoid a segmentation fault. Back-patch to 11, where parallel CREATE INDEX landed. Reported-by: Nicola Contu Discussion: https://postgr.es/m/CA%2BhUKG%2BcfjHy63hXEOc-CRZEPcUhu9%3DP3gKk_W9OiXzj-dfV_g%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 f163491d60..e6be7bba59 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; /* -- 2.23.0