Skip to content

Commit 42ebc41

Browse files
committed
Copy and validate soft-deletes setting on resize (#33517)
This change copies and validates the soft-deletes setting during resize. If the source enables soft-deletes, the target must also enable it. Closes #33321
1 parent d725416 commit 42ebc41

File tree

7 files changed

+34
-11
lines changed

7 files changed

+34
-11
lines changed

server/src/main/java/org/elasticsearch/action/admin/indices/shrink/TransportResizeAction.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.elasticsearch.common.inject.Inject;
4040
import org.elasticsearch.common.settings.Settings;
4141
import org.elasticsearch.index.IndexNotFoundException;
42+
import org.elasticsearch.index.IndexSettings;
4243
import org.elasticsearch.index.shard.DocsStats;
4344
import org.elasticsearch.index.shard.ShardId;
4445
import org.elasticsearch.threadpool.ThreadPool;
@@ -166,6 +167,12 @@ static CreateIndexClusterStateUpdateRequest prepareCreateIndexRequest(final Resi
166167
if (IndexMetaData.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.exists(targetIndexSettings)) {
167168
throw new IllegalArgumentException("cannot provide index.number_of_routing_shards on resize");
168169
}
170+
if (IndexSettings.INDEX_SOFT_DELETES_SETTING.exists(metaData.getSettings()) &&
171+
IndexSettings.INDEX_SOFT_DELETES_SETTING.get(metaData.getSettings()) &&
172+
IndexSettings.INDEX_SOFT_DELETES_SETTING.exists(targetIndexSettings) &&
173+
IndexSettings.INDEX_SOFT_DELETES_SETTING.get(targetIndexSettings) == false) {
174+
throw new IllegalArgumentException("Can't disable [index.soft_deletes.enabled] setting on resize");
175+
}
169176
String cause = resizeRequest.getResizeType().name().toLowerCase(Locale.ROOT) + "_index";
170177
targetIndex.cause(cause);
171178
Settings.Builder settingsBuilder = Settings.builder().put(targetIndexSettings);

server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -735,11 +735,8 @@ static void prepareResizeIndexSettings(
735735
}
736736
} else {
737737
final Predicate<String> sourceSettingsPredicate =
738-
(s) -> (
739-
s.startsWith("index.similarity.")
740-
|| s.startsWith("index.analysis.")
741-
|| s.startsWith("index.sort.")
742-
|| s.equals("index.mapping.single_type"))
738+
(s) -> (s.startsWith("index.similarity.") || s.startsWith("index.analysis.") || s.startsWith("index.sort.") ||
739+
s.equals("index.mapping.single_type") || s.equals("index.soft_deletes.enabled"))
743740
&& indexSettingsBuilder.keys().contains(s) == false;
744741
builder.put(sourceMetaData.getSettings().filter(sourceSettingsPredicate));
745742
}

server/src/test/java/org/elasticsearch/action/admin/indices/shrink/TransportResizeActionTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import java.util.HashSet;
4848

4949
import static java.util.Collections.emptyMap;
50+
import static org.hamcrest.Matchers.equalTo;
5051

5152
public class TransportResizeActionTests extends ESTestCase {
5253

@@ -89,6 +90,16 @@ public void testErrorCondition() {
8990
).getMessage().startsWith("Can't merge index with more than [2147483519] docs - too many documents in shards "));
9091

9192

93+
IllegalArgumentException softDeletesError = expectThrows(IllegalArgumentException.class, () -> {
94+
ResizeRequest req = new ResizeRequest("target", "source");
95+
req.getTargetIndexRequest().settings(Settings.builder().put("index.soft_deletes.enabled", false));
96+
ClusterState clusterState = createClusterState("source", 8, 1,
97+
Settings.builder().put("index.blocks.write", true).put("index.soft_deletes.enabled", true).build());
98+
TransportResizeAction.prepareCreateIndexRequest(req, clusterState,
99+
(i) -> new DocsStats(between(10, 1000), between(1, 10), between(1, 10000)), "source", "target");
100+
});
101+
assertThat(softDeletesError.getMessage(), equalTo("Can't disable [index.soft_deletes.enabled] setting on resize"));
102+
92103
// create one that won't fail
93104
ClusterState clusterState = ClusterState.builder(createClusterState("source", randomIntBetween(2, 10), 0,
94105
Settings.builder().put("index.blocks.write", true).build())).nodes(DiscoveryNodes.builder().add(newNode("node1")))

server/src/test/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexServiceTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ public void testPrepareResizeIndexSettings() {
245245
.put("index.version.upgraded", upgraded)
246246
.put("index.similarity.default.type", "BM25")
247247
.put("index.analysis.analyzer.default.tokenizer", "keyword")
248+
.put("index.soft_deletes.enabled", "true")
248249
.build();
249250
runPrepareResizeIndexSettingsTest(
250251
indexSettings,
@@ -261,6 +262,7 @@ public void testPrepareResizeIndexSettings() {
261262
assertThat(settings.get("index.allocation.max_retries"), equalTo("1"));
262263
assertThat(settings.getAsVersion("index.version.created", null), equalTo(version));
263264
assertThat(settings.getAsVersion("index.version.upgraded", null), equalTo(upgraded));
265+
assertThat(settings.get("index.soft_deletes.enabled"), equalTo("true"));
264266
});
265267
}
266268

@@ -321,6 +323,15 @@ public void testPrepareResizeIndexSettingsSimilaritySettings() {
321323

322324
}
323325

326+
public void testDoNotOverrideSoftDeletesSettingOnResize() {
327+
runPrepareResizeIndexSettingsTest(
328+
Settings.builder().put("index.soft_deletes.enabled", "false").build(),
329+
Settings.builder().put("index.soft_deletes.enabled", "true").build(),
330+
Collections.emptyList(),
331+
randomBoolean(),
332+
settings -> assertThat(settings.get("index.soft_deletes.enabled"), equalTo("true")));
333+
}
334+
324335
private void runPrepareResizeIndexSettingsTest(
325336
final Settings sourceSettings,
326337
final Settings requestSettings,

test/framework/src/main/java/org/elasticsearch/index/engine/EngineTestCase.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ protected Settings indexSettings() {
162162
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
163163
.put(IndexSettings.MAX_REFRESH_LISTENERS_PER_SHARD.getKey(),
164164
between(10, 10 * IndexSettings.MAX_REFRESH_LISTENERS_PER_SHARD.get(Settings.EMPTY)))
165-
//norelease - AwaitsFix: https://github.com/elastic/elasticsearch/issues/33321
166-
.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), false)
165+
.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), randomBoolean())
167166
.put(IndexSettings.INDEX_SOFT_DELETES_RETENTION_OPERATIONS_SETTING.getKey(),
168167
randomBoolean() ? IndexSettings.INDEX_SOFT_DELETES_RETENTION_OPERATIONS_SETTING.get(Settings.EMPTY) : between(0, 1000))
169168
.build();

test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -723,8 +723,7 @@ public Settings indexSettings() {
723723
}
724724
// always default delayed allocation to 0 to make sure we have tests are not delayed
725725
builder.put(UnassignedInfo.INDEX_DELAYED_NODE_LEFT_TIMEOUT_SETTING.getKey(), 0);
726-
//norelease - AwaitsFix: https://github.com/elastic/elasticsearch/issues/33321
727-
builder.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), false);
726+
builder.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), randomBoolean());
728727
if (randomBoolean()) {
729728
builder.put(IndexSettings.INDEX_SOFT_DELETES_RETENTION_OPERATIONS_SETTING.getKey(), between(0, 1000));
730729
}

test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ protected void startNode(long seed) throws Exception {
9292
.preparePutTemplate("random-soft-deletes-template")
9393
.setPatterns(Collections.singletonList("*"))
9494
.setOrder(0)
95-
//norelease - AwaitsFix: https://github.com/elastic/elasticsearch/issues/33321
96-
.setSettings(Settings.builder().put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), false)
95+
.setSettings(Settings.builder().put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), randomBoolean())
9796
.put(IndexSettings.INDEX_SOFT_DELETES_RETENTION_OPERATIONS_SETTING.getKey(),
9897
randomBoolean() ? IndexSettings.INDEX_SOFT_DELETES_RETENTION_OPERATIONS_SETTING.get(Settings.EMPTY) : between(0, 1000))
9998
).get();

0 commit comments

Comments
 (0)