/** Initializes an index, to be restored from snapshot */ private Builder initializeAsRestore( IndexMetaData indexMetaData, RestoreSource restoreSource, boolean asNew) { if (!shards.isEmpty()) { throw new ElasticSearchIllegalStateException( "trying to initialize an index with fresh shards, but already has shards created"); } for (int shardId = 0; shardId < indexMetaData.numberOfShards(); shardId++) { IndexShardRoutingTable.Builder indexShardRoutingBuilder = new IndexShardRoutingTable.Builder( new ShardId(indexMetaData.index(), shardId), asNew ? false : true); for (int i = 0; i <= indexMetaData.numberOfReplicas(); i++) { indexShardRoutingBuilder.addShard( new ImmutableShardRouting( index, shardId, null, null, i == 0 ? restoreSource : null, i == 0, ShardRoutingState.UNASSIGNED, 0)); } shards.put(shardId, indexShardRoutingBuilder.build()); } return this; }
/** Clears the post allocation flag for the specified shard */ public Builder clearPostAllocationFlag(ShardId shardId) { assert this.index.equals(shardId.index().name()); IndexShardRoutingTable indexShard = shards.get(shardId.id()); shards.put( indexShard.shardId().id(), new IndexShardRoutingTable(indexShard.shardId(), indexShard.shards(), false)); return this; }
public Builder addReplica() { for (IntCursor cursor : shards.keys()) { int shardId = cursor.value; // version 0, will get updated when reroute will happen ImmutableShardRouting shard = new ImmutableShardRouting(index, shardId, null, false, ShardRoutingState.UNASSIGNED, 0); shards.put( shardId, new IndexShardRoutingTable.Builder(shards.get(shard.id())).addShard(shard).build()); } return this; }
/** * Adds a new shard routing (makes a copy of it), with reference data used from the index shard * routing table if it needs to be created. */ public Builder addShard(IndexShardRoutingTable refData, ShardRouting shard) { IndexShardRoutingTable indexShard = shards.get(shard.id()); if (indexShard == null) { indexShard = new IndexShardRoutingTable.Builder(refData.shardId(), refData.primaryAllocatedPostApi()) .addShard(new ImmutableShardRouting(shard)) .build(); } else { indexShard = new IndexShardRoutingTable.Builder(indexShard) .addShard(new ImmutableShardRouting(shard)) .build(); } shards.put(indexShard.shardId().id(), indexShard); return this; }
public Builder removeReplica() { for (IntCursor cursor : shards.keys()) { int shardId = cursor.value; IndexShardRoutingTable indexShard = shards.get(shardId); if (indexShard.replicaShards().isEmpty()) { // nothing to do here! return this; } // re-add all the current ones IndexShardRoutingTable.Builder builder = new IndexShardRoutingTable.Builder( indexShard.shardId(), indexShard.primaryAllocatedPostApi()); for (ShardRouting shardRouting : indexShard) { builder.addShard(new ImmutableShardRouting(shardRouting)); } // first check if there is one that is not assigned to a node, and remove it boolean removed = false; for (ShardRouting shardRouting : indexShard) { if (!shardRouting.primary() && !shardRouting.assignedToNode()) { builder.removeShard(shardRouting); removed = true; break; } } if (!removed) { for (ShardRouting shardRouting : indexShard) { if (!shardRouting.primary()) { builder.removeShard(shardRouting); removed = true; break; } } } shards.put(shardId, builder.build()); } return this; }
public Builder addIndexShard(IndexShardRoutingTable indexShard) { shards.put(indexShard.shardId().id(), indexShard); return this; }