Skip to content

Commit 3292e00

Browse files
committed
Add totalPostingBytes to ShardFieldStats
1 parent 0d8e02f commit 3292e00

File tree

4 files changed

+31
-7
lines changed

4 files changed

+31
-7
lines changed

server/src/main/java/org/elasticsearch/common/lucene/Lucene.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -739,15 +739,26 @@ public static Version parseVersionLenient(String toParse, Version defaultValue)
739739
* If no SegmentReader can be extracted an {@link IllegalStateException} is thrown.
740740
*/
741741
public static SegmentReader segmentReader(LeafReader reader) {
742+
SegmentReader segmentReader = tryUnwrapSegmentReader(reader);
743+
if (segmentReader == null) {
744+
throw new IllegalStateException("Can not extract segment reader from given index reader [" + reader + "]");
745+
}
746+
return segmentReader;
747+
}
748+
749+
/**
750+
* Tries to extract a segment reader from the given index reader. Unlike {@link #segmentReader(LeafReader)} this method returns
751+
* null if no SegmentReader can be unwrapped instead of throwing an exception.
752+
*/
753+
public static SegmentReader tryUnwrapSegmentReader(LeafReader reader) {
742754
if (reader instanceof SegmentReader) {
743755
return (SegmentReader) reader;
744756
} else if (reader instanceof final FilterLeafReader fReader) {
745-
return segmentReader(FilterLeafReader.unwrap(fReader));
757+
return tryUnwrapSegmentReader(FilterLeafReader.unwrap(fReader));
746758
} else if (reader instanceof final FilterCodecReader fReader) {
747-
return segmentReader(FilterCodecReader.unwrap(fReader));
759+
return tryUnwrapSegmentReader(FilterCodecReader.unwrap(fReader));
748760
}
749-
// hard fail - we can't get a SegmentReader
750-
throw new IllegalStateException("Can not extract segment reader from given index reader [" + reader + "]");
761+
return null;
751762
}
752763

753764
@SuppressForbidden(reason = "Version#parseLeniently() used in a central place")

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import org.elasticsearch.index.IndexVersion;
6363
import org.elasticsearch.index.VersionType;
6464
import org.elasticsearch.index.codec.FieldInfosWithUsages;
65+
import org.elasticsearch.index.codec.TrackingPostingsInMemoryBytesCodec;
6566
import org.elasticsearch.index.codec.vectors.reflect.OffHeapByteSizeUtils;
6667
import org.elasticsearch.index.mapper.DocumentParser;
6768
import org.elasticsearch.index.mapper.LuceneDocument;
@@ -275,6 +276,7 @@ protected static ShardFieldStats shardFieldStats(List<LeafReaderContext> leaves)
275276
int numSegments = 0;
276277
int totalFields = 0;
277278
long usages = 0;
279+
long totalPostingBytes = 0;
278280
for (LeafReaderContext leaf : leaves) {
279281
numSegments++;
280282
var fieldInfos = leaf.reader().getFieldInfos();
@@ -286,8 +288,17 @@ protected static ShardFieldStats shardFieldStats(List<LeafReaderContext> leaves)
286288
} else {
287289
usages = -1;
288290
}
291+
SegmentReader segmentReader = Lucene.tryUnwrapSegmentReader(leaf.reader());
292+
if (segmentReader != null) {
293+
String postingBytes = segmentReader.getSegmentInfo().info.getAttribute(
294+
TrackingPostingsInMemoryBytesCodec.IN_MEMORY_POSTINGS_BYTES_KEY
295+
);
296+
if (postingBytes != null) {
297+
totalPostingBytes += Long.parseLong(postingBytes);
298+
}
299+
}
289300
}
290-
return new ShardFieldStats(numSegments, totalFields, usages);
301+
return new ShardFieldStats(numSegments, totalFields, usages, totalPostingBytes);
291302
}
292303

293304
/**

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.elasticsearch.index.IndexVersions;
8080
import org.elasticsearch.index.VersionType;
8181
import org.elasticsearch.index.cache.query.TrivialQueryCachingPolicy;
82+
import org.elasticsearch.index.codec.TrackingPostingsInMemoryBytesCodec;
8283
import org.elasticsearch.index.mapper.DocumentParser;
8384
import org.elasticsearch.index.mapper.IdFieldMapper;
8485
import org.elasticsearch.index.mapper.LuceneDocument;
@@ -2777,7 +2778,7 @@ private IndexWriterConfig getIndexWriterConfig() {
27772778
iwc.setMaxFullFlushMergeWaitMillis(-1);
27782779
iwc.setSimilarity(engineConfig.getSimilarity());
27792780
iwc.setRAMBufferSizeMB(engineConfig.getIndexingBufferSize().getMbFrac());
2780-
iwc.setCodec(engineConfig.getCodec());
2781+
iwc.setCodec(new TrackingPostingsInMemoryBytesCodec(engineConfig.getCodec()));
27812782
boolean useCompoundFile = engineConfig.getUseCompoundFile();
27822783
iwc.setUseCompoundFile(useCompoundFile);
27832784
if (useCompoundFile == false) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
* @param totalFields the total number of fields across the segments
1818
* @param fieldUsages the number of usages for segment-level fields (e.g., doc_values, postings, norms, points)
1919
* -1 if unavailable
20+
* @param postingsInMemoryBytes the total bytes in memory used for postings across all fields
2021
*/
21-
public record ShardFieldStats(int numSegments, int totalFields, long fieldUsages) {
22+
public record ShardFieldStats(int numSegments, int totalFields, long fieldUsages, long postingsInMemoryBytes) {
2223

2324
}

0 commit comments

Comments
 (0)