Skip to content

Commit 919fcfd

Browse files
committed
Respect default search timeout
The default search timeout is not respected because the timeout is unconditionally set from the query. This commit fixes this issue, and adds a test that the default search timeout is correctly attached to the search context. Relates #21599
1 parent de71d64 commit 919fcfd

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

core/src/main/java/org/elasticsearch/search/SearchService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import org.apache.lucene.util.IOUtils;
2626
import org.elasticsearch.ElasticsearchException;
2727
import org.elasticsearch.ExceptionsHelper;
28-
import org.elasticsearch.cluster.ClusterState;
2928
import org.elasticsearch.action.search.SearchTask;
29+
import org.elasticsearch.cluster.ClusterState;
3030
import org.elasticsearch.cluster.metadata.IndexMetaData;
3131
import org.elasticsearch.cluster.service.ClusterService;
3232
import org.elasticsearch.common.Nullable;
@@ -85,7 +85,6 @@
8585
import org.elasticsearch.search.sort.SortBuilder;
8686
import org.elasticsearch.search.suggest.Suggest;
8787
import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
88-
import org.elasticsearch.tasks.Task;
8988
import org.elasticsearch.threadpool.ThreadPool;
9089
import org.elasticsearch.threadpool.ThreadPool.Cancellable;
9190
import org.elasticsearch.threadpool.ThreadPool.Names;
@@ -722,7 +721,9 @@ private void parseSource(DefaultSearchContext context, SearchSourceBuilder sourc
722721
if (source.profile()) {
723722
context.setProfilers(new Profilers(context.searcher()));
724723
}
725-
context.timeout(source.timeout());
724+
if (source.timeout() != null) {
725+
context.timeout(source.timeout());
726+
}
726727
context.terminateAfter(source.terminateAfter());
727728
if (source.aggregations() != null) {
728729
try {

core/src/test/java/org/elasticsearch/search/SearchServiceTests.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import org.elasticsearch.common.Strings;
3232
import org.elasticsearch.common.io.stream.StreamInput;
3333
import org.elasticsearch.common.io.stream.StreamOutput;
34+
import org.elasticsearch.common.settings.Settings;
35+
import org.elasticsearch.common.unit.TimeValue;
3436
import org.elasticsearch.common.xcontent.XContentBuilder;
3537
import org.elasticsearch.index.IndexService;
3638
import org.elasticsearch.index.query.AbstractQueryBuilder;
@@ -44,6 +46,7 @@
4446
import org.elasticsearch.search.builder.SearchSourceBuilder;
4547
import org.elasticsearch.search.fetch.ShardFetchRequest;
4648
import org.elasticsearch.search.internal.AliasFilter;
49+
import org.elasticsearch.search.internal.SearchContext;
4750
import org.elasticsearch.search.internal.ShardSearchLocalRequest;
4851
import org.elasticsearch.search.query.QuerySearchResultProvider;
4952
import org.elasticsearch.test.ESSingleNodeTestCase;
@@ -59,6 +62,7 @@
5962
import static java.util.Collections.singletonList;
6063
import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE;
6164
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
65+
import static org.hamcrest.CoreMatchers.equalTo;
6266
import static org.hamcrest.Matchers.is;
6367
import static org.hamcrest.Matchers.notNullValue;
6468

@@ -74,6 +78,11 @@ protected Collection<Class<? extends Plugin>> getPlugins() {
7478
return pluginList(FailOnRewriteQueryPlugin.class);
7579
}
7680

81+
@Override
82+
protected Settings nodeSettings() {
83+
return Settings.builder().put("search.default_search_timeout", "5s").build();
84+
}
85+
7786
public void testClearOnClose() throws ExecutionException, InterruptedException {
7887
createIndex("index");
7988
client().prepareIndex("index", "type", "1").setSource("field", "value").setRefreshPolicy(IMMEDIATE).get();
@@ -197,6 +206,40 @@ public void onFailure(Exception e) {
197206
}
198207
}
199208

209+
public void testTimeout() throws IOException {
210+
createIndex("index");
211+
final SearchService service = getInstanceFromNode(SearchService.class);
212+
final IndicesService indicesService = getInstanceFromNode(IndicesService.class);
213+
final IndexService indexService = indicesService.indexServiceSafe(resolveIndex("index"));
214+
final IndexShard indexShard = indexService.getShard(0);
215+
final SearchContext contextWithDefaultTimeout = service.createContext(
216+
new ShardSearchLocalRequest(
217+
indexShard.shardId(),
218+
1,
219+
SearchType.DEFAULT,
220+
new SearchSourceBuilder(),
221+
new String[0],
222+
false,
223+
new AliasFilter(null, Strings.EMPTY_ARRAY)),
224+
null);
225+
// the search context should inherit the default timeout
226+
assertThat(contextWithDefaultTimeout.timeout(), equalTo(TimeValue.timeValueSeconds(5)));
227+
228+
final long seconds = randomIntBetween(6, 10);
229+
final SearchContext context = service.createContext(
230+
new ShardSearchLocalRequest(
231+
indexShard.shardId(),
232+
1,
233+
SearchType.DEFAULT,
234+
new SearchSourceBuilder().timeout(TimeValue.timeValueSeconds(seconds)),
235+
new String[0],
236+
false,
237+
new AliasFilter(null, Strings.EMPTY_ARRAY)),
238+
null);
239+
// the search context should inherit the query timeout
240+
assertThat(context.timeout(), equalTo(TimeValue.timeValueSeconds(seconds)));
241+
}
242+
200243
public static class FailOnRewriteQueryPlugin extends Plugin implements SearchPlugin {
201244
@Override
202245
public List<QuerySpec<?>> getQueries() {

0 commit comments

Comments
 (0)