Skip to content

Commit c3b1fb3

Browse files
arteamomricohenn
authored andcommitted
Add a generic method for reading shard field stats from an Engine (elastic#125055)
Support reading shard field stats outside of `IndexShard` in read-only engines. See ES-11062
1 parent abad6c2 commit c3b1fb3

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

server/src/main/java/org/elasticsearch/index/engine/Engine.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.elasticsearch.core.TimeValue;
6161
import org.elasticsearch.index.IndexVersion;
6262
import org.elasticsearch.index.VersionType;
63+
import org.elasticsearch.index.codec.FieldInfosWithUsages;
6364
import org.elasticsearch.index.mapper.DocumentParser;
6465
import org.elasticsearch.index.mapper.FieldNamesFieldMapper;
6566
import org.elasticsearch.index.mapper.LuceneDocument;
@@ -76,6 +77,7 @@
7677
import org.elasticsearch.index.shard.DenseVectorStats;
7778
import org.elasticsearch.index.shard.DocsStats;
7879
import org.elasticsearch.index.shard.IndexShard;
80+
import org.elasticsearch.index.shard.ShardFieldStats;
7981
import org.elasticsearch.index.shard.ShardId;
8082
import org.elasticsearch.index.shard.ShardLongFieldRange;
8183
import org.elasticsearch.index.shard.SparseVectorStats;
@@ -243,6 +245,34 @@ protected final DocsStats docsStats(IndexReader indexReader) {
243245
return new DocsStats(numDocs, numDeletedDocs, sizeInBytes);
244246
}
245247

248+
/**
249+
* @throws AlreadyClosedException if the shard is closed
250+
*/
251+
public ShardFieldStats shardFieldStats() {
252+
try (var searcher = acquireSearcher("shard_field_stats", Engine.SearcherScope.INTERNAL)) {
253+
return shardFieldStats(searcher.getLeafContexts());
254+
}
255+
}
256+
257+
protected static ShardFieldStats shardFieldStats(List<LeafReaderContext> leaves) {
258+
int numSegments = 0;
259+
int totalFields = 0;
260+
long usages = 0;
261+
for (LeafReaderContext leaf : leaves) {
262+
numSegments++;
263+
var fieldInfos = leaf.reader().getFieldInfos();
264+
totalFields += fieldInfos.size();
265+
if (fieldInfos instanceof FieldInfosWithUsages ft) {
266+
if (usages != -1) {
267+
usages += ft.getTotalUsages();
268+
}
269+
} else {
270+
usages = -1;
271+
}
272+
}
273+
return new ShardFieldStats(numSegments, totalFields, usages);
274+
}
275+
246276
/**
247277
* Returns the {@link DenseVectorStats} for this engine
248278
*/

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

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.apache.lucene.index.FilterDirectoryReader;
1919
import org.apache.lucene.index.IndexCommit;
2020
import org.apache.lucene.index.LeafReader;
21-
import org.apache.lucene.index.LeafReaderContext;
2221
import org.apache.lucene.index.SegmentInfos;
2322
import org.apache.lucene.search.QueryCachingPolicy;
2423
import org.apache.lucene.search.ReferenceManager;
@@ -84,7 +83,6 @@
8483
import org.elasticsearch.index.cache.query.TrivialQueryCachingPolicy;
8584
import org.elasticsearch.index.cache.request.ShardRequestCache;
8685
import org.elasticsearch.index.codec.CodecService;
87-
import org.elasticsearch.index.codec.FieldInfosWithUsages;
8886
import org.elasticsearch.index.engine.CommitStats;
8987
import org.elasticsearch.index.engine.Engine;
9088
import org.elasticsearch.index.engine.Engine.GetResult;
@@ -4160,26 +4158,9 @@ public void beforeRefresh() {
41604158
@Override
41614159
public void afterRefresh(boolean didRefresh) {
41624160
if (shardFieldStats == null || didRefresh) {
4163-
try (var searcher = getEngine().acquireSearcher("shard_field_stats", Engine.SearcherScope.INTERNAL)) {
4164-
int numSegments = 0;
4165-
int totalFields = 0;
4166-
long usages = 0;
4167-
for (LeafReaderContext leaf : searcher.getLeafContexts()) {
4168-
numSegments++;
4169-
var fieldInfos = leaf.reader().getFieldInfos();
4170-
totalFields += fieldInfos.size();
4171-
if (fieldInfos instanceof FieldInfosWithUsages ft) {
4172-
if (usages != -1) {
4173-
usages += ft.getTotalUsages();
4174-
}
4175-
} else {
4176-
usages = -1;
4177-
}
4178-
}
4179-
shardFieldStats = new ShardFieldStats(numSegments, totalFields, usages);
4180-
} catch (AlreadyClosedException ignored) {
4181-
4182-
}
4161+
try {
4162+
shardFieldStats = getEngine().shardFieldStats();
4163+
} catch (AlreadyClosedException ignored) {}
41834164
}
41844165
}
41854166
}

0 commit comments

Comments
 (0)