Skip to content

Commit

Permalink
create index without current cluster state
Browse files Browse the repository at this point in the history
  • Loading branch information
albertzaharovits committed Aug 28, 2024
1 parent e7d3e59 commit 751e2a0
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -512,13 +512,18 @@ private ClusterState applyCreateIndexWithTemporaryService(

indexService.getIndexEventListener().beforeIndexAddedToCluster(indexMetadata.getIndex(), indexMetadata.getSettings());

ClusterState updated = clusterStateCreateIndex(
currentState,
ClusterState.Builder updatedClusterStateBuilder = ClusterState.builder(currentState);
clusterStateCreateIndex(
currentState.metadata(),
currentState.getBlocks(),
currentState.routingTable(),
request.blocks(),
indexMetadata,
metadataTransformer,
allocationService.getShardRoutingRoleStrategy()
allocationService.getShardRoutingRoleStrategy(),
updatedClusterStateBuilder
);
ClusterState updated = updatedClusterStateBuilder.build();
if (request.performReroute()) {
updated = allocationService.reroute(updated, "index [" + indexMetadata.getIndex().getName() + "] created", rerouteListener);
}
Expand Down Expand Up @@ -1229,31 +1234,33 @@ public static List<AliasMetadata> resolveAndValidateAliases(
* Creates the index into the cluster state applying the provided blocks. The final cluster state will contain an updated routing
* table based on the live nodes.
*/
static ClusterState clusterStateCreateIndex(
ClusterState currentState,
static void clusterStateCreateIndex(
Metadata currentMetadata,
ClusterBlocks currentClusterBlocks,
RoutingTable currentRoutingTable,
Set<ClusterBlock> clusterBlocks,
IndexMetadata indexMetadata,
BiConsumer<Metadata.Builder, IndexMetadata> metadataTransformer,
ShardRoutingRoleStrategy shardRoutingRoleStrategy
ShardRoutingRoleStrategy shardRoutingRoleStrategy,
ClusterState.Builder clusterStateBuilder
) {
final Metadata newMetadata;
if (metadataTransformer != null) {
Metadata.Builder builder = Metadata.builder(currentState.metadata()).put(indexMetadata, false);
Metadata.Builder builder = Metadata.builder(currentMetadata).put(indexMetadata, false);
metadataTransformer.accept(builder, indexMetadata);
newMetadata = builder.build();
} else {
newMetadata = currentState.metadata().withAddedIndex(indexMetadata);
newMetadata = currentMetadata.withAddedIndex(indexMetadata);
}

String indexName = indexMetadata.getIndex().getName();
ClusterBlocks.Builder blocks = createClusterBlocksBuilder(currentState, indexName, clusterBlocks);
ClusterBlocks.Builder blocks = createClusterBlocksBuilder(currentClusterBlocks, indexName, clusterBlocks);
blocks.updateBlocks(indexMetadata);

ClusterState updatedState = ClusterState.builder(currentState).blocks(blocks).metadata(newMetadata).build();
RoutingTable.Builder routingTableBuilder = RoutingTable.builder(shardRoutingRoleStrategy, currentRoutingTable)
.addAsNew(newMetadata.index(indexName));

RoutingTable.Builder routingTableBuilder = RoutingTable.builder(shardRoutingRoleStrategy, updatedState.routingTable())
.addAsNew(updatedState.metadata().index(indexName));
return ClusterState.builder(updatedState).routingTable(routingTableBuilder.build()).build();
clusterStateBuilder.blocks(blocks).metadata(newMetadata).routingTable(routingTableBuilder);
}

static IndexMetadata buildIndexMetadata(
Expand Down Expand Up @@ -1326,8 +1333,12 @@ private static IndexMetadata.Builder createIndexMetadataBuilder(
return builder;
}

private static ClusterBlocks.Builder createClusterBlocksBuilder(ClusterState currentState, String index, Set<ClusterBlock> blocks) {
ClusterBlocks.Builder blocksBuilder = ClusterBlocks.builder().blocks(currentState.blocks());
private static ClusterBlocks.Builder createClusterBlocksBuilder(
ClusterBlocks currentClusterBlocks,
String index,
Set<ClusterBlock> blocks
) {
ClusterBlocks.Builder blocksBuilder = ClusterBlocks.builder().blocks(currentClusterBlocks);
if (blocks.isEmpty() == false) {
for (ClusterBlock block : blocks) {
blocksBuilder.addIndexBlock(index, block);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -968,11 +968,14 @@ public void testClusterStateCreateIndexThrowsWriteIndexValidationException() thr
expectThrows(
IllegalStateException.class,
() -> clusterStateCreateIndex(
currentClusterState,
currentClusterState.metadata(),
currentClusterState.getBlocks(),
currentClusterState.routingTable(),
Set.of(),
newIndex,
null,
TestShardRoutingRoleStrategies.DEFAULT_ROLE_ONLY
TestShardRoutingRoleStrategies.DEFAULT_ROLE_ONLY,
ClusterState.builder(currentClusterState)
)
).getMessage(),
startsWith("alias [alias1] has more than one write index [")
Expand All @@ -989,13 +992,18 @@ public void testClusterStateCreateIndex() {
.putAlias(AliasMetadata.builder("alias1").writeIndex(true).build())
.build();

ClusterState updatedClusterState = clusterStateCreateIndex(
currentClusterState,
ClusterState.Builder updatedClusterStateBuilder = ClusterState.builder(currentClusterState);
clusterStateCreateIndex(
currentClusterState.metadata(),
currentClusterState.getBlocks(),
currentClusterState.routingTable(),
Set.of(INDEX_READ_ONLY_BLOCK),
newIndexMetadata,
null,
TestShardRoutingRoleStrategies.DEFAULT_ROLE_ONLY
TestShardRoutingRoleStrategies.DEFAULT_ROLE_ONLY,
updatedClusterStateBuilder
);
ClusterState updatedClusterState = updatedClusterStateBuilder.build();
assertThat(updatedClusterState.blocks().getIndexBlockWithId("test", INDEX_READ_ONLY_BLOCK.id()), is(INDEX_READ_ONLY_BLOCK));
assertThat(updatedClusterState.routingTable().index("test"), is(notNullValue()));

Expand Down Expand Up @@ -1035,13 +1043,18 @@ public void testClusterStateCreateIndexWithMetadataTransaction() {
builder.put(IndexMetadata.builder(myIndex).putAlias(AliasMetadata.builder(newAlias.getAlias()).build()));
};

ClusterState updatedClusterState = clusterStateCreateIndex(
currentClusterState,
ClusterState.Builder updatedClusterStateBuilder = ClusterState.builder(currentClusterState);
clusterStateCreateIndex(
currentClusterState.metadata(),
currentClusterState.getBlocks(),
currentClusterState.routingTable(),
Set.of(INDEX_READ_ONLY_BLOCK),
newIndexMetadata,
metadataTransformer,
TestShardRoutingRoleStrategies.DEFAULT_ROLE_ONLY
TestShardRoutingRoleStrategies.DEFAULT_ROLE_ONLY,
updatedClusterStateBuilder
);
ClusterState updatedClusterState = updatedClusterStateBuilder.build();
assertTrue(updatedClusterState.metadata().findAllAliases(new String[] { "my-index" }).containsKey("my-index"));
assertNotNull(updatedClusterState.metadata().findAllAliases(new String[] { "my-index" }).get("my-index"));
assertNotNull(
Expand Down

0 comments on commit 751e2a0

Please sign in to comment.