diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncAction.java index 5149dd9246335..cf258c91e3975 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncAction.java @@ -16,6 +16,7 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.search.SearchPhaseResult; +import org.elasticsearch.search.SearchService; import org.elasticsearch.search.SearchShardTarget; import org.elasticsearch.search.dfs.AggregatedDfs; import org.elasticsearch.search.internal.AliasFilter; @@ -40,6 +41,7 @@ class SearchQueryThenFetchAsyncAction extends AbstractSearchAsyncAction listener ) { ShardSearchRequest request = rewriteShardSearchRequest(super.buildShardSearchRequest(shardIt, listener.requestIndex)); - getSearchTransport().sendExecuteQuery(connection, request, getTask(), listener); + var searchTransport = getSearchTransport(); + var task = getTask(); + if (searchTransport.transportService().getLocalNodeConnection() == connection) { + searchService.executeQueryPhase(request, task, listener); + return; + } + searchTransport.sendExecuteQuery(connection, request, task, listener); } @Override diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchTransportService.java b/server/src/main/java/org/elasticsearch/action/search/SearchTransportService.java index 2041754bc2bcc..ccbd3b823da4b 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchTransportService.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchTransportService.java @@ -122,6 +122,10 @@ public SearchTransportService( this.responseWrapper = responseWrapper; } + public TransportService transportService() { + return transportService; + } + public void sendFreeContext( Transport.Connection connection, ShardSearchContextId contextId, diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 8e7333155d762..1c48688723624 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -1572,7 +1572,8 @@ public void runNewSearchPhase( clusterState, task, clusters, - client + client, + searchService ); } success = true; diff --git a/server/src/main/java/org/elasticsearch/search/SearchService.java b/server/src/main/java/org/elasticsearch/search/SearchService.java index 1156cd4b7bdf0..aac836272075b 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchService.java +++ b/server/src/main/java/org/elasticsearch/search/SearchService.java @@ -603,7 +603,13 @@ private void loadOrExecuteQueryPhase(final ShardSearchRequest request, final Sea public void executeQueryPhase(ShardSearchRequest request, CancellableTask task, ActionListener listener) { assert request.canReturnNullResponseIfMatchNoDocs() == false || request.numberOfShards() > 1 : "empty responses require more than one shard"; - final IndexShard shard = getShard(request); + final IndexShard shard; + try { + shard = getShard(request); + } catch (RuntimeException e) { + listener.onFailure(e); + return; + } rewriteAndFetchShardRequest( shard, request, diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java index 227239481a55a..bc7114109b73e 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java @@ -39,6 +39,7 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.InternalAggregationTestCase; import org.elasticsearch.transport.Transport; +import org.elasticsearch.transport.TransportService; import java.util.Collections; import java.util.List; @@ -51,6 +52,8 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.instanceOf; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class SearchQueryThenFetchAsyncActionTests extends ESTestCase { public void testBottomFieldSort() throws Exception { @@ -83,7 +86,11 @@ private void testCase(boolean withScroll, boolean withCollapse) throws Exception AtomicInteger numWithTopDocs = new AtomicInteger(); AtomicInteger successfulOps = new AtomicInteger(); AtomicBoolean canReturnNullResponse = new AtomicBoolean(false); - SearchTransportService searchTransportService = new SearchTransportService(null, null, null) { + TransportService transportService = mock(TransportService.class); + when(transportService.getLocalNodeConnection()).thenReturn( + new SearchAsyncActionTests.MockConnection(DiscoveryNodeUtils.create("local")) + ); + SearchTransportService searchTransportService = new SearchTransportService(transportService, null, null) { @Override public void sendExecuteQuery( Transport.Connection connection, @@ -201,6 +208,7 @@ public void sendExecuteQuery( new ClusterState.Builder(new ClusterName("test")).build(), task, SearchResponse.Clusters.EMPTY, + null, null ) { @Override diff --git a/x-pack/plugin/security/qa/security-trial/src/javaRestTest/java/org/elasticsearch/xpack/security/dlsfls/DlsRequestCacheIT.java b/x-pack/plugin/security/qa/security-trial/src/javaRestTest/java/org/elasticsearch/xpack/security/dlsfls/DlsRequestCacheIT.java index 743700af81fd9..b6b170e9c9d27 100644 --- a/x-pack/plugin/security/qa/security-trial/src/javaRestTest/java/org/elasticsearch/xpack/security/dlsfls/DlsRequestCacheIT.java +++ b/x-pack/plugin/security/qa/security-trial/src/javaRestTest/java/org/elasticsearch/xpack/security/dlsfls/DlsRequestCacheIT.java @@ -106,8 +106,7 @@ public void testRequestCacheDisabledForDlsTemplateRoleWithPainless() throws IOEx .addHeader("Authorization", UsernamePasswordToken.basicAuthHeaderValue(DLS_USER, DLS_USER_PASSWORD)) ); assertSearchResponse(client.performRequest(searchRequest), Set.of("1")); - // Cache should not be used since DLS query uses stored script - assertCacheState(0, 0); + assertCacheState(0, 1); } @SuppressWarnings("unchecked") diff --git a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DlsFlsRequestCacheTests.java b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DlsFlsRequestCacheTests.java index 82a10f21debfb..52f0371e8b276 100644 --- a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DlsFlsRequestCacheTests.java +++ b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/DlsFlsRequestCacheTests.java @@ -342,7 +342,7 @@ public void testRequestCacheWithTemplateRoleQuery() { // Since the DLS for the alias uses a stored script, this should cause the request cached to be disabled assertSearchResponse(client1.prepareSearch(DLS_TEMPLATE_ROLE_QUERY_ALIAS).setRequestCache(true), Set.of("1"), Set.of("username")); // No cache should be used - assertCacheState(DLS_TEMPLATE_ROLE_QUERY_INDEX, 2, 2); + assertCacheState(DLS_TEMPLATE_ROLE_QUERY_INDEX, 3, 2); } private void prepareIndices() {