]> granicus.if.org Git - postgresql/commitdiff
Shut down Gather's children before shutting down Gather itself.
authorRobert Haas <rhaas@postgresql.org>
Wed, 22 Feb 2017 02:29:27 +0000 (07:59 +0530)
committerRobert Haas <rhaas@postgresql.org>
Wed, 22 Feb 2017 02:38:07 +0000 (08:08 +0530)
It turns out that the original shutdown order here does not work well.
Multiple people attempting to develop further parallel query patches
have discovered that they need to do cleanup before the DSM goes away,
and you can't do that if the parent node gets cleaned up first.

Patch by me, reviewed by KaiGai Kohei and Dilip Kumar.

Discussion: http://postgr.es/m/CA+TgmoY6bOc1YnhcAQnMfCBDbsJzROQ3sYxSAL-SYB5tMJcTKg@mail.gmail.com
Discussion: http://postgr.es/m/9A28C8860F777E439AA12E8AEA7694F8012AEB82@BPXM15GP.gisp.nec.co.jp
Discussion: http://postgr.es/m/CA+TgmoYuPOc=+xrG1v0fCsoLbKAab9F1ddOeaaiLMzKOiBar1Q@mail.gmail.com

src/backend/executor/execProcnode.c
src/backend/executor/nodeGather.c

index 0dd95c6d17438d0a0aa566a768fa009578f2abef..5ccc2e846dc981b4c9bd27e869e50de3db297e48 100644 (file)
@@ -815,6 +815,8 @@ ExecShutdownNode(PlanState *node)
        if (node == NULL)
                return false;
 
+       planstate_tree_walker(node, ExecShutdownNode, NULL);
+
        switch (nodeTag(node))
        {
                case T_GatherState:
@@ -824,5 +826,5 @@ ExecShutdownNode(PlanState *node)
                        break;
        }
 
-       return planstate_tree_walker(node, ExecShutdownNode, NULL);
+       return false;
 }
index a1a3561d48c101e80cd3fcbefc279f3d6e5a5ab1..32c97d390e0a3c46d25c263a04e5f78cc3249ab2 100644 (file)
@@ -229,10 +229,10 @@ ExecGather(GatherState *node)
 void
 ExecEndGather(GatherState *node)
 {
+       ExecEndNode(outerPlanState(node));              /* let children clean up first */
        ExecShutdownGather(node);
        ExecFreeExprContext(&node->ps);
        ExecClearTuple(node->ps.ps_ResultTupleSlot);
-       ExecEndNode(outerPlanState(node));
 }
 
 /*