Skip to content

Commit 166f943

Browse files
committed
Clarify the logic in a few places in the new balanced merge code.
In selectnewtape(), use 'nOutputTapes' rather than 'nOutputRuns' in the check for whether to start a new tape or to append a new run to an existing tape. Until 'maxTapes' is reached, nOutputTapes is always equal to nOutputRuns, so it doesn't change the logic, but it seems more logical to compare # of tapes with # of tapes. Also, currently maxTapes is never modified after the merging begins, but written this way, the code would still work if it was. (Although the nOutputRuns == nOutputTapes assertion would need to be removed and using nOutputRuns % nOutputTapes to distribute the runs evenly across the tapes wouldn't do a good job anymore). Similarly in mergeruns(), change to USEMEM(state->tape_buffer_mem) to account for the memory used for tape buffers. It's equal to availMem currently, but tape_buffer_mem is more direct and future-proof. For example, if we changed the logic to only allocate half of the remaining memory to tape buffers, USEMEM(state->tape_buffer_mem) would still be correct. Coverity complained about these. Hopefully this patch helps it to understand the logic better. Thanks to Tom Lane for initial analysis.
1 parent b4ada4e commit 166f943

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

src/backend/utils/sort/tuplesort.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2773,13 +2773,19 @@ inittapestate(Tuplesortstate *state, int maxTapes)
27732773
static void
27742774
selectnewtape(Tuplesortstate *state)
27752775
{
2776-
if (state->nOutputRuns < state->maxTapes)
2776+
/*
2777+
* At the beginning of each merge pass, nOutputTapes and nOutputRuns are
2778+
* both zero. On each call, we create a new output tape to hold the next
2779+
* run, until maxTapes is reached. After that, we assign new runs to the
2780+
* existing tapes in a round robin fashion.
2781+
*/
2782+
if (state->nOutputTapes < state->maxTapes)
27772783
{
27782784
/* Create a new tape to hold the next run */
27792785
Assert(state->outputTapes[state->nOutputRuns] == NULL);
27802786
Assert(state->nOutputRuns == state->nOutputTapes);
27812787
state->destTape = LogicalTapeCreate(state->tapeset);
2782-
state->outputTapes[state->nOutputRuns] = state->destTape;
2788+
state->outputTapes[state->nOutputTapes] = state->destTape;
27832789
state->nOutputTapes++;
27842790
state->nOutputRuns++;
27852791
}
@@ -2908,7 +2914,7 @@ mergeruns(Tuplesortstate *state)
29082914
* divide this memory between the input and output tapes in the pass.
29092915
*/
29102916
state->tape_buffer_mem = state->availMem;
2911-
USEMEM(state, state->availMem);
2917+
USEMEM(state, state->tape_buffer_mem);
29122918
#ifdef TRACE_SORT
29132919
if (trace_sort)
29142920
elog(LOG, "worker %d using %zu KB of memory for tape buffers",

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy