diff --git a/docs/changelog/128473.yaml b/docs/changelog/128473.yaml new file mode 100644 index 0000000000000..447ff998b1610 --- /dev/null +++ b/docs/changelog/128473.yaml @@ -0,0 +1,5 @@ +pr: 128473 +summary: Conditionally force sequential reading in `LuceneSyntheticSourceChangesSnapshot` +area: Logs +type: enhancement +issues: [] diff --git a/server/src/main/java/org/elasticsearch/index/engine/LuceneSyntheticSourceChangesSnapshot.java b/server/src/main/java/org/elasticsearch/index/engine/LuceneSyntheticSourceChangesSnapshot.java index 73a92869e31ba..5b1e31f46987a 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/LuceneSyntheticSourceChangesSnapshot.java +++ b/server/src/main/java/org/elasticsearch/index/engine/LuceneSyntheticSourceChangesSnapshot.java @@ -17,6 +17,7 @@ import org.apache.lucene.util.ArrayUtil; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexVersion; +import org.elasticsearch.index.codec.CodecService; import org.elasticsearch.index.fieldvisitor.LeafStoredFieldLoader; import org.elasticsearch.index.fieldvisitor.StoredFieldLoader; import org.elasticsearch.index.mapper.MapperService; @@ -85,7 +86,10 @@ public LuceneSyntheticSourceChangesSnapshot( this.maxMemorySizeInBytes = maxMemorySizeInBytes > 0 ? maxMemorySizeInBytes : 1; this.sourceLoader = mapperService.mappingLookup().newSourceLoader(null, SourceFieldMetrics.NOOP); Set storedFields = sourceLoader.requiredStoredFields(); - this.storedFieldLoader = StoredFieldLoader.create(false, storedFields); + String defaultCodec = EngineConfig.INDEX_CODEC_SETTING.get(mapperService.getIndexSettings().getSettings()); + // zstd best compression stores upto 2048 docs in a block, so it is likely that in this case docs are co-located in same block: + boolean forceSequentialReader = CodecService.BEST_COMPRESSION_CODEC.equals(defaultCodec); + this.storedFieldLoader = StoredFieldLoader.create(false, storedFields, forceSequentialReader); this.lastSeenSeqNo = fromSeqNo - 1; }