Skip to content

Commit 7f83eab

Browse files
Misc speedups to query execution (#112836)
* use array for compound listeners * Fix capturing lambda for timestamp update * misc cleanups
1 parent c2bd0de commit 7f83eab

File tree

5 files changed

+27
-39
lines changed

5 files changed

+27
-39
lines changed

server/src/main/java/org/elasticsearch/index/IndexService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -738,14 +738,15 @@ public SearchExecutionContext newSearchExecutionContext(
738738
clusterService,
739739
expressionResolver
740740
);
741+
var mapperService = mapperService();
741742
return new SearchExecutionContext(
742743
shardId,
743744
shardRequestIndex,
744745
indexSettings,
745746
indexCache.bitsetFilterCache(),
746747
this::loadFielddata,
747-
mapperService(),
748-
mapperService().mappingLookup(),
748+
mapperService,
749+
mapperService.mappingLookup(),
749750
similarityService(),
750751
scriptService,
751752
parserConfiguration,
@@ -781,7 +782,7 @@ public QueryRewriteContext newQueryRewriteContext(
781782
expressionResolver
782783
);
783784
final MapperService mapperService = mapperService();
784-
final MappingLookup mappingLookup = mapperService().mappingLookup();
785+
final MappingLookup mappingLookup = mapperService.mappingLookup();
785786
return new QueryRewriteContext(
786787
parserConfiguration,
787788
client,

server/src/main/java/org/elasticsearch/index/shard/IndexShard.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3982,12 +3982,11 @@ && isSearchIdle()
39823982
engine.maybePruneDeletes(); // try to prune the deletes in the engine if we accumulated some
39833983
setRefreshPending(engine);
39843984
l.onResponse(false);
3985-
return;
39863985
} else {
39873986
logger.trace("scheduledRefresh: refresh with source [schedule]");
39883987
engine.maybeRefresh("schedule", l.map(Engine.RefreshResult::refreshed));
3989-
return;
39903988
}
3989+
return;
39913990
}
39923991
logger.trace("scheduledRefresh: no refresh needed");
39933992
engine.maybePruneDeletes(); // try to prune the deletes in the engine if we accumulated some

server/src/main/java/org/elasticsearch/index/shard/SearchOperationListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ default void validateReaderContext(ReaderContext readerContext, TransportRequest
107107
* A Composite listener that multiplexes calls to each of the listeners methods.
108108
*/
109109
final class CompositeListener implements SearchOperationListener {
110-
private final List<SearchOperationListener> listeners;
110+
private final SearchOperationListener[] listeners;
111111
private final Logger logger;
112112

113113
CompositeListener(List<SearchOperationListener> listeners, Logger logger) {
114-
this.listeners = listeners;
114+
this.listeners = listeners.toArray(new SearchOperationListener[0]);
115115
this.logger = logger;
116116
}
117117

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

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -462,19 +462,22 @@ public void beforeIndexShardCreated(ShardRouting routing, Settings indexSettings
462462
}
463463

464464
protected void putReaderContext(ReaderContext context) {
465-
final ReaderContext previous = activeReaders.put(context.id().getId(), context);
465+
final long id = context.id().getId();
466+
final ReaderContext previous = activeReaders.put(id, context);
466467
assert previous == null;
467468
// ensure that if we race against afterIndexRemoved, we remove the context from the active list.
468469
// this is important to ensure store can be cleaned up, in particular if the search is a scroll with a long timeout.
469470
final Index index = context.indexShard().shardId().getIndex();
470471
if (indicesService.hasIndex(index) == false) {
471-
removeReaderContext(context.id().getId());
472+
removeReaderContext(id);
472473
throw new IndexNotFoundException(index);
473474
}
474475
}
475476

476477
protected ReaderContext removeReaderContext(long id) {
477-
logger.trace("removing reader context [{}]", id);
478+
if (logger.isTraceEnabled()) {
479+
logger.trace("removing reader context [{}]", id);
480+
}
478481
return activeReaders.remove(id);
479482
}
480483

@@ -651,12 +654,10 @@ private void searchReady() {
651654

652655
private IndexShard getShard(ShardSearchRequest request) {
653656
final ShardSearchContextId contextId = request.readerId();
654-
if (contextId != null) {
655-
if (sessionId.equals(contextId.getSessionId())) {
656-
final ReaderContext readerContext = activeReaders.get(contextId.getId());
657-
if (readerContext != null) {
658-
return readerContext.indexShard();
659-
}
657+
if (contextId != null && sessionId.equals(contextId.getSessionId())) {
658+
final ReaderContext readerContext = activeReaders.get(contextId.getId());
659+
if (readerContext != null) {
660+
return readerContext.indexShard();
660661
}
661662
}
662663
return indicesService.indexServiceSafe(request.shardId().getIndex()).getShard(request.shardId().id());
@@ -970,13 +971,11 @@ final ReaderContext createOrGetReaderContext(ShardSearchRequest request) {
970971
}
971972
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, defaultKeepAlive);
972973
}
973-
} else {
974-
final long keepAliveInMillis = getKeepAlive(request);
975-
final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
976-
final IndexShard shard = indexService.getShard(request.shardId().id());
977-
final Engine.SearcherSupplier searcherSupplier = shard.acquireSearcherSupplier();
978-
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, keepAliveInMillis);
979974
}
975+
final long keepAliveInMillis = getKeepAlive(request);
976+
final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
977+
final IndexShard shard = indexService.getShard(request.shardId().id());
978+
return createAndPutReaderContext(request, indexService, shard, shard.acquireSearcherSupplier(), keepAliveInMillis);
980979
}
981980

982981
final ReaderContext createAndPutReaderContext(
@@ -989,19 +988,15 @@ final ReaderContext createAndPutReaderContext(
989988
ReaderContext readerContext = null;
990989
Releasable decreaseScrollContexts = null;
991990
try {
991+
final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
992992
if (request.scroll() != null) {
993993
decreaseScrollContexts = openScrollContexts::decrementAndGet;
994994
if (openScrollContexts.incrementAndGet() > maxOpenScrollContext) {
995995
throw new TooManyScrollContextsException(maxOpenScrollContext, MAX_OPEN_SCROLL_CONTEXT.getKey());
996996
}
997-
}
998-
final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
999-
if (request.scroll() != null) {
1000997
readerContext = new LegacyReaderContext(id, indexService, shard, reader, request, keepAliveInMillis);
1001-
if (request.scroll() != null) {
1002-
readerContext.addOnClose(decreaseScrollContexts);
1003-
decreaseScrollContexts = null;
1004-
}
998+
readerContext.addOnClose(decreaseScrollContexts);
999+
decreaseScrollContexts = null;
10051000
} else {
10061001
readerContext = new ReaderContext(id, indexService, shard, reader, keepAliveInMillis, true);
10071002
}
@@ -1011,16 +1006,9 @@ final ReaderContext createAndPutReaderContext(
10111006
searchOperationListener.onNewReaderContext(finalReaderContext);
10121007
if (finalReaderContext.scrollContext() != null) {
10131008
searchOperationListener.onNewScrollContext(finalReaderContext);
1009+
readerContext.addOnClose(() -> searchOperationListener.onFreeScrollContext(finalReaderContext));
10141010
}
1015-
readerContext.addOnClose(() -> {
1016-
try {
1017-
if (finalReaderContext.scrollContext() != null) {
1018-
searchOperationListener.onFreeScrollContext(finalReaderContext);
1019-
}
1020-
} finally {
1021-
searchOperationListener.onFreeReaderContext(finalReaderContext);
1022-
}
1023-
});
1011+
readerContext.addOnClose(() -> searchOperationListener.onFreeReaderContext(finalReaderContext));
10241012
putReaderContext(finalReaderContext);
10251013
readerContext = null;
10261014
return finalReaderContext;

server/src/main/java/org/elasticsearch/search/internal/ReaderContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public Releasable markAsUsed(long keepAliveInMillis) {
124124
refCounted.incRef();
125125
tryUpdateKeepAlive(keepAliveInMillis);
126126
return Releasables.releaseOnce(() -> {
127-
this.lastAccessTime.updateAndGet(curr -> Math.max(curr, nowInMillis()));
127+
this.lastAccessTime.accumulateAndGet(nowInMillis(), Math::max);
128128
refCounted.decRef();
129129
});
130130
}

0 commit comments

Comments
 (0)