|
@@ -20,17 +20,22 @@ import org.elasticsearch.test.ESTestCase;
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
+import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
import java.util.UUID;
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
|
|
|
|
import static org.elasticsearch.index.seqno.SequenceNumbers.NO_OPS_PERFORMED;
|
|
|
import static org.hamcrest.Matchers.contains;
|
|
|
+import static org.hamcrest.Matchers.containsInAnyOrder;
|
|
|
+import static org.hamcrest.Matchers.empty;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
import static org.hamcrest.Matchers.hasSize;
|
|
|
import static org.hamcrest.Matchers.instanceOf;
|
|
|
+import static org.hamcrest.Matchers.not;
|
|
|
import static org.mockito.Mockito.doAnswer;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.never;
|
|
@@ -273,11 +278,15 @@ public class CombinedDeletionPolicyTests extends ESTestCase {
|
|
|
public void testCommitsListener() throws Exception {
|
|
|
final List<IndexCommit> acquiredCommits = new ArrayList<>();
|
|
|
final List<IndexCommit> deletedCommits = new ArrayList<>();
|
|
|
+ final Set<String> newCommitFiles = new HashSet<>();
|
|
|
final CombinedDeletionPolicy.CommitsListener commitsListener = new CombinedDeletionPolicy.CommitsListener() {
|
|
|
@Override
|
|
|
- public void onNewAcquiredCommit(IndexCommit commit) {
|
|
|
+ public void onNewAcquiredCommit(IndexCommit commit, Set<String> additionalFiles) {
|
|
|
assertThat(commit, instanceOf(FilterIndexCommit.class));
|
|
|
assertThat(acquiredCommits.add(((FilterIndexCommit) commit).getIndexCommit()), equalTo(true));
|
|
|
+ assertThat(additionalFiles, not(empty()));
|
|
|
+ newCommitFiles.clear();
|
|
|
+ newCommitFiles.addAll(additionalFiles);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -315,44 +324,148 @@ public class CombinedDeletionPolicyTests extends ESTestCase {
|
|
|
};
|
|
|
|
|
|
final UUID translogUUID = UUID.randomUUID();
|
|
|
- final IndexCommit commit0 = mockIndexCommit(NO_OPS_PERFORMED, NO_OPS_PERFORMED, translogUUID);
|
|
|
+ final IndexCommit commit0 = mockIndexCommit(NO_OPS_PERFORMED, NO_OPS_PERFORMED, translogUUID, Set.of("segments_0"));
|
|
|
combinedDeletionPolicy.onInit(List.of(commit0));
|
|
|
|
|
|
assertThat(acquiredCommits, contains(commit0));
|
|
|
assertThat(deletedCommits, hasSize(0));
|
|
|
+ assertThat(newCommitFiles, contains("segments_0"));
|
|
|
|
|
|
- final IndexCommit commit1 = mockIndexCommit(10L, 10L, translogUUID);
|
|
|
+ final IndexCommit commit1 = mockIndexCommit(10L, 10L, translogUUID, Set.of("_0.cfe", "_0.si", "_0.cfs", "segments_1"));
|
|
|
combinedDeletionPolicy.onCommit(List.of(commit0, commit1));
|
|
|
|
|
|
assertThat(acquiredCommits, contains(commit0, commit1));
|
|
|
assertThat(deletedCommits, hasSize(0));
|
|
|
+ assertThat(newCommitFiles, containsInAnyOrder(equalTo("_0.cfe"), equalTo("_0.si"), equalTo("_0.cfs"), equalTo("segments_1")));
|
|
|
|
|
|
globalCheckpoint.set(10L);
|
|
|
- final IndexCommit commit2 = mockIndexCommit(20L, 20L, translogUUID);
|
|
|
+ final IndexCommit commit2 = mockIndexCommit(
|
|
|
+ 20L,
|
|
|
+ 20L,
|
|
|
+ translogUUID,
|
|
|
+ Set.of("_1.cfs", "_0.cfe", "_0.si", "_1.cfe", "_1.si", "_0.cfs", "segments_2")
|
|
|
+ );
|
|
|
combinedDeletionPolicy.onCommit(List.of(commit0, commit1, commit2));
|
|
|
|
|
|
assertThat(acquiredCommits, contains(commit0, commit1, commit2));
|
|
|
assertThat(deletedCommits, hasSize(0));
|
|
|
+ assertThat(newCommitFiles, containsInAnyOrder(equalTo("_1.cfe"), equalTo("_1.si"), equalTo("_1.cfs"), equalTo("segments_2")));
|
|
|
|
|
|
boolean maybeCleanUpCommits = combinedDeletionPolicy.releaseCommit(commit0);
|
|
|
assertThat(maybeCleanUpCommits, equalTo(true));
|
|
|
|
|
|
globalCheckpoint.set(20L);
|
|
|
- final IndexCommit commit3 = mockIndexCommit(30L, 30L, translogUUID);
|
|
|
+ final IndexCommit commit3 = mockIndexCommit(
|
|
|
+ 30L,
|
|
|
+ 30L,
|
|
|
+ translogUUID,
|
|
|
+ Set.of(
|
|
|
+ "_3.fdx",
|
|
|
+ "_3_Lucene90_0.tip",
|
|
|
+ "_3_Lucene90_0.dvm",
|
|
|
+ "_3.si",
|
|
|
+ "_3_0.tmd",
|
|
|
+ "_3_0.tim",
|
|
|
+ "_3_ES85BloomFilter_0.bfi",
|
|
|
+ "_3_0.pos",
|
|
|
+ "_3_ES85BloomFilter_0.bfm",
|
|
|
+ "_3_0.tip",
|
|
|
+ "_3_Lucene90_0.doc",
|
|
|
+ "_3.nvd",
|
|
|
+ "_3.nvm",
|
|
|
+ "_3.fnm",
|
|
|
+ "_3_0.doc",
|
|
|
+ "segments_3",
|
|
|
+ "_3.kdd",
|
|
|
+ "_3_Lucene90_0.tmd",
|
|
|
+ "_3.fdm",
|
|
|
+ "_3.kdi",
|
|
|
+ "_3_Lucene90_0.dvd",
|
|
|
+ "_3_Lucene90_0.pos",
|
|
|
+ "_3.kdm",
|
|
|
+ "_3.fdt",
|
|
|
+ "_3_Lucene90_0.tim"
|
|
|
+ )
|
|
|
+ );
|
|
|
combinedDeletionPolicy.onCommit(List.of(commit0, commit1, commit2, commit3));
|
|
|
|
|
|
assertThat(acquiredCommits, contains(commit1, commit2, commit3));
|
|
|
assertThat(deletedCommits, contains(commit0));
|
|
|
+ assertThat(
|
|
|
+ newCommitFiles,
|
|
|
+ containsInAnyOrder(
|
|
|
+ equalTo("_3.fdx"),
|
|
|
+ equalTo("_3_Lucene90_0.tip"),
|
|
|
+ equalTo("_3_Lucene90_0.dvm"),
|
|
|
+ equalTo("_3.si"),
|
|
|
+ equalTo("_3_0.tmd"),
|
|
|
+ equalTo("_3_0.tim"),
|
|
|
+ equalTo("_3_ES85BloomFilter_0.bfi"),
|
|
|
+ equalTo("_3_0.pos"),
|
|
|
+ equalTo("_3_ES85BloomFilter_0.bfm"),
|
|
|
+ equalTo("_3_0.tip"),
|
|
|
+ equalTo("_3_Lucene90_0.doc"),
|
|
|
+ equalTo("_3.nvd"),
|
|
|
+ equalTo("_3.nvm"),
|
|
|
+ equalTo("_3.fnm"),
|
|
|
+ equalTo("_3_0.doc"),
|
|
|
+ equalTo("segments_3"),
|
|
|
+ equalTo("_3.kdd"),
|
|
|
+ equalTo("_3_Lucene90_0.tmd"),
|
|
|
+ equalTo("_3.fdm"),
|
|
|
+ equalTo("_3.kdi"),
|
|
|
+ equalTo("_3_Lucene90_0.dvd"),
|
|
|
+ equalTo("_3_Lucene90_0.pos"),
|
|
|
+ equalTo("_3.kdm"),
|
|
|
+ equalTo("_3.fdt"),
|
|
|
+ equalTo("_3_Lucene90_0.tim")
|
|
|
+ )
|
|
|
+ );
|
|
|
|
|
|
maybeCleanUpCommits = combinedDeletionPolicy.releaseCommit(commit2);
|
|
|
assertThat("No commits to clean up (commit #2 is the safe commit)", maybeCleanUpCommits, equalTo(false));
|
|
|
|
|
|
globalCheckpoint.set(30L);
|
|
|
- final IndexCommit commit4 = mockIndexCommit(40L, 40L, translogUUID);
|
|
|
+ final IndexCommit commit4 = mockIndexCommit(
|
|
|
+ 40L,
|
|
|
+ 40L,
|
|
|
+ translogUUID,
|
|
|
+ Set.of(
|
|
|
+ "_3.fdx",
|
|
|
+ "_3_Lucene90_0.tip",
|
|
|
+ "_3_Lucene90_0.dvm",
|
|
|
+ "_3.si",
|
|
|
+ "_3_0.tmd",
|
|
|
+ "_3_0.tim",
|
|
|
+ "_3_ES85BloomFilter_0.bfi",
|
|
|
+ "_3_0.pos",
|
|
|
+ "_3_ES85BloomFilter_0.bfm",
|
|
|
+ "_3_0.tip",
|
|
|
+ "_3_Lucene90_0.doc",
|
|
|
+ "_3.nvd",
|
|
|
+ "_4.cfe",
|
|
|
+ "_3.nvm",
|
|
|
+ "_3.fnm",
|
|
|
+ "_3_0.doc",
|
|
|
+ "segments_4",
|
|
|
+ "_3.kdd",
|
|
|
+ "_3_Lucene90_0.tmd",
|
|
|
+ "_3.fdm",
|
|
|
+ "_3.kdi",
|
|
|
+ "_4.cfs",
|
|
|
+ "_3_Lucene90_0.dvd",
|
|
|
+ "_3_Lucene90_0.pos",
|
|
|
+ "_3.kdm",
|
|
|
+ "_4.si",
|
|
|
+ "_3.fdt",
|
|
|
+ "_3_Lucene90_0.tim"
|
|
|
+ )
|
|
|
+ );
|
|
|
combinedDeletionPolicy.onCommit(List.of(commit1, commit2, commit3, commit4));
|
|
|
|
|
|
assertThat(acquiredCommits, contains(commit1, commit3, commit4));
|
|
|
assertThat(deletedCommits, contains(commit0, commit2));
|
|
|
+ assertThat(newCommitFiles, containsInAnyOrder(equalTo("_4.cfe"), equalTo("_4.si"), equalTo("_4.cfs"), equalTo("segments_4")));
|
|
|
|
|
|
maybeCleanUpCommits = combinedDeletionPolicy.releaseCommit(commit3);
|
|
|
assertThat("No commits to clean up (commit #3 is the safe commit)", maybeCleanUpCommits, equalTo(false));
|
|
@@ -366,7 +479,44 @@ public class CombinedDeletionPolicyTests extends ESTestCase {
|
|
|
final boolean globalCheckpointCatchUp = randomBoolean();
|
|
|
globalCheckpoint.set(globalCheckpointCatchUp ? 50L : 40L);
|
|
|
|
|
|
- final IndexCommit commit5 = mockIndexCommit(50L, 50L, translogUUID);
|
|
|
+ final IndexCommit commit5 = mockIndexCommit(
|
|
|
+ 50L,
|
|
|
+ 50L,
|
|
|
+ translogUUID,
|
|
|
+ Set.of(
|
|
|
+ "_3.fdx",
|
|
|
+ "_3_Lucene90_0.tip",
|
|
|
+ "_3_Lucene90_0.dvm",
|
|
|
+ "_3.si",
|
|
|
+ "_3_0.tmd",
|
|
|
+ "_3_0.tim",
|
|
|
+ "_3_ES85BloomFilter_0.bfi",
|
|
|
+ "_3_0.pos",
|
|
|
+ "_3_ES85BloomFilter_0.bfm",
|
|
|
+ "_3_0.tip",
|
|
|
+ "_5.si",
|
|
|
+ "_3_Lucene90_0.doc",
|
|
|
+ "segments_5",
|
|
|
+ "_3.nvd",
|
|
|
+ "_5.cfs",
|
|
|
+ "_4.cfe",
|
|
|
+ "_3.nvm",
|
|
|
+ "_3.fnm",
|
|
|
+ "_3_0.doc",
|
|
|
+ "_3.kdd",
|
|
|
+ "_3_Lucene90_0.tmd",
|
|
|
+ "_3.fdm",
|
|
|
+ "_3.kdi",
|
|
|
+ "_5.cfe",
|
|
|
+ "_4.cfs",
|
|
|
+ "_3_Lucene90_0.dvd",
|
|
|
+ "_3_Lucene90_0.pos",
|
|
|
+ "_3.kdm",
|
|
|
+ "_4.si",
|
|
|
+ "_3.fdt",
|
|
|
+ "_3_Lucene90_0.tim"
|
|
|
+ )
|
|
|
+ );
|
|
|
combinedDeletionPolicy.onCommit(List.of(commit1, commit3, commit4, commit5));
|
|
|
|
|
|
if (globalCheckpointCatchUp) {
|
|
@@ -376,6 +526,7 @@ public class CombinedDeletionPolicyTests extends ESTestCase {
|
|
|
assertThat(acquiredCommits, contains(commit4, commit5));
|
|
|
assertThat(deletedCommits, contains(commit0, commit2, commit1, commit3));
|
|
|
}
|
|
|
+ assertThat(newCommitFiles, containsInAnyOrder(equalTo("_5.cfe"), equalTo("_5.si"), equalTo("_5.cfs"), equalTo("segments_5")));
|
|
|
|
|
|
maybeCleanUpCommits = combinedDeletionPolicy.releaseCommit(commit5);
|
|
|
assertThat("No commits to clean up (commit #5 is the last commit)", maybeCleanUpCommits, equalTo(false));
|
|
@@ -399,6 +550,10 @@ public class CombinedDeletionPolicyTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
IndexCommit mockIndexCommit(long localCheckpoint, long maxSeqNo, UUID translogUUID) throws IOException {
|
|
|
+ return mockIndexCommit(localCheckpoint, maxSeqNo, translogUUID, Set.of());
|
|
|
+ }
|
|
|
+
|
|
|
+ IndexCommit mockIndexCommit(long localCheckpoint, long maxSeqNo, UUID translogUUID, Set<String> fileNames) throws IOException {
|
|
|
final Map<String, String> userData = new HashMap<>();
|
|
|
userData.put(SequenceNumbers.LOCAL_CHECKPOINT_KEY, Long.toString(localCheckpoint));
|
|
|
userData.put(SequenceNumbers.MAX_SEQ_NO, Long.toString(maxSeqNo));
|
|
@@ -407,6 +562,7 @@ public class CombinedDeletionPolicyTests extends ESTestCase {
|
|
|
final Directory directory = mock(Directory.class);
|
|
|
when(commit.getUserData()).thenReturn(userData);
|
|
|
when(commit.getDirectory()).thenReturn(directory);
|
|
|
+ when(commit.getFileNames()).thenReturn(fileNames);
|
|
|
resetDeletion(commit);
|
|
|
return commit;
|
|
|
}
|