Browse Source

Auto-expand replicated closed indices (#48973)

Fixes a bug where replicated closed indices were not being auto-expanded.
Yannick Welsch 6 years ago
parent
commit
049e122e8f

+ 3 - 1
server/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java

@@ -29,6 +29,8 @@ import java.util.List;
 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 final class AutoExpandReplicas {
         Map<Integer, List<String>> 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()) {

+ 33 - 0
server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java

@@ -21,6 +21,7 @@ package org.elasticsearch.indices.settings;
 
 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 class UpdateNumberOfReplicasIT extends ESIntegTestCase {
         assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1));
         assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2));
 
+        if (randomBoolean()) {
+            assertAcked(client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL));
+
+            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 class UpdateNumberOfReplicasIT extends ESIntegTestCase {
         assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1));
         assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2));
 
+        if (randomBoolean()) {
+            assertAcked(client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL));
+
+            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");