Skip to content

Commit 14d99a4

Browse files
committed
Unstage files
1 parent 27d1f61 commit 14d99a4

File tree

4 files changed

+58
-41
lines changed

4 files changed

+58
-41
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2169,23 +2169,26 @@ public Builder updateNumberOfReplicas(final int numberOfReplicas, final String[]
21692169
return this;
21702170
}
21712171

2172-
/* Gives the following exception:
2173-
java.lang.IllegalStateException: primaryTerms length is [1] but should be equal to number of shards [2]
2172+
2173+
/*
2174+
* Builder to update numberOfShards of an Index.
2175+
* The new shard count must be a multiple of the original shardcount.
2176+
* We do not support shrinking the shard count.
2177+
* @param numberOfShards Target number of shards
2178+
* @param index Index whose shard count is being modified
2179+
* @return
21742180
*/
2181+
/*
21752182
public Builder updateNumberOfShards(final int numberOfShards, final String index) {
21762183
IndexMetadata indexMetadata = this.indices.get(index);
21772184
if (indexMetadata == null) {
21782185
throw new IndexNotFoundException(index);
21792186
}
2180-
// IndexMetadata newIndexMetadata = indexMetadata.withIncrementedPrimaryShards(numberOfShards);
2181-
// put(IndexMetadata.builder(newIndexMetadata).numberOfShards(numberOfShards));
2182-
put(
2183-
IndexMetadata.builder(indexMetadata)
2184-
.settingsVersion(indexMetadata.getSettingsVersion() + 1)
2185-
.reshardAddShards(numberOfShards)
2186-
);
2187+
// Note that IndexMetadata version is already updated by put
2188+
put(IndexMetadata.builder(indexMetadata).reshardAddShards(numberOfShards));
21872189
return this;
21882190
}
2191+
*/
21892192

21902193
public Builder coordinationMetadata(CoordinationMetadata coordinationMetadata) {
21912194
this.coordinationMetadata = coordinationMetadata;

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

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.elasticsearch.core.Nullable;
2828
import org.elasticsearch.core.SuppressForbidden;
2929
import org.elasticsearch.core.TimeValue;
30+
import org.elasticsearch.index.IndexNotFoundException;
3031
import org.elasticsearch.indices.IndicesService;
3132
import org.elasticsearch.indices.InvalidIndexNameException;
3233
import 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);

server/src/main/java/org/elasticsearch/cluster/routing/RoutingTable.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -478,15 +478,19 @@ public Builder updateNumberOfShards(final int newShardCount, final String index)
478478
// Add new shards
479479
for (int i = 0; i < numNewShards; i++) {
480480
ShardId shardId = new ShardId(indexRoutingTable.getIndex(), oldShardCount + i);
481-
ShardRouting shardRouting = ShardRouting.newUnassigned(
482-
shardId,
483-
true,
484-
RecoverySource.EmptyStoreRecoverySource.INSTANCE,
485-
new UnassignedInfo(UnassignedInfo.Reason.RESHARD_ADDED, null), // A new Reason needed in UnassignedInfo
486-
ShardRouting.Role.INDEX_ONLY
487-
); // A new role API similar to newReplicaRole() needed in shardRoutingRoleStrategy ?
488481
IndexShardRoutingTable.Builder indexShardRoutingBuilder = IndexShardRoutingTable.builder(shardId);
489-
indexShardRoutingBuilder.addShard(shardRouting);
482+
for (int j = 0; j <= currentNumberOfReplicas; j++) {
483+
boolean primary = j == 0;
484+
ShardRouting shardRouting = ShardRouting.newUnassigned(
485+
shardId,
486+
primary,
487+
// TODO: Will add a SPLIT recovery type for primary
488+
primary ? RecoverySource.EmptyStoreRecoverySource.INSTANCE : RecoverySource.PeerRecoverySource.INSTANCE,
489+
new UnassignedInfo(UnassignedInfo.Reason.RESHARD_ADDED, null),
490+
shardRoutingRoleStrategy.newEmptyRole(j)
491+
);
492+
indexShardRoutingBuilder.addShard(shardRouting);
493+
}
490494
builder.addIndexShard(indexShardRoutingBuilder);
491495
}
492496
// No need to add replicas because no replicas on serverless.

server/src/test/java/org/elasticsearch/cluster/routing/allocation/UpdateNumberofShardsTests.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.elasticsearch.cluster.ESAllocationTestCase;
1616
import org.elasticsearch.cluster.metadata.IndexMetadata;
1717
import org.elasticsearch.cluster.metadata.Metadata;
18+
import org.elasticsearch.cluster.metadata.MetadataAutoshardIndexService;
1819
import org.elasticsearch.cluster.node.DiscoveryNodes;
1920
import org.elasticsearch.cluster.routing.RoutingTable;
2021
import org.elasticsearch.cluster.routing.ShardRouting;
@@ -67,18 +68,9 @@ public void testUpdateNumberOfShards() {
6768
.updateNumberOfShards(2, index)
6869
.build();
6970

70-
/*
71-
final IndexMetadata sourceIndexMetadata = clusterState.metadata().index(index);
72-
Settings.Builder settingsBuilder = Settings.builder().put(sourceIndexMetadata.getSettings());
73-
settingsBuilder.remove(IndexMetadata.SETTING_NUMBER_OF_SHARDS);
74-
settingsBuilder.put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 2);
7571

76-
final Map<Index, Settings> updates = Maps.newHashMapWithExpectedSize(1);
77-
updates.put(sourceIndexMetadata.getIndex(), settingsBuilder.build());
78-
//final Metadata newMetadata = clusterState.metadata().withIndexSettingsUpdates(updates);
79-
*/
80-
81-
Metadata newMetadata = Metadata.builder(clusterState.metadata()).updateNumberOfShards(2, index).build();
72+
//Metadata newMetadata = Metadata.builder(clusterState.metadata()).updateNumberOfShards(2, index).build();
73+
Metadata newMetadata = MetadataAutoshardIndexService.incrementNumberOfShards(clusterState, 2, index).build();
8274
clusterState = ClusterState.builder(clusterState).routingTable(updatedRoutingTable).metadata(newMetadata).build();
8375

8476
assertThat(clusterState.metadata().index("test").getNumberOfShards(), equalTo(2));

0 commit comments

Comments
 (0)