diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java index 787e5a9d8f90e..68906e8661967 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java @@ -819,7 +819,9 @@ static int getIndexNumberOfRoutingShards(Settings indexSettings, @Nullable Index // in this case we either have no index to recover from or // we have a source index with 1 shard and without an explicit split factor // or one that is valid in that case we can split into whatever and auto-generate a new factor. - if (IndexMetadata.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.exists(indexSettings)) { + // (Don't use IndexMetadata.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.get(indexSettings) here, otherwise + // we get the default value when `null` has been provided as value) + if (indexSettings.get(IndexMetadata.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.getKey()) != null) { routingNumShards = IndexMetadata.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.get(indexSettings); } else { routingNumShards = calculateNumRoutingShards(numTargetShards, indexVersionCreated); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java index 5da822595a037..e383c083ce03f 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexServiceTests.java @@ -900,6 +900,29 @@ public void testGetIndexNumberOfRoutingShardsWhenExplicitlyConfigured() { assertThat(targetRoutingNumberOfShards, is(9)); } + public void testGetIndexNumberOfRoutingShardsNullVsNotDefined() { + int numberOfPrimaryShards = randomIntBetween(1, 16); + Settings indexSettings = settings(Version.CURRENT) + .put(INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.getKey(), (String) null) + .put(INDEX_NUMBER_OF_SHARDS_SETTING.getKey(), numberOfPrimaryShards) + .build(); + int targetRoutingNumberOfShardsWithNull = getIndexNumberOfRoutingShards(indexSettings, null); + indexSettings = settings(Version.CURRENT) + .put(INDEX_NUMBER_OF_SHARDS_SETTING.getKey(), numberOfPrimaryShards) + .build(); + int targetRoutingNumberOfShardsWithNotDefined = getIndexNumberOfRoutingShards(indexSettings, null); + assertThat(targetRoutingNumberOfShardsWithNull, is(targetRoutingNumberOfShardsWithNotDefined)); + } + + public void testGetIndexNumberOfRoutingShardsNull() { + Settings indexSettings = settings(Version.CURRENT) + .put(INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.getKey(), (String) null) + .put(INDEX_NUMBER_OF_SHARDS_SETTING.getKey(), 2) + .build(); + int targetRoutingNumberOfShardsWithNull = getIndexNumberOfRoutingShards(indexSettings, null); + assertThat(targetRoutingNumberOfShardsWithNull, is(1024)); + } + public void testGetIndexNumberOfRoutingShardsYieldsSourceNumberOfShards() { Settings indexSettings = Settings.builder() .put(INDEX_NUMBER_OF_SHARDS_SETTING.getKey(), 3)