Skip to content

Commit a388cf7

Browse files
authored
Account soft-deletes in FrozenEngine (#51362)
Currently, we do not exclude soft-deleted documents when opening index reader in the FrozenEngine. Relates #50775 Backport of #51192
1 parent 4a5cdf5 commit a388cf7

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/index/engine/FrozenEngine.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.lucene.index.NumericDocValues;
2121
import org.apache.lucene.index.PointValues;
2222
import org.apache.lucene.index.SegmentCommitInfo;
23+
import org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper;
2324
import org.apache.lucene.index.SortedDocValues;
2425
import org.apache.lucene.index.SortedNumericDocValues;
2526
import org.apache.lucene.index.SortedSetDocValues;
@@ -76,7 +77,7 @@ public FrozenEngine(EngineConfig config) {
7677

7778
boolean success = false;
7879
Directory directory = store.directory();
79-
try (DirectoryReader reader = DirectoryReader.open(directory)) {
80+
try (DirectoryReader reader = openDirectory(directory)) {
8081
canMatchReader = ElasticsearchDirectoryReader.wrap(new RewriteCachingDirectoryReader(directory, reader.leaves()),
8182
config.getShardId());
8283
success = true;
@@ -89,6 +90,15 @@ public FrozenEngine(EngineConfig config) {
8990
}
9091
}
9192

93+
private DirectoryReader openDirectory(Directory directory) throws IOException {
94+
final DirectoryReader reader = DirectoryReader.open(directory);
95+
if (config().getIndexSettings().isSoftDeleteEnabled()) {
96+
return new SoftDeletesDirectoryReaderWrapper(reader, Lucene.SOFT_DELETES_FIELD);
97+
} else {
98+
return reader;
99+
}
100+
}
101+
92102
@Override
93103
protected DirectoryReader open(IndexCommit indexCommit) throws IOException {
94104
// we fake an empty DirectoryReader for the ReadOnlyEngine. this reader is only used
@@ -159,7 +169,7 @@ private synchronized DirectoryReader getOrOpenReader() throws IOException {
159169
for (ReferenceManager.RefreshListener listeners : config ().getInternalRefreshListener()) {
160170
listeners.beforeRefresh();
161171
}
162-
reader = DirectoryReader.open(engineConfig.getStore().directory());
172+
reader = openDirectory(engineConfig.getStore().directory());
163173
processReaders(reader, null);
164174
reader = lastOpenedReader = wrapReader(reader, Function.identity());
165175
reader.getReaderCacheHelper().addClosedListener(this::onReaderClosed);

x-pack/plugin/core/src/test/java/org/elasticsearch/index/engine/FrozenEngineTests.java

+31
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.apache.lucene.index.DirectoryReader;
99
import org.apache.lucene.index.FilterDirectoryReader;
1010
import org.apache.lucene.index.NoMergePolicy;
11+
import org.apache.lucene.search.IndexSearcher;
1112
import org.apache.lucene.search.MatchAllDocsQuery;
1213
import org.apache.lucene.search.ReferenceManager;
1314
import org.apache.lucene.search.TopDocs;
@@ -33,6 +34,8 @@
3334
import java.util.concurrent.atomic.AtomicInteger;
3435
import java.util.concurrent.atomic.AtomicLong;
3536

37+
import static org.hamcrest.Matchers.equalTo;
38+
3639
public class FrozenEngineTests extends EngineTestCase {
3740

3841
public void testAcquireReleaseReset() throws IOException {
@@ -321,4 +324,32 @@ public void testCanMatch() throws IOException {
321324
}
322325
}
323326
}
327+
328+
public void testSearchers() throws Exception {
329+
IOUtils.close(engine, store);
330+
final AtomicLong globalCheckpoint = new AtomicLong(SequenceNumbers.NO_OPS_PERFORMED);
331+
try (Store store = createStore()) {
332+
EngineConfig config = config(defaultSettings, store, createTempDir(), newMergePolicy(), null, null, null,
333+
globalCheckpoint::get, new NoneCircuitBreakerService());
334+
final int totalDocs;
335+
try (InternalEngine engine = createEngine(config)) {
336+
applyOperations(engine, generateHistoryOnReplica(between(10, 1000), false, randomBoolean(), randomBoolean()));
337+
globalCheckpoint.set(engine.getLocalCheckpoint());
338+
engine.syncTranslog();
339+
engine.flush();
340+
engine.refresh("test");
341+
try (Engine.Searcher engineSearcher = engine.acquireSearcher("test")) {
342+
final IndexSearcher searcher = new IndexSearcher(engineSearcher.getDirectoryReader());
343+
totalDocs = searcher.search(new MatchAllDocsQuery(), Integer.MAX_VALUE).scoreDocs.length;
344+
}
345+
}
346+
try (FrozenEngine frozenEngine = new FrozenEngine(config)) {
347+
try (Engine.Searcher engineSearcher = frozenEngine.acquireSearcher("test")) {
348+
IndexSearcher searcher = new IndexSearcher(engineSearcher.getDirectoryReader());
349+
TopDocs topDocs = searcher.search(new MatchAllDocsQuery(), Integer.MAX_VALUE);
350+
assertThat(topDocs.scoreDocs.length, equalTo(totalDocs));
351+
}
352+
}
353+
}
354+
}
324355
}

0 commit comments

Comments
 (0)