14
14
import org .elasticsearch .TransportVersions ;
15
15
import org .elasticsearch .action .ActionListener ;
16
16
import org .elasticsearch .action .ActionListenerResponseHandler ;
17
+ import org .elasticsearch .action .ActionRunnable ;
17
18
import org .elasticsearch .action .ActionType ;
18
19
import org .elasticsearch .action .IndicesRequest ;
19
20
import org .elasticsearch .action .OriginalIndices ;
@@ -137,6 +138,7 @@ public class TransportSearchAction extends HandledTransportAction<SearchRequest,
137
138
);
138
139
139
140
private final ThreadPool threadPool ;
141
+ private final Executor searchCoordinationExecutor ;
140
142
private final ClusterService clusterService ;
141
143
private final TransportService transportService ;
142
144
private final SearchTransportService searchTransportService ;
@@ -169,6 +171,7 @@ public TransportSearchAction(
169
171
) {
170
172
super (TYPE .name (), transportService , actionFilters , SearchRequest ::new , EsExecutors .DIRECT_EXECUTOR_SERVICE );
171
173
this .threadPool = threadPool ;
174
+ this .searchCoordinationExecutor = threadPool .executor (ThreadPool .Names .SEARCH_COORDINATION );
172
175
this .circuitBreaker = circuitBreakerService .getBreaker (CircuitBreaker .REQUEST );
173
176
this .searchPhaseController = searchPhaseController ;
174
177
this .searchTransportService = searchTransportService ;
@@ -288,6 +291,11 @@ public long buildTookInMillis() {
288
291
289
292
@ Override
290
293
protected void doExecute (Task task , SearchRequest searchRequest , ActionListener <SearchResponse > listener ) {
294
+ // workaround for https://github.com/elastic/elasticsearch/issues/97916 - TODO remove this when we can
295
+ searchCoordinationExecutor .execute (ActionRunnable .wrap (listener , l -> doExecuteForked ((SearchTask ) task , searchRequest , l )));
296
+ }
297
+
298
+ private void doExecuteForked (SearchTask task , SearchRequest searchRequest , ActionListener <SearchResponse > listener ) {
291
299
ActionListener <SearchResponse > loggingAndMetrics = listener .delegateFailureAndWrap ((l , searchResponse ) -> {
292
300
searchResponseMetrics .recordTookTime (searchResponse .getTookInMillis ());
293
301
if (searchResponse .getShardFailures () != null && searchResponse .getShardFailures ().length > 0 ) {
@@ -306,7 +314,7 @@ protected void doExecute(Task task, SearchRequest searchRequest, ActionListener<
306
314
}
307
315
l .onResponse (searchResponse );
308
316
});
309
- executeRequest (( SearchTask ) task , searchRequest , loggingAndMetrics , AsyncSearchActionProvider ::new );
317
+ executeRequest (task , searchRequest , loggingAndMetrics , AsyncSearchActionProvider ::new );
310
318
}
311
319
312
320
void executeRequest (
0 commit comments