diff --git a/server/src/main/java/org/elasticsearch/index/engine/Engine.java b/server/src/main/java/org/elasticsearch/index/engine/Engine.java index 3298d8757ca92..8b0e84105055c 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/Engine.java +++ b/server/src/main/java/org/elasticsearch/index/engine/Engine.java @@ -60,6 +60,7 @@ import org.elasticsearch.core.TimeValue; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.VersionType; +import org.elasticsearch.index.codec.FieldInfosWithUsages; import org.elasticsearch.index.mapper.DocumentParser; import org.elasticsearch.index.mapper.FieldNamesFieldMapper; import org.elasticsearch.index.mapper.LuceneDocument; @@ -76,6 +77,7 @@ import org.elasticsearch.index.shard.DenseVectorStats; import org.elasticsearch.index.shard.DocsStats; import org.elasticsearch.index.shard.IndexShard; +import org.elasticsearch.index.shard.ShardFieldStats; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.ShardLongFieldRange; import org.elasticsearch.index.shard.SparseVectorStats; @@ -243,6 +245,34 @@ protected final DocsStats docsStats(IndexReader indexReader) { return new DocsStats(numDocs, numDeletedDocs, sizeInBytes); } + /** + * @throws AlreadyClosedException if the shard is closed + */ + public ShardFieldStats shardFieldStats() { + try (var searcher = acquireSearcher("shard_field_stats", Engine.SearcherScope.INTERNAL)) { + return shardFieldStats(searcher.getLeafContexts()); + } + } + + protected static ShardFieldStats shardFieldStats(List leaves) { + int numSegments = 0; + int totalFields = 0; + long usages = 0; + for (LeafReaderContext leaf : leaves) { + numSegments++; + var fieldInfos = leaf.reader().getFieldInfos(); + totalFields += fieldInfos.size(); + if (fieldInfos instanceof FieldInfosWithUsages ft) { + if (usages != -1) { + usages += ft.getTotalUsages(); + } + } else { + usages = -1; + } + } + return new ShardFieldStats(numSegments, totalFields, usages); + } + /** * Returns the {@link DenseVectorStats} for this engine */ diff --git a/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java index 1cfc7fab9fc83..bb091fa0c409b 100644 --- a/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -18,7 +18,6 @@ import org.apache.lucene.index.FilterDirectoryReader; import org.apache.lucene.index.IndexCommit; import org.apache.lucene.index.LeafReader; -import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.SegmentInfos; import org.apache.lucene.search.QueryCachingPolicy; import org.apache.lucene.search.ReferenceManager; @@ -84,7 +83,6 @@ import org.elasticsearch.index.cache.query.TrivialQueryCachingPolicy; import org.elasticsearch.index.cache.request.ShardRequestCache; import org.elasticsearch.index.codec.CodecService; -import org.elasticsearch.index.codec.FieldInfosWithUsages; import org.elasticsearch.index.engine.CommitStats; import org.elasticsearch.index.engine.Engine; import org.elasticsearch.index.engine.Engine.GetResult; @@ -4160,26 +4158,9 @@ public void beforeRefresh() { @Override public void afterRefresh(boolean didRefresh) { if (shardFieldStats == null || didRefresh) { - try (var searcher = getEngine().acquireSearcher("shard_field_stats", Engine.SearcherScope.INTERNAL)) { - int numSegments = 0; - int totalFields = 0; - long usages = 0; - for (LeafReaderContext leaf : searcher.getLeafContexts()) { - numSegments++; - var fieldInfos = leaf.reader().getFieldInfos(); - totalFields += fieldInfos.size(); - if (fieldInfos instanceof FieldInfosWithUsages ft) { - if (usages != -1) { - usages += ft.getTotalUsages(); - } - } else { - usages = -1; - } - } - shardFieldStats = new ShardFieldStats(numSegments, totalFields, usages); - } catch (AlreadyClosedException ignored) { - - } + try { + shardFieldStats = getEngine().shardFieldStats(); + } catch (AlreadyClosedException ignored) {} } } }