Skip to content

Commit 0695590

Browse files
Merge branch 'main' of github.com:elastic/elasticsearch into sa-filter-reserved-roles-from-get-roles-api
2 parents c6c7b51 + 66d18d0 commit 0695590

File tree

9 files changed

+48
-44
lines changed

9 files changed

+48
-44
lines changed

docs/changelog/122575.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 122575
2+
summary: Return an empty suggestion when suggest phase times out
3+
area: Suggesters
4+
type: bug
5+
issues:
6+
- 122548

muted-tests.yml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,6 @@ tests:
7272
- class: org.elasticsearch.action.search.SearchPhaseControllerTests
7373
method: testProgressListener
7474
issue: https://github.com/elastic/elasticsearch/issues/116149
75-
- class: org.elasticsearch.search.basic.SearchWithRandomDisconnectsIT
76-
method: testSearchWithRandomDisconnects
77-
issue: https://github.com/elastic/elasticsearch/issues/116175
7875
- class: org.elasticsearch.xpack.deprecation.DeprecationHttpIT
7976
method: testDeprecatedSettingsReturnWarnings
8077
issue: https://github.com/elastic/elasticsearch/issues/108628
@@ -201,8 +198,6 @@ tests:
201198
- class: org.elasticsearch.xpack.test.rest.XPackRestIT
202199
method: test {p0=ml/3rd_party_deployment/Test start deployment fails while model download in progress}
203200
issue: https://github.com/elastic/elasticsearch/issues/120810
204-
- class: org.elasticsearch.indices.mapping.UpdateMappingIntegrationIT
205-
issue: https://github.com/elastic/elasticsearch/issues/116126
206201
- class: org.elasticsearch.xpack.security.authc.service.ServiceAccountIT
207202
method: testAuthenticateShouldNotFallThroughInCaseOfFailure
208203
issue: https://github.com/elastic/elasticsearch/issues/120902
@@ -376,9 +371,6 @@ tests:
376371
issue: https://github.com/elastic/elasticsearch/issues/122378
377372
- class: org.elasticsearch.telemetry.apm.ApmAgentSettingsIT
378373
issue: https://github.com/elastic/elasticsearch/issues/122546
379-
- class: org.elasticsearch.search.SearchTimeoutIT
380-
method: testSuggestTimeoutWithPartialResults
381-
issue: https://github.com/elastic/elasticsearch/issues/122548
382374
- class: org.elasticsearch.xpack.inference.mapper.SemanticInferenceMetadataFieldsRecoveryTests
383375
method: testSnapshotRecovery {p0=false p1=false}
384376
issue: https://github.com/elastic/elasticsearch/issues/122549

server/src/internalClusterTest/java/org/elasticsearch/search/SearchTimeoutIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,7 @@ protected TermSuggestion innerExecute(
484484
CharsRefBuilder spare
485485
) {
486486
contextIndexSearcher.throwTimeExceededException();
487-
assert false;
488-
return new TermSuggestion(name, suggestion.getSize(), SortBy.SCORE);
487+
throw new AssertionError("should have thrown TimeExceededException");
489488
}
490489

491490
@Override

server/src/internalClusterTest/java/org/elasticsearch/search/basic/SearchWithRandomDisconnectsIT.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.action.search.SearchResponse;
1515
import org.elasticsearch.action.support.PlainActionFuture;
1616
import org.elasticsearch.common.settings.Settings;
17+
import org.elasticsearch.common.util.concurrent.ListenableFuture;
1718
import org.elasticsearch.discovery.AbstractDisruptionTestCase;
1819
import org.elasticsearch.index.IndexModule;
1920
import org.elasticsearch.index.IndexSettings;
@@ -67,11 +68,15 @@ public void onFailure(Exception e) {
6768
}
6869

6970
private void runMoreSearches() {
70-
if (done.get() == false) {
71-
prepareRandomSearch().execute(this);
72-
} else {
73-
finishFuture.onResponse(null);
71+
while (done.get() == false) {
72+
final ListenableFuture<SearchResponse> f = new ListenableFuture<>();
73+
prepareRandomSearch().execute(f);
74+
if (f.isDone() == false) {
75+
f.addListener(this);
76+
return;
77+
}
7478
}
79+
finishFuture.onResponse(null);
7580
}
7681
});
7782
}

server/src/main/java/org/elasticsearch/search/query/QueryPhase.java

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,7 @@ static void executeRank(SearchContext searchContext) throws QueryPhaseExecutionE
126126

127127
static void executeQuery(SearchContext searchContext) throws QueryPhaseExecutionException {
128128
if (searchContext.hasOnlySuggest()) {
129-
try {
130-
SuggestPhase.execute(searchContext);
131-
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
132-
SearchTimeoutException.handleTimeout(
133-
searchContext.request().allowPartialSearchResults(),
134-
searchContext.shardTarget(),
135-
searchContext.queryResult()
136-
);
137-
}
129+
SuggestPhase.execute(searchContext);
138130
searchContext.queryResult().topDocs(new TopDocsAndMaxScore(Lucene.EMPTY_TOP_DOCS, Float.NaN), new DocValueFormat[0]);
139131
return;
140132
}
@@ -150,18 +142,10 @@ static void executeQuery(SearchContext searchContext) throws QueryPhaseExecution
150142

151143
addCollectorsAndSearch(searchContext);
152144

153-
try {
154-
RescorePhase.execute(searchContext);
155-
SuggestPhase.execute(searchContext);
156-
if (searchContext.getProfilers() != null) {
157-
searchContext.queryResult().profileResults(searchContext.getProfilers().buildQueryPhaseResults());
158-
}
159-
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
160-
SearchTimeoutException.handleTimeout(
161-
searchContext.request().allowPartialSearchResults(),
162-
searchContext.shardTarget(),
163-
searchContext.queryResult()
164-
);
145+
RescorePhase.execute(searchContext);
146+
SuggestPhase.execute(searchContext);
147+
if (searchContext.getProfilers() != null) {
148+
searchContext.queryResult().profileResults(searchContext.getProfilers().buildQueryPhaseResults());
165149
}
166150
}
167151

server/src/main/java/org/elasticsearch/search/rescore/RescorePhase.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore;
1919
import org.elasticsearch.common.util.Maps;
2020
import org.elasticsearch.lucene.grouping.TopFieldGroups;
21+
import org.elasticsearch.search.internal.ContextIndexSearcher;
2122
import org.elasticsearch.search.internal.SearchContext;
23+
import org.elasticsearch.search.query.SearchTimeoutException;
2224
import org.elasticsearch.search.sort.ShardDocSortField;
2325
import org.elasticsearch.search.sort.SortAndFormats;
2426

@@ -84,6 +86,13 @@ public static void execute(SearchContext context) {
8486
.topDocs(new TopDocsAndMaxScore(topDocs, topDocs.scoreDocs[0].score), context.queryResult().sortValueFormats());
8587
} catch (IOException e) {
8688
throw new ElasticsearchException("Rescore Phase Failed", e);
89+
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
90+
SearchTimeoutException.handleTimeout(
91+
context.request().allowPartialSearchResults(),
92+
context.shardTarget(),
93+
context.queryResult()
94+
);
95+
// if the rescore phase times out and partial results are allowed, the returned top docs from this shard won't be rescored
8796
}
8897
}
8998

server/src/main/java/org/elasticsearch/search/suggest/SuggestPhase.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010

1111
import org.apache.lucene.util.CharsRefBuilder;
1212
import org.elasticsearch.ElasticsearchException;
13+
import org.elasticsearch.search.internal.ContextIndexSearcher;
1314
import org.elasticsearch.search.internal.SearchContext;
15+
import org.elasticsearch.search.query.SearchTimeoutException;
1416
import org.elasticsearch.search.suggest.Suggest.Suggestion;
1517
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry;
1618
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option;
@@ -40,12 +42,17 @@ public static void execute(SearchContext context) {
4042
for (Map.Entry<String, SuggestionSearchContext.SuggestionContext> entry : suggest.suggestions().entrySet()) {
4143
SuggestionSearchContext.SuggestionContext suggestion = entry.getValue();
4244
Suggester<SuggestionContext> suggester = suggestion.getSuggester();
43-
Suggestion<? extends Entry<? extends Option>> result = suggester.execute(
44-
entry.getKey(),
45-
suggestion,
46-
context.searcher(),
47-
spare
48-
);
45+
Suggestion<? extends Entry<? extends Option>> result;
46+
try {
47+
result = suggester.execute(entry.getKey(), suggestion, context.searcher(), spare);
48+
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
49+
SearchTimeoutException.handleTimeout(
50+
context.request().allowPartialSearchResults(),
51+
context.shardTarget(),
52+
context.queryResult()
53+
);
54+
result = suggester.emptySuggestion(entry.getKey(), suggestion, spare);
55+
}
4956
if (result != null) {
5057
assert entry.getKey().equals(result.name);
5158
suggestions.add(result);

server/src/test/java/org/elasticsearch/search/query/QueryPhaseTimeoutTests.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ public void testSuggestOnlyWithTimeout() throws Exception {
297297
assertTrue(context.hasOnlySuggest());
298298
QueryPhase.execute(context);
299299
assertTrue(context.queryResult().searchTimedOut());
300-
assertNull(context.queryResult().suggest());
300+
assertEquals(1, context.queryResult().suggest().size());
301+
assertEquals(0, context.queryResult().suggest().getSuggestion("suggestion").getEntries().size());
301302
assertNotNull(context.queryResult().topDocs());
302303
assertEquals(0, context.queryResult().topDocs().topDocs.totalHits.value());
303304
}
@@ -311,7 +312,8 @@ public void testSuggestAndQueryWithSuggestTimeout() throws Exception {
311312
QueryPhase.execute(context);
312313
assertThat(context.queryResult().topDocs().topDocs.totalHits.value(), Matchers.greaterThan(0L));
313314
assertTrue(context.queryResult().searchTimedOut());
314-
assertNull(context.queryResult().suggest());
315+
assertEquals(1, context.queryResult().suggest().size());
316+
assertEquals(0, context.queryResult().suggest().getSuggestion("suggestion").getEntries().size());
315317
}
316318
}
317319

test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1783,7 +1783,7 @@ public void indexRandom(boolean forceRefresh, boolean dummyDocuments, boolean ma
17831783
}
17841784
}
17851785
for (CountDownLatch operation : inFlightAsyncOperations) {
1786-
safeAwait(operation);
1786+
safeAwait(operation, TEST_REQUEST_TIMEOUT);
17871787
}
17881788
if (bogusIds.isEmpty() == false) {
17891789
// delete the bogus types again - it might trigger merges or at least holes in the segments and enforces deleted docs!

0 commit comments

Comments
 (0)