2727import org .elasticsearch .core .Nullable ;
2828import org .elasticsearch .core .SuppressForbidden ;
2929import org .elasticsearch .core .TimeValue ;
30+ import org .elasticsearch .index .IndexNotFoundException ;
3031import org .elasticsearch .indices .IndicesService ;
3132import org .elasticsearch .indices .InvalidIndexNameException ;
3233import org .elasticsearch .logging .LogManager ;
@@ -134,8 +135,8 @@ public void onFailure(Exception e) {
134135 }
135136
136137 public ClusterState applyAutoshardIndexRequest (
137- ClusterState currentState ,
138- AutoshardIndexClusterStateUpdateRequest request ,
138+ final ClusterState currentState ,
139+ final AutoshardIndexClusterStateUpdateRequest request ,
139140 boolean silent ,
140141 final ActionListener <Void > rerouteListener
141142 ) {
@@ -144,20 +145,11 @@ public ClusterState applyAutoshardIndexRequest(
144145 int sourceNumShards = sourceMetadata .getNumberOfShards ();
145146 int targetNumShards = sourceNumShards * 2 ;
146147
147- /*
148- Settings.Builder settingsBuilder = Settings.builder().put(sourceMetadata.getSettings());
149- settingsBuilder.remove(IndexMetadata.SETTING_NUMBER_OF_SHARDS);
150- settingsBuilder.put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, targetNumShards);
151-
152- final Map<Index, Settings> updates = Maps.newHashMapWithExpectedSize(1);
153- updates.put(sourceMetadata.getIndex(), settingsBuilder.build());
154- final Metadata newMetadata = currentState.metadata().withIndexSettingsUpdates(updates);
155- */
156-
157148 var routingTableBuilder = RoutingTable .builder (allocationService .getShardRoutingRoleStrategy (), currentState .routingTable ())
158149 .updateNumberOfShards (targetNumShards , indexName );
159150
160- Metadata newMetadata = Metadata .builder (currentState .metadata ()).updateNumberOfShards (targetNumShards , indexName ).build ();
151+ // Metadata newMetadata = Metadata.builder(currentState.metadata()).updateNumberOfShards(targetNumShards, indexName).build();
152+ Metadata newMetadata = incrementNumberOfShards (currentState , targetNumShards , indexName ).build ();
161153 ClusterState updated = ClusterState .builder (currentState )
162154 .incrementVersion ()
163155 .routingTable (routingTableBuilder )
@@ -167,6 +159,32 @@ public ClusterState applyAutoshardIndexRequest(
167159 return updated ;
168160 }
169161
162+ /**
163+ * Builder to update numberOfShards of an Index.
164+ * The new shard count must be a multiple of the original shardcount.
165+ * We do not support shrinking the shard count.
166+ * @param currentState Current clusterstate
167+ * @param numberOfShards Target number of shards
168+ * @param index Index whose shard count is being modified
169+ * @return
170+ */
171+ public static Metadata .Builder incrementNumberOfShards (
172+ final ClusterState currentState ,
173+ final int numberOfShards ,
174+ final String index ) {
175+ Metadata .Builder metadataBuilder = Metadata .builder (currentState .metadata ());
176+ IndexMetadata indexMetadata = metadataBuilder .get (index );
177+ if (indexMetadata == null ) {
178+ throw new IndexNotFoundException (index );
179+ }
180+ metadataBuilder .put (
181+ IndexMetadata .builder (indexMetadata )
182+ .settingsVersion (indexMetadata .getSettingsVersion () + 1 )
183+ .reshardAddShards (numberOfShards )
184+ );
185+ return metadataBuilder ;
186+ }
187+
170188 @ SuppressForbidden (reason = "legacy usage of unbatched task" ) // TODO add support for batching here
171189 private void submitUnbatchedTask (@ SuppressWarnings ("SameParameterValue" ) String source , ClusterStateUpdateTask task ) {
172190 clusterService .submitUnbatchedStateUpdateTask (source , task );
0 commit comments