summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas2017-02-22 02:29:27 +0000
committerRobert Haas2017-02-22 02:38:07 +0000
commitacf555bc53acb589b5a2827e65d655fa8c9adee0 (patch)
tree78ba8654993bf1c9dc443b2b7e29c5ac421d1a1d
parentd912dd062b64287adcabab4180abafefd07cea14 (diff)
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/[email protected] Discussion: http://postgr.es/m/CA+TgmoYuPOc=+xrG1v0fCsoLbKAab9F1ddOeaaiLMzKOiBar1Q@mail.gmail.com
-rw-r--r--src/backend/executor/execProcnode.c4
-rw-r--r--src/backend/executor/nodeGather.c2
2 files changed, 4 insertions, 2 deletions
diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c
index 0dd95c6d17..5ccc2e846d 100644
--- a/src/backend/executor/execProcnode.c
+++ b/src/backend/executor/execProcnode.c
@@ -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;
}
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c
index a1a3561d48..32c97d390e 100644
--- a/src/backend/executor/nodeGather.c
+++ b/src/backend/executor/nodeGather.c
@@ -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));
}
/*