Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit dba6e75

Browse files
committed
Fix ReinitializeParallelDSM to tolerate finding no error queues.
Commit d466335 changed things so that shm_toc_lookup would fail with an error rather than silently returning NULL in the hope that such failures would be reported in a useful way rather than via a system crash. However, it overlooked the fact that the lookup of PARALLEL_KEY_ERROR_QUEUE in ReinitializeParallelDSM is expected to fail when no DSM segment was created in the first place; in that case, we end up with a backend-private memory segment that still contains an entry for PARALLEL_KEY_FIXED but no others. Consequently a benign failure to initialize parallelism can escalate into an elog(ERROR); repair. Discussion: http://postgr.es/m/CA+Tgmob8LFw55DzH1QEREpBEA9RJ_W_amhBFCVZ6WMwUhVpOqg@mail.gmail.com
1 parent ec7629d commit dba6e75

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

src/backend/access/transam/parallel.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,10 @@ ReinitializeParallelDSM(ParallelContext *pcxt)
399399
fps = shm_toc_lookup(pcxt->toc, PARALLEL_KEY_FIXED, false);
400400
fps->last_xlog_end = 0;
401401

402-
/* Recreate error queues. */
402+
/* Recreate error queues (if they exist). */
403403
error_queue_space =
404-
shm_toc_lookup(pcxt->toc, PARALLEL_KEY_ERROR_QUEUE, false);
404+
shm_toc_lookup(pcxt->toc, PARALLEL_KEY_ERROR_QUEUE, true);
405+
Assert(pcxt->nworkers == 0 || error_queue_space != NULL);
405406
for (i = 0; i < pcxt->nworkers; ++i)
406407
{
407408
char *start;

0 commit comments

Comments
 (0)