@@ -62,9 +62,6 @@ public class ExecutionNodesTask extends JobTask {
62
62
private static final ESLogger LOGGER = Loggers .getLogger (ExecutionNodesTask .class );
63
63
64
64
private final TransportJobAction transportJobAction ;
65
- private final List <List <ExecutionNode >> groupedExecutionNodes ;
66
- private final List <SettableFuture <TaskResult >> results ;
67
- private final boolean hasDirectResponse ;
68
65
private final ClusterService clusterService ;
69
66
private ContextPreparer contextPreparer ;
70
67
private final JobContextService jobContextService ;
@@ -73,15 +70,13 @@ public class ExecutionNodesTask extends JobTask {
73
70
private TransportCloseContextNodeAction transportCloseContextNodeAction ;
74
71
private final StreamerVisitor streamerVisitor ;
75
72
private final CircuitBreaker circuitBreaker ;
76
- private List <MergeNode > mergeNodes ;
73
+
74
+ private final List <List <ExecutionNode >> groupedExecutionNodes = new ArrayList <>();
75
+ private final List <MergeNode > finalMergeNodes = new ArrayList <>();
76
+ private final List <SettableFuture <TaskResult >> results = new ArrayList <>();
77
+ private boolean hasDirectResponse ;
77
78
private boolean rowCountResult = false ;
78
79
79
- /**
80
- * @param mergeNodes list of mergeNodes for the final merge operation on the handler.
81
- * This may be null in the constructor but then it must be set using the
82
- * {@link #mergeNodes(List)} setter before {@link #start()} is called.
83
- * Multiple merge nodes are only occurring on bulk operations.
84
- */
85
80
protected ExecutionNodesTask (UUID jobId ,
86
81
ClusterService clusterService ,
87
82
ContextPreparer contextPreparer ,
@@ -91,9 +86,7 @@ protected ExecutionNodesTask(UUID jobId,
91
86
TransportJobAction transportJobAction ,
92
87
TransportCloseContextNodeAction transportCloseContextNodeAction ,
93
88
StreamerVisitor streamerVisitor ,
94
- CircuitBreaker circuitBreaker ,
95
- @ Nullable List <MergeNode > mergeNodes ,
96
- List <List <ExecutionNode >> groupedExecutionNodes ) {
89
+ CircuitBreaker circuitBreaker ) {
97
90
super (jobId );
98
91
this .clusterService = clusterService ;
99
92
this .contextPreparer = contextPreparer ;
@@ -103,21 +96,31 @@ protected ExecutionNodesTask(UUID jobId,
103
96
this .transportCloseContextNodeAction = transportCloseContextNodeAction ;
104
97
this .streamerVisitor = streamerVisitor ;
105
98
this .circuitBreaker = circuitBreaker ;
106
- this .mergeNodes = mergeNodes ;
107
99
this .transportJobAction = transportJobAction ;
108
- this .groupedExecutionNodes = groupedExecutionNodes ;
109
- hasDirectResponse = hasDirectResponse (groupedExecutionNodes );
100
+ }
110
101
111
- List <SettableFuture <TaskResult >> results = new ArrayList <>(groupedExecutionNodes .size ());
112
- for (int i = 0 ; i < groupedExecutionNodes .size (); i ++) {
102
+
103
+ /**
104
+ * @param finalMergeNode a mergeNode for the final merge operation on the handler.
105
+ * Multiple merge nodes are only occurring on bulk operations.
106
+ */
107
+ public void addFinalMergeNode (MergeNode finalMergeNode ) {
108
+ finalMergeNode .jobId (jobId ());
109
+ finalMergeNodes .add (finalMergeNode );
110
+ }
111
+
112
+ public void addExecutionNode (int group , ExecutionNode executionNode ) {
113
+ executionNode .jobId (jobId ());
114
+ while (group >= groupedExecutionNodes .size ()) {
113
115
results .add (SettableFuture .<TaskResult >create ());
116
+ groupedExecutionNodes .add (new ArrayList <ExecutionNode >());
114
117
}
115
- this .results = results ;
116
- }
118
+ List <ExecutionNode > executionNodes = groupedExecutionNodes .get (group );
117
119
118
- public void mergeNodes (List <MergeNode > mergeNodes ) {
119
- assert this .mergeNodes == null : "can only overwrite mergeNodes if it was null" ;
120
- this .mergeNodes = mergeNodes ;
120
+ if (ExecutionNodes .hasDirectResponseDownstream (executionNode .downstreamNodes ())) {
121
+ hasDirectResponse = true ;
122
+ }
123
+ executionNodes .add (executionNode );
121
124
}
122
125
123
126
public void rowCountResult (boolean rowCountResult ) {
@@ -126,7 +129,7 @@ public void rowCountResult(boolean rowCountResult) {
126
129
127
130
@ Override
128
131
public void start () {
129
- assert mergeNodes != null : "mergeNodes must not be null " ;
132
+ assert finalMergeNodes . size () == groupedExecutionNodes . size () : "groupedExecutionNodes and finalMergeNodes sizes must match " ;
130
133
131
134
Map <String , Collection <ExecutionNode >> nodesByServer = ExecutionNodeGrouper .groupByServer (clusterService .state ().nodes ().localNodeId (), groupedExecutionNodes );
132
135
RowDownstream rowDownstream ;
@@ -135,21 +138,21 @@ public void start() {
135
138
} else {
136
139
rowDownstream = new QueryResultRowDownstream (results );
137
140
}
138
- Streamer <?>[] streamers = streamerVisitor .processExecutionNode (mergeNodes .get (0 )).inputStreamers ();
141
+ Streamer <?>[] streamers = streamerVisitor .processExecutionNode (finalMergeNodes .get (0 )).inputStreamers ();
139
142
List <PageDownstreamContext > pageDownstreamContexts = new ArrayList <>(groupedExecutionNodes .size ());
140
143
141
144
for (int i = 0 ; i < groupedExecutionNodes .size (); i ++) {
142
145
RamAccountingContext ramAccountingContext = RamAccountingContext .forExecutionNode (
143
- circuitBreaker , mergeNodes .get (i ));
146
+ circuitBreaker , finalMergeNodes .get (i ));
144
147
145
148
PageDownstreamContext pageDownstreamContext = createPageDownstreamContext (ramAccountingContext , streamers ,
146
- mergeNodes .get (i ), groupedExecutionNodes .get (i ), rowDownstream );
149
+ finalMergeNodes .get (i ), groupedExecutionNodes .get (i ), rowDownstream );
147
150
if (nodesByServer .size () == 0 ) {
148
151
pageDownstreamContext .finish ();
149
152
continue ;
150
153
}
151
154
if (!hasDirectResponse ) {
152
- createLocalContextAndStartOperation (pageDownstreamContext , nodesByServer , mergeNodes .get (i ).executionNodeId ());
155
+ createLocalContextAndStartOperation (pageDownstreamContext , nodesByServer , finalMergeNodes .get (i ).executionNodeId ());
153
156
}
154
157
pageDownstreamContexts .add (pageDownstreamContext );
155
158
}
@@ -262,6 +265,11 @@ public void onFailure(@Nonnull Throwable t) {
262
265
263
266
@ Override
264
267
public List <? extends ListenableFuture <TaskResult >> result () {
268
+ if (results .size () != groupedExecutionNodes .size ()) {
269
+ for (int i = 0 ; i < groupedExecutionNodes .size (); i ++) {
270
+ results .add (SettableFuture .<TaskResult >create ());
271
+ }
272
+ }
265
273
return results ;
266
274
}
267
275
0 commit comments