Skip to content

Commit 0ecee87

Browse files
committed
resize without soft-deletes
1 parent 1c08c1d commit 0ecee87

File tree

4 files changed

+86
-3
lines changed

4 files changed

+86
-3
lines changed

qa/full-cluster-restart/src/test/java/org/elasticsearch/upgrades/FullClusterRestartIT.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,9 @@ public void testShrink() throws IOException {
279279
mappingsAndSettings.startObject("settings");
280280
{
281281
mappingsAndSettings.field("index.number_of_shards", 5);
282+
if (minimumNodeVersion().before(Version.V_8_0_0) && randomBoolean()) {
283+
mappingsAndSettings.field(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), Boolean.toString(randomBoolean()));
284+
}
282285
}
283286
mappingsAndSettings.endObject();
284287
}
@@ -350,6 +353,9 @@ public void testShrinkAfterUpgrade() throws IOException {
350353
// the default number of shards is now one so we have to set the number of shards to be more than one explicitly
351354
mappingsAndSettings.startObject("settings");
352355
mappingsAndSettings.field("index.number_of_shards", 5);
356+
if (minimumNodeVersion().before(Version.V_8_0_0) && randomBoolean()) {
357+
mappingsAndSettings.field(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), Boolean.toString(randomBoolean()));
358+
}
353359
mappingsAndSettings.endObject();
354360
}
355361
mappingsAndSettings.endObject();
@@ -1310,4 +1316,77 @@ public void testTurnOffTranslogRetentionAfterUpgraded() throws Exception {
13101316
ensurePeerRecoveryRetentionLeasesRenewedAndSynced(index);
13111317
}
13121318
}
1319+
1320+
public void testResize() throws Exception {
1321+
int numDocs;
1322+
if (isRunningAgainstOldCluster()) {
1323+
final Settings.Builder settings = Settings.builder()
1324+
.put(IndexMetaData.INDEX_NUMBER_OF_SHARDS_SETTING.getKey(), 3)
1325+
.put(IndexMetaData.INDEX_NUMBER_OF_REPLICAS_SETTING.getKey(), 1);
1326+
if (minimumNodeVersion().before(Version.V_8_0_0) && randomBoolean()) {
1327+
settings.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), false);
1328+
}
1329+
createIndex(index, settings.build());
1330+
numDocs = randomIntBetween(10, 1000);
1331+
for (int i = 0; i < numDocs; i++) {
1332+
indexDocument(Integer.toString(i));
1333+
if (rarely()) {
1334+
flush(index, randomBoolean());
1335+
}
1336+
}
1337+
saveInfoDocument("num_doc_" + index, Integer.toString(numDocs));
1338+
ensureGreen(index);
1339+
} else {
1340+
ensureGreen(index);
1341+
numDocs = Integer.parseInt(loadInfoDocument("num_doc_" + index));
1342+
int moreDocs = randomIntBetween(0, 100);
1343+
for (int i = 0; i < moreDocs; i++) {
1344+
indexDocument(Integer.toString(numDocs + i));
1345+
if (rarely()) {
1346+
flush(index, randomBoolean());
1347+
}
1348+
}
1349+
Request updateSettingsRequest = new Request("PUT", "/" + index + "/_settings");
1350+
updateSettingsRequest.setJsonEntity("{\"settings\": {\"index.blocks.write\": true}}");
1351+
client().performRequest(updateSettingsRequest);
1352+
{
1353+
final String target = index + "_shrunken";
1354+
Request shrinkRequest = new Request("PUT", "/" + index + "/_shrink/" + target);
1355+
Settings.Builder settings = Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1);
1356+
if (randomBoolean()) {
1357+
settings.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), true);
1358+
}
1359+
shrinkRequest.setJsonEntity("{\"settings\":" + Strings.toString(settings.build()) + "}");
1360+
client().performRequest(shrinkRequest);
1361+
ensureGreenLongWait(target);
1362+
assertNumHits(target, numDocs + moreDocs, 1);
1363+
}
1364+
{
1365+
final String target = index + "_split";
1366+
Settings.Builder settings = Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 6);
1367+
if (randomBoolean()) {
1368+
settings.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), true);
1369+
}
1370+
Request splitRequest = new Request("PUT", "/" + index + "/_split/" + target);
1371+
splitRequest.setJsonEntity("{\"settings\":" + Strings.toString(settings.build()) + "}");
1372+
client().performRequest(splitRequest);
1373+
ensureGreenLongWait(target);
1374+
assertNumHits(target, numDocs + moreDocs, 6);
1375+
}
1376+
{
1377+
final String target = index + "_cloned";
1378+
client().performRequest(new Request("PUT", "/" + index + "/_clone/" + target));
1379+
ensureGreenLongWait(target);
1380+
assertNumHits(target, numDocs + moreDocs, 3);
1381+
}
1382+
}
1383+
}
1384+
1385+
private void assertNumHits(String index, int numHits, int totalShards) throws IOException {
1386+
Map<String, Object> resp = entityAsMap(client().performRequest(new Request("GET", "/" + index + "/_search")));
1387+
assertNoFailures(resp);
1388+
assertThat(XContentMapValues.extractValue("_shards.total", resp), equalTo(totalShards));
1389+
assertThat(XContentMapValues.extractValue("_shards.successful", resp), equalTo(totalShards));
1390+
assertThat(extractTotalHits(resp), equalTo(numHits));
1391+
}
13131392
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,9 @@ static CreateIndexClusterStateUpdateRequest prepareCreateIndexRequest(final Resi
175175
throw new IllegalArgumentException("cannot provide index.number_of_routing_shards on resize");
176176
}
177177
}
178-
if (IndexSettings.INDEX_SOFT_DELETES_SETTING.get(targetIndexSettings) == false) {
178+
if (IndexSettings.INDEX_SOFT_DELETES_SETTING.get(metaData.getSettings()) &&
179+
IndexSettings.INDEX_SOFT_DELETES_SETTING.exists(targetIndexSettings) &&
180+
IndexSettings.INDEX_SOFT_DELETES_SETTING.get(targetIndexSettings) == false) {
179181
throw new IllegalArgumentException("Can't disable [index.soft_deletes.enabled] setting on resize");
180182
}
181183
String cause = resizeRequest.getResizeType().name().toLowerCase(Locale.ROOT) + "_index";

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ static Settings aggregateIndexSettings(ClusterState currentState, CreateIndexClu
435435
* that will be used to create this index.
436436
*/
437437
MetaDataCreateIndexService.checkShardLimit(indexSettings, currentState);
438-
if (IndexSettings.INDEX_SOFT_DELETES_SETTING.get(indexSettings) == false) {
438+
if (IndexSettings.INDEX_SOFT_DELETES_SETTING.get(indexSettings) == false
439+
&& IndexMetaData.SETTING_INDEX_VERSION_CREATED.get(settings).onOrAfter(Version.V_8_0_0)) {
439440
throw new IllegalArgumentException("Creating indices with soft-deletes disabled is no longer supported. " +
440441
"Please do not specify a value for setting [index.soft_deletes.enabled].");
441442
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,8 @@ public void testRejectWithSoftDeletesDisabled() {
831831
request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test");
832832
request.settings(Settings.builder().put(INDEX_SOFT_DELETES_SETTING.getKey(), false).build());
833833
aggregateIndexSettings(ClusterState.EMPTY_STATE, request, List.of(), Map.of(),
834-
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS);
834+
null, Settings.builder().put(SETTING_VERSION_CREATED, Version.CURRENT).build(),
835+
IndexScopedSettings.DEFAULT_SCOPED_SETTINGS);
835836
});
836837
assertThat(error.getMessage(), equalTo("Creating indices with soft-deletes disabled is no longer supported. "
837838
+ "Please do not specify a value for setting [index.soft_deletes.enabled]."));

0 commit comments

Comments
 (0)