Skip to content

Commit 049e122

Browse files
authored
Auto-expand replicated closed indices (#48973)
Fixes a bug where replicated closed indices were not being auto-expanded.
1 parent 293648b commit 049e122

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import java.util.Map;
3030
import java.util.OptionalInt;
3131

32+
import static org.elasticsearch.cluster.metadata.MetaDataIndexStateService.isIndexVerifiedBeforeClosed;
33+
3234
/**
3335
* This class acts as a functional wrapper around the {@code index.auto_expand_replicas} setting.
3436
* 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<Integer, List<String>> getAutoExpandReplicaChanges(MetaData me
133135
Map<Integer, List<String>> nrReplicasChanged = new HashMap<>();
134136

135137
for (final IndexMetaData indexMetaData : metaData) {
136-
if (indexMetaData.getState() != IndexMetaData.State.CLOSE) {
138+
if (indexMetaData.getState() == IndexMetaData.State.OPEN || isIndexVerifiedBeforeClosed(indexMetaData)) {
137139
AutoExpandReplicas autoExpandReplicas = SETTING.get(indexMetaData.getSettings());
138140
autoExpandReplicas.getDesiredNumberOfReplicas(dataNodeCount).ifPresent(numberOfReplicas -> {
139141
if (numberOfReplicas != indexMetaData.getNumberOfReplicas()) {

server/src/test/java/org/elasticsearch/indices/settings/UpdateNumberOfReplicasIT.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
2323
import org.elasticsearch.action.search.SearchResponse;
24+
import org.elasticsearch.action.support.ActiveShardCount;
2425
import org.elasticsearch.action.support.IndicesOptions;
2526
import org.elasticsearch.cluster.health.ClusterHealthStatus;
2627
import org.elasticsearch.cluster.metadata.IndexMetaData;
@@ -159,6 +160,22 @@ public void testAutoExpandNumberOfReplicas0ToData() throws IOException {
159160
assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1));
160161
assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2));
161162

163+
if (randomBoolean()) {
164+
assertAcked(client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL));
165+
166+
clusterHealth = client().admin().cluster().prepareHealth()
167+
.setWaitForEvents(Priority.LANGUID)
168+
.setWaitForGreenStatus()
169+
.setWaitForActiveShards(numShards.numPrimaries * 2)
170+
.execute().actionGet();
171+
logger.info("--> done cluster health, status {}", clusterHealth.getStatus());
172+
assertThat(clusterHealth.isTimedOut(), equalTo(false));
173+
assertThat(clusterHealth.getStatus(), equalTo(ClusterHealthStatus.GREEN));
174+
assertThat(clusterHealth.getIndices().get("test").getActivePrimaryShards(), equalTo(numShards.numPrimaries));
175+
assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1));
176+
assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2));
177+
}
178+
162179
final long settingsVersion =
163180
client().admin().cluster().prepareState().get().getState().metaData().index("test").getSettingsVersion();
164181

@@ -248,6 +265,22 @@ public void testAutoExpandNumberReplicas1ToData() throws IOException {
248265
assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1));
249266
assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2));
250267

268+
if (randomBoolean()) {
269+
assertAcked(client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.ALL));
270+
271+
clusterHealth = client().admin().cluster().prepareHealth()
272+
.setWaitForEvents(Priority.LANGUID)
273+
.setWaitForGreenStatus()
274+
.setWaitForActiveShards(numShards.numPrimaries * 2)
275+
.execute().actionGet();
276+
logger.info("--> done cluster health, status {}", clusterHealth.getStatus());
277+
assertThat(clusterHealth.isTimedOut(), equalTo(false));
278+
assertThat(clusterHealth.getStatus(), equalTo(ClusterHealthStatus.GREEN));
279+
assertThat(clusterHealth.getIndices().get("test").getActivePrimaryShards(), equalTo(numShards.numPrimaries));
280+
assertThat(clusterHealth.getIndices().get("test").getNumberOfReplicas(), equalTo(1));
281+
assertThat(clusterHealth.getIndices().get("test").getActiveShards(), equalTo(numShards.numPrimaries * 2));
282+
}
283+
251284
final long settingsVersion =
252285
client().admin().cluster().prepareState().get().getState().metaData().index("test").getSettingsVersion();
253286
logger.info("--> add another node, should increase the number of replicas");

0 commit comments

Comments
 (0)