From dbb72afca7fb040c21a3a4c39438d78f5cb2c231 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Mon, 11 Nov 2019 23:24:19 +0100 Subject: [PATCH 1/2] Auto-expand replicated closed indices --- .../cluster/metadata/AutoExpandReplicas.java | 4 ++- .../settings/UpdateNumberOfReplicasIT.java | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java b/server/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java index 1c8a61106697e..16c48137be7da 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java @@ -29,6 +29,8 @@ import java.util.Map; import java.util.OptionalInt; +import static org.elasticsearch.cluster.metadata.MetaDataIndexStateService.isIndexVerifiedBeforeClosed; + /** * This class acts as a functional wrapper around the {@code index.auto_expand_replicas} setting. * This setting or rather it's value is expanded into a min and max value which requires special handling @@ -133,7 +135,7 @@ public static Map> getAutoExpandReplicaChanges(MetaData me Map> nrReplicasChanged = new HashMap<>(); for (final IndexMetaData indexMetaData : metaData) { - if (indexMetaData.getState() != IndexMetaData.State.CLOSE) { + if (indexMetaData.getState() == IndexMetaData.State.OPEN || isIndexVerifiedBeforeClosed(indexMetaData)) { AutoExpandReplicas autoExpandReplicas = SETTING.get(indexMetaData.getSettings()); autoExpandReplicas.getDesiredNumberOfReplicas(dataNodeCount).ifPresent(numberOfReplicas -> { if (numberOfReplicas != indexMetaData.getNumberOfReplicas()) { diff --git a/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java b/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java index bf6f68379e062..16c83b627812d 100644 --- a/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java +++ b/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java @@ -21,6 +21,7 @@ import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.support.ActiveShardCount; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.cluster.health.ClusterHealthStatus; import org.elasticsearch.cluster.metadata.IndexMetaData; @@ -159,6 +160,22 @@ public void testAutoExpandNumberOfReplicas0ToData() throws IOException { assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1)); assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2)); + if (randomBoolean()) { + client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL).get(); + + clusterHealth = client().admin().cluster().prepareHealth() + .setWaitForEvents(Priority.LANGUID) + .setWaitForGreenStatus() + .setWaitForActiveShards(numShards.numPrimaries * 2) + .execute().actionGet(); + logger.info("--> done cluster health, status {}", clusterHealth.getStatus()); + assertThat(clusterHealth.isTimedOut(), equalTo(false)); + assertThat(clusterHealth.getStatus(), equalTo(ClusterHealthStatus.GREEN)); + assertThat(clusterHealth.getIndices().get("test").getActivePrimaryShards(), equalTo(numShards.numPrimaries)); + assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1)); + assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2)); + } + final long settingsVersion = client().admin().cluster().prepareState().get().getState().metaData().index("test").getSettingsVersion(); @@ -248,6 +265,22 @@ public void testAutoExpandNumberReplicas1ToData() throws IOException { assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1)); assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2)); + if (randomBoolean()) { + client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL).get(); + + clusterHealth = client().admin().cluster().prepareHealth() + .setWaitForEvents(Priority.LANGUID) + .setWaitForGreenStatus() + .setWaitForActiveShards(numShards.numPrimaries * 2) + .execute().actionGet(); + logger.info("--> done cluster health, status {}", clusterHealth.getStatus()); + assertThat(clusterHealth.isTimedOut(), equalTo(false)); + assertThat(clusterHealth.getStatus(), equalTo(ClusterHealthStatus.GREEN)); + assertThat(clusterHealth.getIndices().get("test").getActivePrimaryShards(), equalTo(numShards.numPrimaries)); + assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1)); + assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2)); + } + final long settingsVersion = client().admin().cluster().prepareState().get().getState().metaData().index("test").getSettingsVersion(); logger.info("--> add another node, should increase the number of replicas"); From c86a2caab2052e40833a0ccb65edf72070f2e956 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Tue, 12 Nov 2019 09:47:23 +0100 Subject: [PATCH 2/2] assertAcked --- .../indices/settings/UpdateNumberOfReplicasIT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java b/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java index 16c83b627812d..9ff522df7ce1b 100644 --- a/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java +++ b/server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java @@ -161,7 +161,7 @@ public void testAutoExpandNumberOfReplicas0ToData() throws IOException { assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2)); if (randomBoolean()) { - client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL).get(); + assertAcked(client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL)); clusterHealth = client().admin().cluster().prepareHealth() .setWaitForEvents(Priority.LANGUID) @@ -266,7 +266,7 @@ public void testAutoExpandNumberReplicas1ToData() throws IOException { assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2)); if (randomBoolean()) { - client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL).get(); + assertAcked(client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL)); clusterHealth = client().admin().cluster().prepareHealth() .setWaitForEvents(Priority.LANGUID)