Fix rare assertion failure in parallel hash join.

When a backend runs out of inner tuples to hash, it should detach from
grow_batch_barrier only after it has flushed all batches to disk and
merged counters, not before.  Otherwise a concurrent backend in
ExecParallelHashIncreaseNumBatches() could stop waiting for this
backend and try to read tuples before they have been written.  This
commit reorders those operations and should fix the assertion failures
seen occasionally on the build farm since commit
1804284042.

Author: Thomas Munro
Discussion: https://postgr.es/m/E1eRwXy-0004IK-TO%40gemulon.postgresql.org
This commit is contained in:
Andres Freund 2017-12-28 02:41:53 -08:00
parent be2343221f
commit f83040c62a
1 changed files with 3 additions and 2 deletions

View File

@ -288,8 +288,6 @@ MultiExecParallelHash(HashState *node)
ExecParallelHashTableInsert(hashtable, slot, hashvalue);
hashtable->partialTuples++;
}
BarrierDetach(&pstate->grow_buckets_barrier);
BarrierDetach(&pstate->grow_batches_barrier);
/*
* Make sure that any tuples we wrote to disk are visible to
@ -304,6 +302,9 @@ MultiExecParallelHash(HashState *node)
*/
ExecParallelHashMergeCounters(hashtable);
BarrierDetach(&pstate->grow_buckets_barrier);
BarrierDetach(&pstate->grow_batches_barrier);
/*
* Wait for everyone to finish building and flushing files and
* counters.