This is an automated email from the ASF dual-hosted git repository. huajianlan pushed a commit to branch fe_local_shuffle in repository https://gitbox.apache.org/repos/asf/doris.git
commit 0dad38bee2ac5111e3a40141a303dcbe331c63e3 Author: 924060929 <[email protected]> AuthorDate: Wed Apr 1 12:23:14 2026 +0800 [fix](local shuffle) fix NLJ COREDUMP: don't insert build-side BROADCAST for serial NLJ When NLJ is serial (RIGHT_OUTER/FULL_OUTER etc.), the probe pipeline has 1 task. FE was inserting a BROADCAST local exchange on the build side for pooling scan, which inflated the build pipeline's num_tasks to _num_instances. This caused instance 1+ to create build tasks without corresponding probe tasks, leaving source_deps empty and crashing in set_ready_to_read(). BE-native avoids this via the num_tasks_of_parent()<=1 check in _add_local_exchange. Fix: set buildSideRequire to noRequire() for serial NLJ to match BE-native behavior. --- .../main/java/org/apache/doris/planner/NestedLoopJoinNode.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java index 8bcb837e6da..8a4cf731490 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java @@ -197,10 +197,14 @@ public class NestedLoopJoinNode extends JoinNodeBase { // RIGHT_OUTER/RIGHT_SEMI/RIGHT_ANTI/FULL_OUTER: probe side must be serial (1 task) // to avoid duplicate unmatched rows from build side. No exchange needed for probe. // BE: NestedLoopJoinProbeOperatorX returns NOOP for these join types. + // Build side: noRequire() regardless of pooling scan. The probe pipeline has 1 task + // (serial), so inserting BROADCAST on the build side would inflate build pipeline's + // num_tasks to _num_instances while probe stays at 1. This causes instance 1+ to + // create build tasks without corresponding probe tasks, leaving source_deps empty + // and crashing in set_ready_to_read(). BE-native avoids this via the + // num_tasks_of_parent()<=1 check in _add_local_exchange. probeSideRequire = LocalExchangeTypeRequire.noRequire(); - buildSideRequire = childUsePoolingScan - ? LocalExchangeTypeRequire.requireBroadcast() - : LocalExchangeTypeRequire.noRequire(); + buildSideRequire = LocalExchangeTypeRequire.noRequire(); outputType = LocalExchangeType.NOOP; } else if (childUsePoolingScan) { probeSideRequire = LocalExchangeTypeRequire.requireAdaptivePassthrough(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
