0001-Handle-lack-of-DSM-segment-slots-in-parallel-btree-b.patch

application/octet-stream

Filename: 0001-Handle-lack-of-DSM-segment-slots-in-parallel-btree-b.patch
Type: application/octet-stream
Part: 0
Message: Parallel CREATE INDEX vs DSM starvation

Patch

Format: format-patch
Series: patch 0001
Subject: Handle lack of DSM segment slots in parallel btree build.
File+
src/backend/access/nbtree/nbtsort.c 9 0
From c300f8a7b20195b6415c64a146e15a7071ba983b Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
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