Skip to content

Commit 87aa39a

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 #10312
1 parent 1200d8e commit 87aa39a

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
@@ -447,6 +447,7 @@ public void delete(Delete delete) throws EngineException {
447447
}
448448

449449
maybePruneDeletedTombstones();
450+
checkVersionMapRefresh();
450451
}
451452

452453
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
@@ -52,6 +52,7 @@
5252
import org.elasticsearch.index.deletionpolicy.KeepOnlyLastDeletionPolicy;
5353
import org.elasticsearch.index.deletionpolicy.SnapshotDeletionPolicy;
5454
import org.elasticsearch.index.deletionpolicy.SnapshotIndexCommit;
55+
import org.elasticsearch.index.engine.Engine.Searcher;
5556
import org.elasticsearch.index.indexing.ShardIndexingService;
5657
import org.elasticsearch.index.indexing.slowlog.ShardSlowLogIndexingService;
5758
import org.elasticsearch.index.mapper.ParseContext.Document;
@@ -1677,4 +1678,39 @@ public void testRetryWithAutogeneratedIdsAndWrongOrderWorksAndNoDuplicateDocs()
16771678
replicaSearcher.close();
16781679
}
16791680

1681+
// #10312
1682+
@Test
1683+
public void testDeletesAloneCanTriggerRefresh() throws IOException {
1684+
// Tiny indexing buffer:
1685+
Settings indexSettings = ImmutableSettings.builder().put(defaultSettings)
1686+
.put(EngineConfig.INDEX_BUFFER_SIZE_SETTING, "1kb").build();
1687+
IndexSettingsService indexSettingsService = new IndexSettingsService(shardId.index(), indexSettings);
1688+
try (Store store = createStore();
1689+
Translog translog = createTranslog();
1690+
Engine engine = new InternalEngine(config(indexSettingsService, store, translog, createMergeScheduler(indexSettingsService)))) {
1691+
for(int i=0;i<100;i++) {
1692+
String id = Integer.toString(i);
1693+
ParsedDocument doc = testParsedDocument(id, id, "test", null, -1, -1, testDocument(), B_1, false);
1694+
engine.index(new Engine.Index(null, newUid(id), doc, 2, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime()));
1695+
}
1696+
1697+
// Force merge so we know all merges are done before we start deleting:
1698+
engine.forceMerge(true, 1, false, false);
1699+
1700+
Searcher s = engine.acquireSearcher("test");
1701+
long version1 = ((DirectoryReader) s.reader()).getVersion();
1702+
s.close();
1703+
for(int i=0;i<100;i++) {
1704+
String id = Integer.toString(i);
1705+
engine.delete(new Engine.Delete("test", id, newUid(id), 10, VersionType.EXTERNAL, Engine.Operation.Origin.PRIMARY, System.nanoTime(), false));
1706+
}
1707+
s = engine.acquireSearcher("test");
1708+
long version2 = ((DirectoryReader) s.reader()).getVersion();
1709+
s.close();
1710+
1711+
// 100 buffered deletes will easily exceed 25% of our 1 KB indexing buffer so it should have forced a refresh:
1712+
assertThat(version2, greaterThan(version1));
1713+
}
1714+
}
1715+
16801716
}

0 commit comments

Comments
 (0)