Add rolling upgrade BWC tests for N-2 index compatibility (#119468)

This change adds rolling upgrade BWC tests for searchable 
snapshots in N-2 version, so that they are tested in a mixed 
versions cluster.

The tests do not use replicas because it may or may not be 
assigned depending on which node the primary is assigned 
on (ie, if the cluster has 1 new node and 2 old node and the 
primary shard is assigned to the new node, then a replica 
cannot be assigned until at least another node is upgraded). 

It also renames the existing full cluster restart BWC tests and 
mutualizes some common code in AbstractIndexCompatibilityTestCase.

Relates ES-10432
This commit is contained in:
Tanguy Leroux 2025-01-03 17:44:53 +01:00 committed by GitHub
parent d2d0636ce9
commit c62ee88c5f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 380 additions and 72 deletions

View file

@ -9,11 +9,6 @@
package org.elasticsearch.lucene;
import com.carrotsearch.randomizedtesting.TestMethodAndParams;
import com.carrotsearch.randomizedtesting.annotations.Name;
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
import com.carrotsearch.randomizedtesting.annotations.TestCaseOrdering;
import org.elasticsearch.client.Request;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.core.Strings;
@ -22,16 +17,18 @@ import org.elasticsearch.test.cluster.local.LocalClusterConfigProvider;
import org.elasticsearch.test.cluster.local.distribution.DistributionType;
import org.elasticsearch.test.cluster.util.Version;
import org.elasticsearch.test.rest.ESRestTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.rules.RuleChain;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestRule;
import java.util.Comparator;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static org.elasticsearch.test.cluster.util.Version.CURRENT;
import static org.elasticsearch.test.cluster.util.Version.fromString;
@ -41,24 +38,21 @@ import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
/**
* Test suite for Lucene indices backward compatibility with N-2 versions. The test suite creates a cluster in N-2 version, then upgrades it
* to N-1 version and finally upgrades it to the current version. Test methods are executed after each upgrade.
*/
@TestCaseOrdering(AbstractLuceneIndexCompatibilityTestCase.TestCaseOrdering.class)
public abstract class AbstractLuceneIndexCompatibilityTestCase extends ESRestTestCase {
public abstract class AbstractIndexCompatibilityTestCase extends ESRestTestCase {
protected static final Version VERSION_MINUS_2 = fromString(System.getProperty("tests.minimum.index.compatible"));
protected static final Version VERSION_MINUS_1 = fromString(System.getProperty("tests.minimum.wire.compatible"));
protected static final Version VERSION_CURRENT = CURRENT;
protected static TemporaryFolder REPOSITORY_PATH = new TemporaryFolder();
protected static final int NODES = 3;
private static TemporaryFolder REPOSITORY_PATH = new TemporaryFolder();
protected static LocalClusterConfigProvider clusterConfig = c -> {};
private static ElasticsearchCluster cluster = ElasticsearchCluster.local()
.distribution(DistributionType.DEFAULT)
.version(VERSION_MINUS_2)
.nodes(2)
.nodes(NODES)
.setting("path.repo", () -> REPOSITORY_PATH.getRoot().getPath())
.setting("xpack.security.enabled", "false")
.setting("xpack.ml.enabled", "false")
@ -71,15 +65,44 @@ public abstract class AbstractLuceneIndexCompatibilityTestCase extends ESRestTes
private static boolean upgradeFailed = false;
private final Version clusterVersion;
@Before
public final void maybeUpgradeBeforeTest() throws Exception {
// We want to use this test suite for the V9 upgrade, but we are not fully committed to necessarily having N-2 support
// in V10, so we add a check here to ensure we'll revisit this decision once V10 exists.
assertThat("Explicit check that N-2 version is Elasticsearch 7", VERSION_MINUS_2.getMajor(), equalTo(7));
public AbstractLuceneIndexCompatibilityTestCase(@Name("cluster") Version clusterVersion) {
this.clusterVersion = clusterVersion;
if (upgradeFailed == false) {
try {
maybeUpgrade();
} catch (Exception e) {
upgradeFailed = true;
throw e;
}
}
// Skip remaining tests if upgrade failed
assumeFalse("Cluster upgrade failed", upgradeFailed);
}
@ParametersFactory
public static Iterable<Object[]> parameters() {
return Stream.of(VERSION_MINUS_2, VERSION_MINUS_1, CURRENT).map(v -> new Object[] { v }).toList();
protected abstract void maybeUpgrade() throws Exception;
@After
public final void deleteSnapshotBlobCache() throws IOException {
// TODO ES-10475: The .snapshot-blob-cache created in legacy version can block upgrades, we should probably delete it automatically
try {
var request = new Request("DELETE", "/.snapshot-blob-cache");
request.setOptions(
expectWarnings(
"this request accesses system indices: [.snapshot-blob-cache], but in a future major version, "
+ "direct access to system indices will be prevented by default"
)
);
adminClient().performRequest(request);
} catch (IOException e) {
if (isNotFoundResponseException(e) == false) {
throw e;
}
}
}
@Override
@ -92,26 +115,8 @@ public abstract class AbstractLuceneIndexCompatibilityTestCase extends ESRestTes
return true;
}
@Before
public void maybeUpgrade() throws Exception {
// We want to use this test suite for the V9 upgrade, but we are not fully committed to necessarily having N-2 support
// in V10, so we add a check here to ensure we'll revisit this decision once V10 exists.
assertThat("Explicit check that N-2 version is Elasticsearch 7", VERSION_MINUS_2.getMajor(), equalTo(7));
var currentVersion = clusterVersion();
if (currentVersion.before(clusterVersion)) {
try {
cluster.upgradeToVersion(clusterVersion);
closeClients();
initClient();
} catch (Exception e) {
upgradeFailed = true;
throw e;
}
}
// Skip remaining tests if upgrade failed
assumeFalse("Cluster upgrade failed", upgradeFailed);
protected ElasticsearchCluster cluster() {
return cluster;
}
protected String suffix(String name) {
@ -124,12 +129,18 @@ public abstract class AbstractLuceneIndexCompatibilityTestCase extends ESRestTes
.build();
}
protected static Version clusterVersion() throws Exception {
var response = assertOK(client().performRequest(new Request("GET", "/")));
var responseBody = createFromResponse(response);
var version = Version.fromString(responseBody.evaluate("version.number").toString());
assertThat("Failed to retrieve cluster version", version, notNullValue());
return version;
protected static Map<String, Version> nodesVersions() throws Exception {
var nodesInfos = getNodesInfo(adminClient());
assertThat(nodesInfos.size(), equalTo(NODES));
var versions = new HashMap<String, Version>();
for (var nodeInfos : nodesInfos.values()) {
versions.put((String) nodeInfos.get("name"), Version.fromString((String) nodeInfos.get("version")));
}
return versions;
}
protected static boolean isFullyUpgradedTo(Version version) throws Exception {
return nodesVersions().values().stream().allMatch(v -> v.equals(version));
}
protected static Version indexVersion(String indexName) throws Exception {
@ -181,16 +192,4 @@ public abstract class AbstractLuceneIndexCompatibilityTestCase extends ESRestTes
assertThat(responseBody.evaluate("snapshot.shards.total"), equalTo((int) responseBody.evaluate("snapshot.shards.failed")));
assertThat(responseBody.evaluate("snapshot.shards.successful"), equalTo(0));
}
/**
* Execute the test suite with the parameters provided by the {@link #parameters()} in version order.
*/
public static class TestCaseOrdering implements Comparator<TestMethodAndParams> {
@Override
public int compare(TestMethodAndParams o1, TestMethodAndParams o2) {
var version1 = (Version) o1.getInstanceArguments().get(0);
var version2 = (Version) o2.getInstanceArguments().get(0);
return version1.compareTo(version2);
}
}
}

View file

@ -0,0 +1,65 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.lucene;
import com.carrotsearch.randomizedtesting.TestMethodAndParams;
import com.carrotsearch.randomizedtesting.annotations.Name;
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
import com.carrotsearch.randomizedtesting.annotations.TestCaseOrdering;
import org.elasticsearch.test.cluster.util.Version;
import java.util.Comparator;
import java.util.stream.Stream;
import static org.elasticsearch.test.cluster.util.Version.CURRENT;
import static org.hamcrest.Matchers.equalTo;
/**
* Test suite for Lucene indices backward compatibility with N-2 versions after full cluster restart upgrades. The test suite creates a
* cluster in N-2 version, then upgrades it to N-1 version and finally upgrades it to the current version. Test methods are executed after
* each upgrade.
*/
@TestCaseOrdering(FullClusterRestartIndexCompatibilityTestCase.TestCaseOrdering.class)
public abstract class FullClusterRestartIndexCompatibilityTestCase extends AbstractIndexCompatibilityTestCase {
private final Version clusterVersion;
public FullClusterRestartIndexCompatibilityTestCase(@Name("cluster") Version clusterVersion) {
this.clusterVersion = clusterVersion;
}
@ParametersFactory
public static Iterable<Object[]> parameters() {
return Stream.of(VERSION_MINUS_2, VERSION_MINUS_1, CURRENT).map(v -> new Object[] { v }).toList();
}
@Override
protected void maybeUpgrade() throws Exception {
if (nodesVersions().values().stream().anyMatch(version -> version.before(clusterVersion))) {
cluster().upgradeToVersion(clusterVersion);
closeClients();
initClient();
}
assertThat(isFullyUpgradedTo(clusterVersion), equalTo(true));
}
/**
* Execute the test suite with the parameters provided by the {@link #parameters()} in version order.
*/
public static class TestCaseOrdering implements Comparator<TestMethodAndParams> {
@Override
public int compare(TestMethodAndParams o1, TestMethodAndParams o2) {
var version1 = (Version) o1.getInstanceArguments().get(0);
var version2 = (Version) o2.getInstanceArguments().get(0);
return version1.compareTo(version2);
}
}
}

View file

@ -23,13 +23,13 @@ import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.equalTo;
public class LuceneCompatibilityIT extends AbstractLuceneIndexCompatibilityTestCase {
public class FullClusterRestartLuceneIndexCompatibilityIT extends FullClusterRestartIndexCompatibilityTestCase {
static {
clusterConfig = config -> config.setting("xpack.license.self_generated.type", "trial");
}
public LuceneCompatibilityIT(Version version) {
public FullClusterRestartLuceneIndexCompatibilityIT(Version version) {
super(version);
}
@ -42,7 +42,7 @@ public class LuceneCompatibilityIT extends AbstractLuceneIndexCompatibilityTestC
final String index = suffix("index");
final int numDocs = 1234;
if (VERSION_MINUS_2.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_MINUS_2)) {
logger.debug("--> registering repository [{}]", repository);
registerRepository(client(), repository, FsRepository.TYPE, true, repositorySettings());
@ -65,7 +65,7 @@ public class LuceneCompatibilityIT extends AbstractLuceneIndexCompatibilityTestC
return;
}
if (VERSION_MINUS_1.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_MINUS_1)) {
ensureGreen(index);
assertThat(indexVersion(index), equalTo(VERSION_MINUS_2));
@ -76,7 +76,7 @@ public class LuceneCompatibilityIT extends AbstractLuceneIndexCompatibilityTestC
return;
}
if (VERSION_CURRENT.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_CURRENT)) {
var restoredIndex = suffix("index-restored");
logger.debug("--> restoring index [{}] as [{}]", index, restoredIndex);

View file

@ -17,7 +17,7 @@ import org.elasticsearch.test.cluster.util.Version;
import static org.hamcrest.Matchers.equalTo;
public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompatibilityTestCase {
public class FullClusterRestartSearchableSnapshotIndexCompatibilityIT extends FullClusterRestartIndexCompatibilityTestCase {
static {
clusterConfig = config -> config.setting("xpack.license.self_generated.type", "trial")
@ -25,7 +25,7 @@ public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompat
.setting("xpack.searchable.snapshot.shared_cache.region_size", "256KB");
}
public SearchableSnapshotCompatibilityIT(Version version) {
public FullClusterRestartSearchableSnapshotIndexCompatibilityIT(Version version) {
super(version);
}
@ -38,7 +38,7 @@ public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompat
final String index = suffix("index");
final int numDocs = 1234;
if (VERSION_MINUS_2.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_MINUS_2)) {
logger.debug("--> registering repository [{}]", repository);
registerRepository(client(), repository, FsRepository.TYPE, true, repositorySettings());
@ -61,7 +61,7 @@ public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompat
return;
}
if (VERSION_MINUS_1.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_MINUS_1)) {
ensureGreen(index);
assertThat(indexVersion(index), equalTo(VERSION_MINUS_2));
@ -72,7 +72,7 @@ public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompat
return;
}
if (VERSION_CURRENT.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_CURRENT)) {
var mountedIndex = suffix("index-mounted");
logger.debug("--> mounting index [{}] as [{}]", index, mountedIndex);
mountIndex(repository, snapshot, index, randomBoolean(), mountedIndex);
@ -98,7 +98,7 @@ public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompat
final String index = suffix("index");
final int numDocs = 4321;
if (VERSION_MINUS_2.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_MINUS_2)) {
logger.debug("--> registering repository [{}]", repository);
registerRepository(client(), repository, FsRepository.TYPE, true, repositorySettings());
@ -124,7 +124,7 @@ public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompat
return;
}
if (VERSION_MINUS_1.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_MINUS_1)) {
logger.debug("--> mounting index [{}] as [{}]", index, mountedIndex);
mountIndex(repository, snapshot, index, randomBoolean(), mountedIndex);
@ -135,7 +135,7 @@ public class SearchableSnapshotCompatibilityIT extends AbstractLuceneIndexCompat
return;
}
if (VERSION_CURRENT.equals(clusterVersion())) {
if (isFullyUpgradedTo(VERSION_CURRENT)) {
ensureGreen(mountedIndex);
assertThat(indexVersion(mountedIndex), equalTo(VERSION_MINUS_2));

View file

@ -0,0 +1,104 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.lucene;
import com.carrotsearch.randomizedtesting.TestMethodAndParams;
import com.carrotsearch.randomizedtesting.annotations.Name;
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
import com.carrotsearch.randomizedtesting.annotations.TestCaseOrdering;
import org.elasticsearch.test.cluster.util.Version;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;
import static org.elasticsearch.test.cluster.util.Version.CURRENT;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.notNullValue;
/**
* Test suite for Lucene indices backward compatibility with N-2 versions during rolling upgrades. The test suite creates a cluster in N-2
* version, then upgrades each node sequentially to N-1 version and finally upgrades each node sequentially to the current version. Test
* methods are executed after each node upgrade.
*/
@TestCaseOrdering(RollingUpgradeIndexCompatibilityTestCase.TestCaseOrdering.class)
public abstract class RollingUpgradeIndexCompatibilityTestCase extends AbstractIndexCompatibilityTestCase {
private final List<Version> nodesVersions;
public RollingUpgradeIndexCompatibilityTestCase(@Name("cluster") List<Version> nodesVersions) {
this.nodesVersions = nodesVersions;
}
@ParametersFactory
public static Iterable<Object[]> parameters() {
return Stream.of(
// Begin on N-2
List.of(VERSION_MINUS_2, VERSION_MINUS_2, VERSION_MINUS_2),
// Rolling upgrade to VERSION_MINUS_1
List.of(VERSION_MINUS_1, VERSION_MINUS_2, VERSION_MINUS_2),
List.of(VERSION_MINUS_1, VERSION_MINUS_1, VERSION_MINUS_2),
List.of(VERSION_MINUS_1, VERSION_MINUS_1, VERSION_MINUS_1),
// Rolling upgrade to CURRENT
List.of(CURRENT, VERSION_MINUS_1, VERSION_MINUS_1),
List.of(CURRENT, CURRENT, VERSION_MINUS_1),
List.of(CURRENT, CURRENT, CURRENT)
).map(nodesVersion -> new Object[] { nodesVersion }).toList();
}
@Override
protected void maybeUpgrade() throws Exception {
assertThat(nodesVersions, hasSize(NODES));
for (int i = 0; i < NODES; i++) {
var nodeName = cluster().getName(i);
var expectedNodeVersion = nodesVersions.get(i);
assertThat(expectedNodeVersion, notNullValue());
var currentNodeVersion = nodesVersions().get(nodeName);
assertThat(currentNodeVersion, notNullValue());
assertThat(currentNodeVersion.onOrBefore(expectedNodeVersion), equalTo(true));
if (currentNodeVersion.equals(expectedNodeVersion) == false) {
closeClients();
cluster().upgradeNodeToVersion(i, expectedNodeVersion);
initClient();
}
currentNodeVersion = nodesVersions().get(nodeName);
assertThat(currentNodeVersion, equalTo(expectedNodeVersion));
}
}
/**
* Execute the test suite with the parameters provided by the {@link #parameters()} in nodes versions order.
*/
public static class TestCaseOrdering implements Comparator<TestMethodAndParams> {
@Override
public int compare(TestMethodAndParams o1, TestMethodAndParams o2) {
List<?> nodesVersions1 = asInstanceOf(List.class, o1.getInstanceArguments().get(0));
assertThat(nodesVersions1, hasSize(NODES));
List<?> nodesVersions2 = asInstanceOf(List.class, o2.getInstanceArguments().get(0));
assertThat(nodesVersions2, hasSize(NODES));
for (int i = 0; i < NODES; i++) {
var nodeVersion1 = asInstanceOf(Version.class, nodesVersions1.get(i));
var nodeVersion2 = asInstanceOf(Version.class, nodesVersions2.get(i));
var result = nodeVersion1.compareTo(nodeVersion2);
if (result != 0) {
return result;
}
}
return 0;
}
}
}

View file

@ -0,0 +1,140 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.lucene;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.IndexSettings;
import org.elasticsearch.repositories.fs.FsRepository;
import org.elasticsearch.test.cluster.util.Version;
import java.util.List;
import static org.hamcrest.Matchers.equalTo;
public class RollingUpgradeSearchableSnapshotIndexCompatibilityIT extends RollingUpgradeIndexCompatibilityTestCase {
static {
clusterConfig = config -> config.setting("xpack.license.self_generated.type", "trial")
.setting("xpack.searchable.snapshot.shared_cache.size", "16MB")
.setting("xpack.searchable.snapshot.shared_cache.region_size", "256KB");
}
public RollingUpgradeSearchableSnapshotIndexCompatibilityIT(List<Version> nodesVersion) {
super(nodesVersion);
}
/**
* Creates an index and a snapshot on N-2, then mounts the snapshot during rolling upgrades.
*/
public void testMountSearchableSnapshot() throws Exception {
final String repository = suffix("repository");
final String snapshot = suffix("snapshot");
final String index = suffix("index-rolling-upgrade");
final var mountedIndex = suffix("index-rolling-upgrade-mounted");
final int numDocs = 3145;
if (isFullyUpgradedTo(VERSION_MINUS_2)) {
logger.debug("--> registering repository [{}]", repository);
registerRepository(client(), repository, FsRepository.TYPE, true, repositorySettings());
logger.debug("--> creating index [{}]", index);
createIndex(
client(),
index,
Settings.builder()
.put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 1)
.put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0)
.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), true)
.build()
);
logger.debug("--> indexing [{}] docs in [{}]", numDocs, index);
indexDocs(index, numDocs);
logger.debug("--> creating snapshot [{}]", snapshot);
createSnapshot(client(), repository, snapshot, true);
logger.debug("--> deleting index [{}]", index);
deleteIndex(index);
return;
}
boolean success = false;
try {
logger.debug("--> mounting index [{}] as [{}]", index, mountedIndex);
mountIndex(repository, snapshot, index, randomBoolean(), mountedIndex);
ensureGreen(mountedIndex);
assertThat(indexVersion(mountedIndex), equalTo(VERSION_MINUS_2));
assertDocCount(client(), mountedIndex, numDocs);
logger.debug("--> deleting mounted index [{}]", mountedIndex);
deleteIndex(mountedIndex);
success = true;
} finally {
if (success == false) {
try {
client().performRequest(new Request("DELETE", "/" + mountedIndex));
} catch (ResponseException e) {
logger.warn("Failed to delete mounted index [" + mountedIndex + ']', e);
}
}
}
}
/**
* Creates an index and a snapshot on N-2, mounts the snapshot and ensures it remains searchable during rolling upgrades.
*/
public void testSearchableSnapshotUpgrade() throws Exception {
final String mountedIndex = suffix("index-rolling-upgraded-mounted");
final String repository = suffix("repository");
final String snapshot = suffix("snapshot");
final String index = suffix("index-rolling-upgraded");
final int numDocs = 2143;
if (isFullyUpgradedTo(VERSION_MINUS_2)) {
logger.debug("--> registering repository [{}]", repository);
registerRepository(client(), repository, FsRepository.TYPE, true, repositorySettings());
logger.debug("--> creating index [{}]", index);
createIndex(
client(),
index,
Settings.builder()
.put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 1)
.put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0)
.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), true)
.build()
);
logger.debug("--> indexing [{}] docs in [{}]", numDocs, index);
indexDocs(index, numDocs);
logger.debug("--> creating snapshot [{}]", snapshot);
createSnapshot(client(), repository, snapshot, true);
logger.debug("--> deleting index [{}]", index);
deleteIndex(index);
logger.debug("--> mounting index [{}] as [{}]", index, mountedIndex);
mountIndex(repository, snapshot, index, randomBoolean(), mountedIndex);
}
ensureGreen(mountedIndex);
assertThat(indexVersion(mountedIndex), equalTo(VERSION_MINUS_2));
assertDocCount(client(), mountedIndex, numDocs);
}
}