Skip to content

Commit 4482716

Browse files
authored
Use FrozenEngine for shared_cache searchable snapshot shards (#69277)
Searchable snapshots that cache data using the shared_cache are expect to only have a small footprint on a node. While shared_cache helps with reducing the disk footprint of such shards, there is still the challenge of memory overhead associated with each open Lucene index. FrozenEngine helps with that by only opening up the Lucene index on-demand, and is the better default for searchable snapshot shards in the frozen tier.
1 parent 2ee6dc3 commit 4482716

File tree

4 files changed

+43
-18
lines changed

4 files changed

+43
-18
lines changed

x-pack/plugin/frozen-indices/src/main/java/org/elasticsearch/index/engine/FrozenEngine.java renamed to x-pack/plugin/core/src/main/java/org/elasticsearch/index/engine/FrozenEngine.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader;
2121
import org.elasticsearch.common.settings.Setting;
2222
import org.elasticsearch.core.internal.io.IOUtils;
23+
import org.elasticsearch.index.seqno.SeqNoStats;
2324
import org.elasticsearch.index.shard.DocsStats;
2425
import org.elasticsearch.index.store.Store;
26+
import org.elasticsearch.index.translog.TranslogStats;
2527

2628
import java.io.IOException;
2729
import java.io.UncheckedIOException;
@@ -48,7 +50,12 @@ public final class FrozenEngine extends ReadOnlyEngine {
4850
private final ElasticsearchDirectoryReader canMatchReader;
4951

5052
public FrozenEngine(EngineConfig config, boolean requireCompleteHistory) {
51-
super(config, null, null, true, Function.identity(), requireCompleteHistory);
53+
this(config, null, null, true, Function.identity(), requireCompleteHistory);
54+
}
55+
56+
public FrozenEngine(EngineConfig config, SeqNoStats seqNoStats, TranslogStats translogStats, boolean obtainLock,
57+
Function<DirectoryReader, DirectoryReader> readerWrapperFunction, boolean requireCompleteHistory) {
58+
super(config, seqNoStats, translogStats, obtainLock, readerWrapperFunction, requireCompleteHistory);
5259

5360
boolean success = false;
5461
Directory directory = store.directory();

x-pack/plugin/frozen-indices/src/main/java/org/elasticsearch/index/engine/RewriteCachingDirectoryReader.java renamed to x-pack/plugin/core/src/main/java/org/elasticsearch/index/engine/RewriteCachingDirectoryReader.java

File renamed without changes.

x-pack/plugin/frozen-indices/src/main/java/org/elasticsearch/xpack/frozen/FrozenIndices.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,8 @@ public class FrozenIndices extends Plugin implements ActionPlugin, EnginePlugin
4242

4343
@Override
4444
public Optional<EngineFactory> getEngineFactory(IndexSettings indexSettings) {
45-
if (indexSettings.getValue(FrozenEngine.INDEX_FROZEN)) {
46-
final boolean requireCompleteHistory = isSearchableSnapshotStore(indexSettings.getSettings()) == false;
47-
return Optional.of(config -> new FrozenEngine(config, requireCompleteHistory));
45+
if (indexSettings.getValue(FrozenEngine.INDEX_FROZEN) && isSearchableSnapshotStore(indexSettings.getSettings()) == false) {
46+
return Optional.of(config -> new FrozenEngine(config, true));
4847
} else {
4948
return Optional.empty();
5049
}

x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/xpack/searchablesnapshots/SearchableSnapshots.java

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.elasticsearch.index.IndexSettings;
3939
import org.elasticsearch.index.engine.Engine;
4040
import org.elasticsearch.index.engine.EngineFactory;
41+
import org.elasticsearch.index.engine.FrozenEngine;
4142
import org.elasticsearch.index.engine.ReadOnlyEngine;
4243
import org.elasticsearch.index.store.SearchableSnapshotDirectory;
4344
import org.elasticsearch.index.store.Store;
@@ -388,20 +389,38 @@ public Map<String, DirectoryFactory> getDirectoryFactories() {
388389

389390
@Override
390391
public Optional<EngineFactory> getEngineFactory(IndexSettings indexSettings) {
391-
if (SearchableSnapshotsConstants.isSearchableSnapshotStore(indexSettings.getSettings())
392-
&& indexSettings.getSettings().getAsBoolean("index.frozen", false) == false) {
393-
return Optional.of(
394-
engineConfig -> new ReadOnlyEngine(
395-
engineConfig,
396-
null,
397-
new TranslogStats(),
398-
false,
399-
indexSettings.getValue(SourceOnlySnapshotRepository.SOURCE_ONLY)
400-
? SourceOnlySnapshotRepository.readerWrapper(engineConfig)
401-
: Function.identity(),
402-
false
403-
)
404-
);
392+
if (SearchableSnapshotsConstants.isSearchableSnapshotStore(indexSettings.getSettings())) {
393+
final Boolean frozen = indexSettings.getSettings().getAsBoolean("index.frozen", null);
394+
final boolean useFrozenEngine = SearchableSnapshots.SNAPSHOT_PARTIAL_SETTING.get(indexSettings.getSettings())
395+
&& (frozen == null || frozen.equals(Boolean.TRUE));
396+
397+
if (useFrozenEngine) {
398+
return Optional.of(
399+
engineConfig -> new FrozenEngine(
400+
engineConfig,
401+
null,
402+
new TranslogStats(),
403+
false,
404+
indexSettings.getValue(SourceOnlySnapshotRepository.SOURCE_ONLY)
405+
? SourceOnlySnapshotRepository.readerWrapper(engineConfig)
406+
: Function.identity(),
407+
false
408+
)
409+
);
410+
} else {
411+
return Optional.of(
412+
engineConfig -> new ReadOnlyEngine(
413+
engineConfig,
414+
null,
415+
new TranslogStats(),
416+
false,
417+
indexSettings.getValue(SourceOnlySnapshotRepository.SOURCE_ONLY)
418+
? SourceOnlySnapshotRepository.readerWrapper(engineConfig)
419+
: Function.identity(),
420+
false
421+
)
422+
);
423+
}
405424
}
406425
return Optional.empty();
407426
}

0 commit comments

Comments
 (0)