diff options
author | Thomas Munro <tmunro@postgresql.org> | 2023-03-23 12:39:43 +1300 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2023-03-23 13:14:25 +1300 |
commit | 8fba928fd78856712f69d96852f8061e77390fda (patch) | |
tree | bad0cda018a6e277f7b4d92180edf55ea3eac057 /src/backend/executor/nodeHash.c | |
parent | 11470f544e3729c60fab890145b2e839cbc8905e (diff) | |
download | postgresql-8fba928fd78856712f69d96852f8061e77390fda.tar.gz postgresql-8fba928fd78856712f69d96852f8061e77390fda.zip |
Improve the naming of Parallel Hash Join phases.
* Commit 3048898e dropped -ING from PHJ wait event names. Update the
corresponding barrier phases names to match.
* Rename the "DONE" phases to "FREE". That's symmetrical with
"ALLOCATE", and names the activity that actually happens in that phase
(as we do for the other phases) rather than a state. The bug fixed by
commit 8d578b9b might have been more obvious with this name.
* Rename the batch/bucket growth barriers' "ALLOCATE" phases to
"REALLOCATE", a better description of what they do.
* Update the high level comments about phases to highlight phases
are executed by a single process with an asterisk (mostly memory
management phases).
No behavior change, as this is just improving internal identifiers. The
only user-visible sign of this is that a couple of wait events' display
names change from "...Allocate" to "...Reallocate" in pg_stat_activity,
to stay in sync with the internal names.
Reviewed-by: Melanie Plageman <melanieplageman@gmail.com>
Discussion: https://postgr.es/m/CA%2BhUKG%2BMDpwF2Eo2LAvzd%3DpOh81wUTsrwU1uAwR-v6OGBB6%2B7g%40mail.gmail.com
Diffstat (limited to 'src/backend/executor/nodeHash.c')
-rw-r--r-- | src/backend/executor/nodeHash.c | 73 |
1 files changed, 36 insertions, 37 deletions
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 1e624fed7ae..748c9b00243 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -246,10 +246,10 @@ MultiExecParallelHash(HashState *node) */ pstate = hashtable->parallel_state; build_barrier = &pstate->build_barrier; - Assert(BarrierPhase(build_barrier) >= PHJ_BUILD_ALLOCATING); + Assert(BarrierPhase(build_barrier) >= PHJ_BUILD_ALLOCATE); switch (BarrierPhase(build_barrier)) { - case PHJ_BUILD_ALLOCATING: + case PHJ_BUILD_ALLOCATE: /* * Either I just allocated the initial hash table in @@ -259,7 +259,7 @@ MultiExecParallelHash(HashState *node) BarrierArriveAndWait(build_barrier, WAIT_EVENT_HASH_BUILD_ALLOCATE); /* Fall through. */ - case PHJ_BUILD_HASHING_INNER: + case PHJ_BUILD_HASH_INNER: /* * It's time to begin hashing, or if we just arrived here then @@ -271,10 +271,10 @@ MultiExecParallelHash(HashState *node) * below. */ if (PHJ_GROW_BATCHES_PHASE(BarrierAttach(&pstate->grow_batches_barrier)) != - PHJ_GROW_BATCHES_ELECTING) + PHJ_GROW_BATCHES_ELECT) ExecParallelHashIncreaseNumBatches(hashtable); if (PHJ_GROW_BUCKETS_PHASE(BarrierAttach(&pstate->grow_buckets_barrier)) != - PHJ_GROW_BUCKETS_ELECTING) + PHJ_GROW_BUCKETS_ELECT) ExecParallelHashIncreaseNumBuckets(hashtable); ExecParallelHashEnsureBatchAccessors(hashtable); ExecParallelHashTableSetCurrentBatch(hashtable, 0); @@ -338,17 +338,17 @@ MultiExecParallelHash(HashState *node) * Unless we're completely done and the batch state has been freed, make * sure we have accessors. */ - if (BarrierPhase(build_barrier) < PHJ_BUILD_DONE) + if (BarrierPhase(build_barrier) < PHJ_BUILD_FREE) ExecParallelHashEnsureBatchAccessors(hashtable); /* * The next synchronization point is in ExecHashJoin's HJ_BUILD_HASHTABLE - * case, which will bring the build phase to PHJ_BUILD_RUNNING (if it - * isn't there already). + * case, which will bring the build phase to PHJ_BUILD_RUN (if it isn't + * there already). */ - Assert(BarrierPhase(build_barrier) == PHJ_BUILD_HASHING_OUTER || - BarrierPhase(build_barrier) == PHJ_BUILD_RUNNING || - BarrierPhase(build_barrier) == PHJ_BUILD_DONE); + Assert(BarrierPhase(build_barrier) == PHJ_BUILD_HASH_OUTER || + BarrierPhase(build_barrier) == PHJ_BUILD_RUN || + BarrierPhase(build_barrier) == PHJ_BUILD_FREE); } /* ---------------------------------------------------------------- @@ -592,8 +592,8 @@ ExecHashTableCreate(HashState *state, List *hashOperators, List *hashCollations, * Attach to the build barrier. The corresponding detach operation is * in ExecHashTableDetach. Note that we won't attach to the * batch_barrier for batch 0 yet. We'll attach later and start it out - * in PHJ_BATCH_PROBING phase, because batch 0 is allocated up front - * and then loaded while hashing (the standard hybrid hash join + * in PHJ_BATCH_PROBE phase, because batch 0 is allocated up front and + * then loaded while hashing (the standard hybrid hash join * algorithm), and we'll coordinate that using build_barrier. */ build_barrier = &pstate->build_barrier; @@ -606,7 +606,7 @@ ExecHashTableCreate(HashState *state, List *hashOperators, List *hashCollations, * SharedHashJoinBatch objects and the hash table for batch 0. One * backend will be elected to do that now if necessary. */ - if (BarrierPhase(build_barrier) == PHJ_BUILD_ELECTING && + if (BarrierPhase(build_barrier) == PHJ_BUILD_ELECT && BarrierArriveAndWait(build_barrier, WAIT_EVENT_HASH_BUILD_ELECT)) { pstate->nbatch = nbatch; @@ -627,7 +627,7 @@ ExecHashTableCreate(HashState *state, List *hashOperators, List *hashCollations, /* * The next Parallel Hash synchronization point is in * MultiExecParallelHash(), which will progress it all the way to - * PHJ_BUILD_RUNNING. The caller must not return control from this + * PHJ_BUILD_RUN. The caller must not return control from this * executor node between now and then. */ } @@ -1075,7 +1075,7 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) { ParallelHashJoinState *pstate = hashtable->parallel_state; - Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_HASHING_INNER); + Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_HASH_INNER); /* * It's unlikely, but we need to be prepared for new participants to show @@ -1084,7 +1084,7 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) */ switch (PHJ_GROW_BATCHES_PHASE(BarrierPhase(&pstate->grow_batches_barrier))) { - case PHJ_GROW_BATCHES_ELECTING: + case PHJ_GROW_BATCHES_ELECT: /* * Elect one participant to prepare to grow the number of batches. @@ -1200,13 +1200,13 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) } /* Fall through. */ - case PHJ_GROW_BATCHES_ALLOCATING: + case PHJ_GROW_BATCHES_REALLOCATE: /* Wait for the above to be finished. */ BarrierArriveAndWait(&pstate->grow_batches_barrier, - WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE); + WAIT_EVENT_HASH_GROW_BATCHES_REALLOCATE); /* Fall through. */ - case PHJ_GROW_BATCHES_REPARTITIONING: + case PHJ_GROW_BATCHES_REPARTITION: /* Make sure that we have the current dimensions and buckets. */ ExecParallelHashEnsureBatchAccessors(hashtable); ExecParallelHashTableSetCurrentBatch(hashtable, 0); @@ -1219,7 +1219,7 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION); /* Fall through. */ - case PHJ_GROW_BATCHES_DECIDING: + case PHJ_GROW_BATCHES_DECIDE: /* * Elect one participant to clean up and decide whether further @@ -1274,7 +1274,7 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) } /* Fall through. */ - case PHJ_GROW_BATCHES_FINISHING: + case PHJ_GROW_BATCHES_FINISH: /* Wait for the above to complete. */ BarrierArriveAndWait(&pstate->grow_batches_barrier, WAIT_EVENT_HASH_GROW_BATCHES_FINISH); @@ -1514,7 +1514,7 @@ ExecParallelHashIncreaseNumBuckets(HashJoinTable hashtable) HashMemoryChunk chunk; dsa_pointer chunk_s; - Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_HASHING_INNER); + Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_HASH_INNER); /* * It's unlikely, but we need to be prepared for new participants to show @@ -1523,7 +1523,7 @@ ExecParallelHashIncreaseNumBuckets(HashJoinTable hashtable) */ switch (PHJ_GROW_BUCKETS_PHASE(BarrierPhase(&pstate->grow_buckets_barrier))) { - case PHJ_GROW_BUCKETS_ELECTING: + case PHJ_GROW_BUCKETS_ELECT: /* Elect one participant to prepare to increase nbuckets. */ if (BarrierArriveAndWait(&pstate->grow_buckets_barrier, WAIT_EVENT_HASH_GROW_BUCKETS_ELECT)) @@ -1552,13 +1552,13 @@ ExecParallelHashIncreaseNumBuckets(HashJoinTable hashtable) } /* Fall through. */ - case PHJ_GROW_BUCKETS_ALLOCATING: + case PHJ_GROW_BUCKETS_REALLOCATE: /* Wait for the above to complete. */ BarrierArriveAndWait(&pstate->grow_buckets_barrier, - WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE); + WAIT_EVENT_HASH_GROW_BUCKETS_REALLOCATE); /* Fall through. */ - case PHJ_GROW_BUCKETS_REINSERTING: + case PHJ_GROW_BUCKETS_REINSERT: /* Reinsert all tuples into the hash table. */ ExecParallelHashEnsureBatchAccessors(hashtable); ExecParallelHashTableSetCurrentBatch(hashtable, 0); @@ -1714,7 +1714,7 @@ retry: /* Try to load it into memory. */ Assert(BarrierPhase(&hashtable->parallel_state->build_barrier) == - PHJ_BUILD_HASHING_INNER); + PHJ_BUILD_HASH_INNER); hashTuple = ExecParallelHashTupleAlloc(hashtable, HJTUPLE_OVERHEAD + tuple->t_len, &shared); @@ -2868,7 +2868,7 @@ ExecParallelHashTupleAlloc(HashJoinTable hashtable, size_t size, if (pstate->growth != PHJ_GROWTH_DISABLED) { Assert(curbatch == 0); - Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_HASHING_INNER); + Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_HASH_INNER); /* * Check if our space limit would be exceeded. To avoid choking on @@ -2988,7 +2988,7 @@ ExecParallelHashJoinSetUpBatches(HashJoinTable hashtable, int nbatch) { /* Batch 0 doesn't need to be loaded. */ BarrierAttach(&shared->batch_barrier); - while (BarrierPhase(&shared->batch_barrier) < PHJ_BATCH_PROBING) + while (BarrierPhase(&shared->batch_barrier) < PHJ_BATCH_PROBE) BarrierArriveAndWait(&shared->batch_barrier, 0); BarrierDetach(&shared->batch_barrier); } @@ -3063,7 +3063,7 @@ ExecParallelHashEnsureBatchAccessors(HashJoinTable hashtable) /* * We should never see a state where the batch-tracking array is freed, * because we should have given up sooner if we join when the build - * barrier has reached the PHJ_BUILD_DONE phase. + * barrier has reached the PHJ_BUILD_FREE phase. */ Assert(DsaPointerIsValid(pstate->batches)); @@ -3146,7 +3146,7 @@ ExecHashTableDetachBatch(HashJoinTable hashtable) * longer attached, but since there is no way it's moving after * this point it seems safe to make the following assertion. */ - Assert(BarrierPhase(&batch->batch_barrier) == PHJ_BATCH_DONE); + Assert(BarrierPhase(&batch->batch_barrier) == PHJ_BATCH_FREE); /* Free shared chunks and buckets. */ while (DsaPointerIsValid(batch->chunks)) @@ -3189,13 +3189,12 @@ ExecHashTableDetach(HashJoinTable hashtable) /* * If we're involved in a parallel query, we must either have gotten all - * the way to PHJ_BUILD_RUNNING, or joined too late and be in - * PHJ_BUILD_DONE. + * the way to PHJ_BUILD_RUN, or joined too late and be in PHJ_BUILD_FREE. */ Assert(!pstate || - BarrierPhase(&pstate->build_barrier) >= PHJ_BUILD_RUNNING); + BarrierPhase(&pstate->build_barrier) >= PHJ_BUILD_RUN); - if (pstate && BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_RUNNING) + if (pstate && BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_RUN) { int i; @@ -3218,7 +3217,7 @@ ExecHashTableDetach(HashJoinTable hashtable) * Late joining processes will see this state and give up * immediately. */ - Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_DONE); + Assert(BarrierPhase(&pstate->build_barrier) == PHJ_BUILD_FREE); if (DsaPointerIsValid(pstate->batches)) { |