Skip to content

Commit 9441f7b

Browse files
committed
Core: deletions (alone) should also force a refresh when version map is using too much RAM
We already force a refresh in index/create ops, to clear version map when it's using too much RAM, but we were failing to do this for deletes, so an app that does tons of deletes with no indexing, and has set refresh_interval to -1, would have version map using unbounded RAM. Closes elastic#10312
1 parent 76df7d2 commit 9441f7b

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ public void delete(Delete delete) throws EngineException {
461461
}
462462

463463
maybePruneDeletedTombstones();
464+
checkVersionMapRefresh();
464465
}
465466

466467
private void maybePruneDeletedTombstones() {

src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.elasticsearch.index.deletionpolicy.KeepOnlyLastDeletionPolicy;
5656
import org.elasticsearch.index.deletionpolicy.SnapshotDeletionPolicy;
5757
import org.elasticsearch.index.deletionpolicy.SnapshotIndexCommit;
58+
import org.elasticsearch.index.engine.Engine.Searcher;
5859
import org.elasticsearch.index.indexing.ShardIndexingService;
5960
import org.elasticsearch.index.indexing.slowlog.ShardSlowLogIndexingService;
6061
import org.elasticsearch.index.mapper.ParseContext.Document;
@@ -1644,4 +1645,39 @@ public void testRetryWithAutogeneratedIdsAndWrongOrderWorksAndNoDuplicateDocs()
16441645
replicaSearcher.close();
16451646
}
16461647

1648+
// #10312
1649+
@Test
1650+
public void testDeletesAloneCanTriggerRefresh() throws IOException {
1651+
// Tiny indexing buffer:
1652+
Settings indexSettings = ImmutableSettings.builder().put(defaultSettings)
1653+
.put(EngineConfig.INDEX_BUFFER_SIZE_SETTING, "1kb").build();
1654+
IndexSettingsService indexSettingsService = new IndexSettingsService(shardId.index(), indexSettings);
1655+
try (Store store = createStore();
1656+
Translog translog = createTranslog();
1657+
Engine engine = new InternalEngine(config(indexSettingsService, store, translog, createMergeScheduler(indexSettingsService)))) {
1658+
for(int i=0;i<100;i++) {
1659+
String id = Integer.toString(i);
1660+
ParsedDocument doc = testParsedDocument(id, id, "test", null, -1, -1, testDocument(), B_1, false);
1661+
engine.index(new Engine.Index(null, newUid(id), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime()));
1662+
}
1663+
1664+
// Force merge so we know all merges are done before we start deleting:
1665+
engine.forceMerge(true, 1, false, false);
1666+
1667+
Searcher s = engine.acquireSearcher("test");
1668+
long version1 = ((DirectoryReader) s.reader()).getVersion();
1669+
s.close();
1670+
for(int i=0;i<100;i++) {
1671+
String id = Integer.toString(i);
1672+
engine.delete(new Engine.Delete("test", id, newUid(id), 10, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), false));
1673+
}
1674+
s = engine.acquireSearcher("test");
1675+
long version2 = ((DirectoryReader) s.reader()).getVersion();
1676+
s.close();
1677+
1678+
// 100 buffered deletes will easily exceed 25% of our 1 KB indexing buffer so it should have forced a refresh:
1679+
assertThat(version2, greaterThan(version1));
1680+
}
1681+
}
1682+
16471683
}

0 commit comments

Comments
 (0)