/** 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; }
/** validate based on a meta data, returning failures found */ public List<String> validate(IndexMetaData indexMetaData) { ArrayList<String> failures = new ArrayList<String>(); // check the number of shards if (indexMetaData.numberOfShards() != shards().size()) { Set<Integer> expected = Sets.newHashSet(); for (int i = 0; i < indexMetaData.numberOfShards(); i++) { expected.add(i); } for (IndexShardRoutingTable indexShardRoutingTable : this) { expected.remove(indexShardRoutingTable.shardId().id()); } failures.add("Wrong number of shards in routing table, missing: " + expected); } // check the replicas for (IndexShardRoutingTable indexShardRoutingTable : this) { int routingNumberOfReplicas = indexShardRoutingTable.size() - 1; if (routingNumberOfReplicas != indexMetaData.numberOfReplicas()) { failures.add( "Shard [" + indexShardRoutingTable.shardId().id() + "] routing table has wrong number of replicas, expected [" + indexMetaData.numberOfReplicas() + "], got [" + routingNumberOfReplicas + "]"); } for (ShardRouting shardRouting : indexShardRoutingTable) { if (!shardRouting.index().equals(index())) { failures.add( "shard routing has an index [" + shardRouting.index() + "] that is different than the routing table"); } } } return failures; }
@SuppressForbidden(reason = "Math#abs is trappy") private int shardId( ClusterState clusterState, String index, String type, String id, @Nullable String routing) { final IndexMetaData indexMetaData = indexMetaData(clusterState, index); final Version createdVersion = indexMetaData.getCreationVersion(); final HashFunction hashFunction = indexMetaData.getRoutingHashFunction(); final boolean useType = indexMetaData.getRoutingUseType(); final int hash; if (routing == null) { if (!useType) { hash = hash(hashFunction, id); } else { hash = hash(hashFunction, type, id); } } else { hash = hash(hashFunction, routing); } if (createdVersion.onOrAfter(Version.V_2_0_0)) { return MathUtils.mod(hash, indexMetaData.numberOfShards()); } else { return Math.abs(hash % indexMetaData.numberOfShards()); } }
public DocIndexMetaData(IndexMetaData metaData, TableIdent ident) throws IOException { this.ident = ident; this.metaData = metaData; this.isAlias = !metaData.getIndex().equals(ident.esName()); this.numberOfShards = metaData.numberOfShards(); final Settings settings = metaData.getSettings(); this.numberOfReplicas = NumberOfReplicas.fromSettings(settings); this.aliases = ImmutableSet.copyOf(metaData.aliases().keys().toArray(String.class)); this.defaultMappingMetaData = this.metaData.mappingOrDefault(Constants.DEFAULT_MAPPING_TYPE); if (defaultMappingMetaData == null) { this.defaultMappingMap = new HashMap<>(); } else { this.defaultMappingMap = this.defaultMappingMetaData.sourceAsMap(); } this.tableParameters = TableParameterInfo.tableParametersFromIndexMetaData(metaData); prepareCrateMeta(); }
@Test public void testSimpleJsonFromAndTo() throws IOException { MetaData metaData = newMetaDataBuilder() .maxNumberOfShardsPerNode(2) .put(newIndexMetaDataBuilder("test1").numberOfShards(1).numberOfReplicas(2)) .put( newIndexMetaDataBuilder("test2") .settings(settingsBuilder().put("setting1", "value1").put("setting2", "value2")) .numberOfShards(2) .numberOfReplicas(3)) .put( newIndexMetaDataBuilder("test3") .numberOfShards(1) .numberOfReplicas(2) .putMapping("mapping1", MAPPING_SOURCE1)) .put( newIndexMetaDataBuilder("test4") .settings(settingsBuilder().put("setting1", "value1").put("setting2", "value2")) .numberOfShards(1) .numberOfReplicas(2) .putMapping("mapping1", MAPPING_SOURCE1) .putMapping("mapping2", MAPPING_SOURCE2)) .build(); String metaDataSource = MetaData.Builder.toJson(metaData); System.out.println("ToJson: " + metaDataSource); MetaData parsedMetaData = MetaData.Builder.fromJson( Jackson.defaultJsonFactory().createJsonParser(metaDataSource), null); assertThat(parsedMetaData.maxNumberOfShardsPerNode(), equalTo(2)); IndexMetaData indexMetaData = metaData.index("test1"); assertThat(indexMetaData.numberOfShards(), equalTo(1)); assertThat(indexMetaData.numberOfReplicas(), equalTo(2)); assertThat(indexMetaData.settings().getAsMap().size(), equalTo(2)); assertThat(indexMetaData.mappings().size(), equalTo(0)); indexMetaData = metaData.index("test2"); assertThat(indexMetaData.numberOfShards(), equalTo(2)); assertThat(indexMetaData.numberOfReplicas(), equalTo(3)); assertThat(indexMetaData.settings().getAsMap().size(), equalTo(4)); assertThat(indexMetaData.settings().get("setting1"), equalTo("value1")); assertThat(indexMetaData.settings().get("setting2"), equalTo("value2")); assertThat(indexMetaData.mappings().size(), equalTo(0)); indexMetaData = metaData.index("test3"); assertThat(indexMetaData.numberOfShards(), equalTo(1)); assertThat(indexMetaData.numberOfReplicas(), equalTo(2)); assertThat(indexMetaData.settings().getAsMap().size(), equalTo(2)); assertThat(indexMetaData.mappings().size(), equalTo(1)); assertThat(indexMetaData.mappings().get("mapping1"), equalTo(MAPPING_SOURCE1)); indexMetaData = metaData.index("test4"); assertThat(indexMetaData.numberOfShards(), equalTo(1)); assertThat(indexMetaData.numberOfReplicas(), equalTo(2)); assertThat(indexMetaData.settings().getAsMap().size(), equalTo(4)); assertThat(indexMetaData.settings().get("setting1"), equalTo("value1")); assertThat(indexMetaData.settings().get("setting2"), equalTo("value2")); assertThat(indexMetaData.mappings().size(), equalTo(2)); assertThat(indexMetaData.mappings().get("mapping1"), equalTo(MAPPING_SOURCE1)); assertThat(indexMetaData.mappings().get("mapping2"), equalTo(MAPPING_SOURCE2)); }
private ClusterHealthResponse clusterHealth(ClusterHealthRequest request) { ClusterState clusterState = clusterService.state(); RoutingTableValidation validation = clusterState.routingTable().validate(clusterState.metaData()); ClusterHealthResponse response = new ClusterHealthResponse(clusterName.value(), validation.failures()); response.numberOfNodes = clusterState.nodes().size(); response.numberOfDataNodes = clusterState.nodes().dataNodes().size(); for (String index : clusterState.metaData().concreteIndices(request.indices())) { IndexRoutingTable indexRoutingTable = clusterState.routingTable().index(index); IndexMetaData indexMetaData = clusterState.metaData().index(index); if (indexRoutingTable == null) { continue; } ClusterIndexHealth indexHealth = new ClusterIndexHealth( index, indexMetaData.numberOfShards(), indexMetaData.numberOfReplicas(), validation.indexFailures(indexMetaData.index())); for (IndexShardRoutingTable shardRoutingTable : indexRoutingTable) { ClusterShardHealth shardHealth = new ClusterShardHealth(shardRoutingTable.shardId().id()); for (ShardRouting shardRouting : shardRoutingTable) { if (shardRouting.active()) { shardHealth.activeShards++; if (shardRouting.relocating()) { // the shard is relocating, the one he is relocating to will be in initializing state, // so we don't count it shardHealth.relocatingShards++; } if (shardRouting.primary()) { shardHealth.primaryActive = true; } } else if (shardRouting.initializing()) { shardHealth.initializingShards++; } else if (shardRouting.unassigned()) { shardHealth.unassignedShards++; } } if (shardHealth.primaryActive) { if (shardHealth.activeShards == shardRoutingTable.size()) { shardHealth.status = ClusterHealthStatus.GREEN; } else { shardHealth.status = ClusterHealthStatus.YELLOW; } } else { shardHealth.status = ClusterHealthStatus.RED; } indexHealth.shards.put(shardHealth.id(), shardHealth); } for (ClusterShardHealth shardHealth : indexHealth) { if (shardHealth.primaryActive()) { indexHealth.activePrimaryShards++; } indexHealth.activeShards += shardHealth.activeShards; indexHealth.relocatingShards += shardHealth.relocatingShards; indexHealth.initializingShards += shardHealth.initializingShards; indexHealth.unassignedShards += shardHealth.unassignedShards; } // update the index status indexHealth.status = ClusterHealthStatus.GREEN; if (!indexHealth.validationFailures().isEmpty()) { indexHealth.status = ClusterHealthStatus.RED; } else if (indexHealth .shards() .isEmpty()) { // might be since none has been created yet (two phase index creation) indexHealth.status = ClusterHealthStatus.RED; } else { for (ClusterShardHealth shardHealth : indexHealth) { if (shardHealth.status() == ClusterHealthStatus.RED) { indexHealth.status = ClusterHealthStatus.RED; break; } if (shardHealth.status() == ClusterHealthStatus.YELLOW) { indexHealth.status = ClusterHealthStatus.YELLOW; } } } response.indices.put(indexHealth.index(), indexHealth); } for (ClusterIndexHealth indexHealth : response) { response.activePrimaryShards += indexHealth.activePrimaryShards; response.activeShards += indexHealth.activeShards; response.relocatingShards += indexHealth.relocatingShards; response.initializingShards += indexHealth.initializingShards; response.unassignedShards += indexHealth.unassignedShards; } response.status = ClusterHealthStatus.GREEN; if (!response.validationFailures().isEmpty()) { response.status = ClusterHealthStatus.RED; } else if (clusterState .blocks() .hasGlobalBlock(GatewayService.NOT_RECOVERED_FROM_GATEWAY_BLOCK)) { response.status = ClusterHealthStatus.RED; } else { for (ClusterIndexHealth indexHealth : response) { if (indexHealth.status() == ClusterHealthStatus.RED) { response.status = ClusterHealthStatus.RED; break; } if (indexHealth.status() == ClusterHealthStatus.YELLOW) { response.status = ClusterHealthStatus.YELLOW; } } } return response; }