• Tom Lane's avatar
    Avoid memory leaks when a GatherMerge node is rescanned. · 2d44c58c
    Tom Lane authored
    Rescanning a GatherMerge led to leaking some memory in the executor's
    query-lifespan context, because most of the node's working data structures
    were simply abandoned and rebuilt from scratch.  In practice, this might
    never amount to much, given the cost of relaunching worker processes ---
    but it's still pretty messy, so let's fix it.
    
    We can rearrange things so that the tuple arrays are simply cleared and
    reused, and we don't need to rebuild the TupleTableSlots either, just
    clear them.  One small complication is that because we might get a
    different number of workers on each iteration, we can't keep the old
    convention that the leader's gm_slots[] entry is the last one; the leader
    might clobber a TupleTableSlot that we need for a worker in a future
    iteration.  Hence, adjust the logic so that the leader has slot 0 always,
    while the active workers have slots 1..n.
    
    Back-patch to v10 to keep all the existing versions of nodeGatherMerge.c
    in sync --- because of the renumbering of the slots, there would otherwise
    be a very large risk that any future backpatches in this module would
    introduce bugs.
    
    Discussion: https://postgr.es/m/8670.1504192177@sss.pgh.pa.us
    2d44c58c
nodeGatherMerge.c 21.9 KB