Commit acf555bc authored by Robert Haas's avatar Robert Haas

Shut down Gather's children before shutting down Gather itself.

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
parent d912dd06
...@@ -815,6 +815,8 @@ ExecShutdownNode(PlanState *node) ...@@ -815,6 +815,8 @@ ExecShutdownNode(PlanState *node)
if (node == NULL) if (node == NULL)
return false; return false;
planstate_tree_walker(node, ExecShutdownNode, NULL);
switch (nodeTag(node)) switch (nodeTag(node))
{ {
case T_GatherState: case T_GatherState:
...@@ -824,5 +826,5 @@ ExecShutdownNode(PlanState *node) ...@@ -824,5 +826,5 @@ ExecShutdownNode(PlanState *node)
break; break;
} }
return planstate_tree_walker(node, ExecShutdownNode, NULL); return false;
} }
...@@ -229,10 +229,10 @@ ExecGather(GatherState *node) ...@@ -229,10 +229,10 @@ ExecGather(GatherState *node)
void void
ExecEndGather(GatherState *node) ExecEndGather(GatherState *node)
{ {
ExecEndNode(outerPlanState(node)); /* let children clean up first */
ExecShutdownGather(node); ExecShutdownGather(node);
ExecFreeExprContext(&node->ps); ExecFreeExprContext(&node->ps);
ExecClearTuple(node->ps.ps_ResultTupleSlot); ExecClearTuple(node->ps.ps_ResultTupleSlot);
ExecEndNode(outerPlanState(node));
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment