Adjust tuplestore.c not to allocate BufFiles in generation context
authorDavid Rowley <[email protected]>
Sat, 6 Jul 2024 05:40:05 +0000 (17:40 +1200)
committerDavid Rowley <[email protected]>
Sat, 6 Jul 2024 05:40:05 +0000 (17:40 +1200)
590b045c3 made it so tuplestore.c would store tuples inside a
generation.c memory context.  After fixing a bug report in 97651b013, it
seems that it's probably best not to allocate BufFile related
allocations in that context.  Let's keep it just for tuple data.

This adjusts the code to switch to the Tuplestorestate.context's parent,
which is the MemoryContext that tuplestore_begin_common() was called in.
It does not seem worth adding a new field in Tuplestorestate to store
this when we can access it by looking at the Tuplestorestate's
context's parent.

Discussion: https://postgr.es/m/CAApHDvqFt_CdJtSr+E9YLZb7jZAyRCy3hjQ+ktM+dcOFVq-xkg@mail.gmail.com

src/backend/utils/sort/tuplestore.c

index 00eeb135d3e58ee604aef35e8a9fbab5d6e76090..444c8e25c21fc11cc6ce2fa7976f01f1875b153a 100644 (file)
@@ -799,6 +799,7 @@ tuplestore_puttuple_common(Tuplestorestate *state, void *tuple)
    TSReadPointer *readptr;
    int         i;
    ResourceOwner oldowner;
+   MemoryContext oldcxt;
 
    state->tuples++;
 
@@ -850,8 +851,17 @@ tuplestore_puttuple_common(Tuplestorestate *state, void *tuple)
            oldowner = CurrentResourceOwner;
            CurrentResourceOwner = state->resowner;
 
+           /*
+            * We switch out of the state->context as this is a generation
+            * context, which isn't ideal for allocations relating to the
+            * BufFile.
+            */
+           oldcxt = MemoryContextSwitchTo(state->context->parent);
+
            state->myfile = BufFileCreateTemp(state->interXact);
 
+           MemoryContextSwitchTo(oldcxt);
+
            CurrentResourceOwner = oldowner;
 
            /*