Skip to content

Commit 31eabad

Browse files
Misc speedups to query execution (#112836) (#117414)
* use array for compound listeners * Fix capturing lambda for timestamp update * misc cleanups
1 parent 61d0b40 commit 31eabad

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
@@ -739,14 +739,15 @@ public SearchExecutionContext newSearchExecutionContext(
739739
clusterService,
740740
expressionResolver
741741
);
742+
var mapperService = mapperService();
742743
return new SearchExecutionContext(
743744
shardId,
744745
shardRequestIndex,
745746
indexSettings,
746747
indexCache.bitsetFilterCache(),
747748
this::loadFielddata,
748-
mapperService(),
749-
mapperService().mappingLookup(),
749+
mapperService,
750+
mapperService.mappingLookup(),
750751
similarityService(),
751752
scriptService,
752753
parserConfiguration,
@@ -782,7 +783,7 @@ public QueryRewriteContext newQueryRewriteContext(
782783
expressionResolver
783784
);
784785
final MapperService mapperService = mapperService();
785-
final MappingLookup mappingLookup = mapperService().mappingLookup();
786+
final MappingLookup mappingLookup = mapperService.mappingLookup();
786787
return new QueryRewriteContext(
787788
parserConfiguration,
788789
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
@@ -3983,12 +3983,11 @@ && isSearchIdle()
39833983
engine.maybePruneDeletes(); // try to prune the deletes in the engine if we accumulated some
39843984
setRefreshPending(engine);
39853985
l.onResponse(false);
3986-
return;
39873986
} else {
39883987
logger.trace("scheduledRefresh: refresh with source [schedule]");
39893988
engine.maybeRefresh("schedule", l.map(Engine.RefreshResult::refreshed));
3990-
return;
39913989
}
3990+
return;
39923991
}
39933992
logger.trace("scheduledRefresh: no refresh needed");
39943993
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
@@ -108,11 +108,11 @@ default void validateReaderContext(ReaderContext readerContext, TransportRequest
108108
* A Composite listener that multiplexes calls to each of the listeners methods.
109109
*/
110110
final class CompositeListener implements SearchOperationListener {
111-
private final List<SearchOperationListener> listeners;
111+
private final SearchOperationListener[] listeners;
112112
private final Logger logger;
113113

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

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

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

480480
protected void putReaderContext(ReaderContext context) {
481-
final ReaderContext previous = activeReaders.put(context.id().getId(), context);
481+
final long id = context.id().getId();
482+
final ReaderContext previous = activeReaders.put(id, context);
482483
assert previous == null;
483484
// ensure that if we race against afterIndexRemoved, we remove the context from the active list.
484485
// this is important to ensure store can be cleaned up, in particular if the search is a scroll with a long timeout.
485486
final Index index = context.indexShard().shardId().getIndex();
486487
if (indicesService.hasIndex(index) == false) {
487-
removeReaderContext(context.id().getId());
488+
removeReaderContext(id);
488489
throw new IndexNotFoundException(index);
489490
}
490491
}
491492

492493
protected ReaderContext removeReaderContext(long id) {
493-
logger.trace("removing reader context [{}]", id);
494+
if (logger.isTraceEnabled()) {
495+
logger.trace("removing reader context [{}]", id);
496+
}
494497
return activeReaders.remove(id);
495498
}
496499

@@ -671,12 +674,10 @@ private void searchReady() {
671674

672675
private IndexShard getShard(ShardSearchRequest request) {
673676
final ShardSearchContextId contextId = request.readerId();
674-
if (contextId != null) {
675-
if (sessionId.equals(contextId.getSessionId())) {
676-
final ReaderContext readerContext = activeReaders.get(contextId.getId());
677-
if (readerContext != null) {
678-
return readerContext.indexShard();
679-
}
677+
if (contextId != null && sessionId.equals(contextId.getSessionId())) {
678+
final ReaderContext readerContext = activeReaders.get(contextId.getId());
679+
if (readerContext != null) {
680+
return readerContext.indexShard();
680681
}
681682
}
682683
return indicesService.indexServiceSafe(request.shardId().getIndex()).getShard(request.shardId().id());
@@ -990,13 +991,11 @@ final ReaderContext createOrGetReaderContext(ShardSearchRequest request) {
990991
}
991992
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, defaultKeepAlive);
992993
}
993-
} else {
994-
final long keepAliveInMillis = getKeepAlive(request);
995-
final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
996-
final IndexShard shard = indexService.getShard(request.shardId().id());
997-
final Engine.SearcherSupplier searcherSupplier = shard.acquireSearcherSupplier();
998-
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, keepAliveInMillis);
999994
}
995+
final long keepAliveInMillis = getKeepAlive(request);
996+
final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
997+
final IndexShard shard = indexService.getShard(request.shardId().id());
998+
return createAndPutReaderContext(request, indexService, shard, shard.acquireSearcherSupplier(), keepAliveInMillis);
1000999
}
10011000

10021001
final ReaderContext createAndPutReaderContext(
@@ -1009,19 +1008,15 @@ final ReaderContext createAndPutReaderContext(
10091008
ReaderContext readerContext = null;
10101009
Releasable decreaseScrollContexts = null;
10111010
try {
1011+
final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
10121012
if (request.scroll() != null) {
10131013
decreaseScrollContexts = openScrollContexts::decrementAndGet;
10141014
if (openScrollContexts.incrementAndGet() > maxOpenScrollContext) {
10151015
throw new TooManyScrollContextsException(maxOpenScrollContext, MAX_OPEN_SCROLL_CONTEXT.getKey());
10161016
}
1017-
}
1018-
final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
1019-
if (request.scroll() != null) {
10201017
readerContext = new LegacyReaderContext(id, indexService, shard, reader, request, keepAliveInMillis);
1021-
if (request.scroll() != null) {
1022-
readerContext.addOnClose(decreaseScrollContexts);
1023-
decreaseScrollContexts = null;
1024-
}
1018+
readerContext.addOnClose(decreaseScrollContexts);
1019+
decreaseScrollContexts = null;
10251020
} else {
10261021
readerContext = new ReaderContext(id, indexService, shard, reader, keepAliveInMillis, true);
10271022
}
@@ -1031,16 +1026,9 @@ final ReaderContext createAndPutReaderContext(
10311026
searchOperationListener.onNewReaderContext(finalReaderContext);
10321027
if (finalReaderContext.scrollContext() != null) {
10331028
searchOperationListener.onNewScrollContext(finalReaderContext);
1029+
readerContext.addOnClose(() -> searchOperationListener.onFreeScrollContext(finalReaderContext));
10341030
}
1035-
readerContext.addOnClose(() -> {
1036-
try {
1037-
if (finalReaderContext.scrollContext() != null) {
1038-
searchOperationListener.onFreeScrollContext(finalReaderContext);
1039-
}
1040-
} finally {
1041-
searchOperationListener.onFreeReaderContext(finalReaderContext);
1042-
}
1043-
});
1031+
readerContext.addOnClose(() -> searchOperationListener.onFreeReaderContext(finalReaderContext));
10441032
putReaderContext(finalReaderContext);
10451033
readerContext = null;
10461034
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
@@ -125,7 +125,7 @@ public Releasable markAsUsed(long keepAliveInMillis) {
125125
refCounted.incRef();
126126
tryUpdateKeepAlive(keepAliveInMillis);
127127
return Releasables.releaseOnce(() -> {
128-
this.lastAccessTime.updateAndGet(curr -> Math.max(curr, nowInMillis()));
128+
this.lastAccessTime.accumulateAndGet(nowInMillis(), Math::max);
129129
refCounted.decRef();
130130
});
131131
}

0 commit comments

Comments
 (0)