/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.cluster.metadata;
import org.elasticsearch.common.io.stream.BytesStreamOutput;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.util.set.Sets;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.index.shard.ShardId;
import org.elasticsearch.test.ESTestCase;
import java.io.IOException;
import java.util.Set;
public class IndexMetaDataTests extends ESTestCase {
public void testIndexMetaDataSerialization() throws IOException {
Integer numShard = randomFrom(1, 2, 4, 8, 16);
int numberOfReplicas = randomIntBetween(0, 10);
IndexMetaData metaData = IndexMetaData.builder("foo")
.settings(Settings.builder()
.put("index.version.created", 1)
.put("index.number_of_shards", numShard)
.put("index.number_of_replicas", numberOfReplicas)
.build())
.creationDate(randomLong())
.primaryTerm(0, 2)
.setRoutingNumShards(32)
.build();
final XContentBuilder builder = JsonXContent.contentBuilder();
builder.startObject();
metaData.toXContent(builder, ToXContent.EMPTY_PARAMS);
builder.endObject();
XContentParser parser = createParser(JsonXContent.jsonXContent, builder.bytes());
final IndexMetaData fromXContentMeta = IndexMetaData.fromXContent(parser);
assertEquals(metaData, fromXContentMeta);
assertEquals(metaData.hashCode(), fromXContentMeta.hashCode());
assertEquals(metaData.getNumberOfReplicas(), fromXContentMeta.getNumberOfReplicas());
assertEquals(metaData.getNumberOfShards(), fromXContentMeta.getNumberOfShards());
assertEquals(metaData.getCreationVersion(), fromXContentMeta.getCreationVersion());
assertEquals(metaData.getRoutingNumShards(), fromXContentMeta.getRoutingNumShards());
assertEquals(metaData.getCreationDate(), fromXContentMeta.getCreationDate());
assertEquals(metaData.getRoutingFactor(), fromXContentMeta.getRoutingFactor());
assertEquals(metaData.primaryTerm(0), fromXContentMeta.primaryTerm(0));
final BytesStreamOutput out = new BytesStreamOutput();
metaData.writeTo(out);
IndexMetaData deserialized = IndexMetaData.readFrom(out.bytes().streamInput());
assertEquals(metaData, deserialized);
assertEquals(metaData.hashCode(), deserialized.hashCode());
assertEquals(metaData.getNumberOfReplicas(), deserialized.getNumberOfReplicas());
assertEquals(metaData.getNumberOfShards(), deserialized.getNumberOfShards());
assertEquals(metaData.getCreationVersion(), deserialized.getCreationVersion());
assertEquals(metaData.getRoutingNumShards(), deserialized.getRoutingNumShards());
assertEquals(metaData.getCreationDate(), deserialized.getCreationDate());
assertEquals(metaData.getRoutingFactor(), deserialized.getRoutingFactor());
assertEquals(metaData.primaryTerm(0), deserialized.primaryTerm(0));
}
public void testGetRoutingFactor() {
int numberOfReplicas = randomIntBetween(0, 10);
IndexMetaData metaData = IndexMetaData.builder("foo")
.settings(Settings.builder()
.put("index.version.created", 1)
.put("index.number_of_shards", 32)
.put("index.number_of_replicas", numberOfReplicas)
.build())
.creationDate(randomLong())
.build();
Integer numShard = randomFrom(1, 2, 4, 8, 16);
int routingFactor = IndexMetaData.getRoutingFactor(metaData, numShard);
assertEquals(routingFactor * numShard, metaData.getNumberOfShards());
Integer brokenNumShards = randomFrom(3, 5, 9, 12, 29, 42, 64);
expectThrows(IllegalArgumentException.class, () -> IndexMetaData.getRoutingFactor(metaData, brokenNumShards));
}
public void testSelectShrinkShards() {
int numberOfReplicas = randomIntBetween(0, 10);
IndexMetaData metaData = IndexMetaData.builder("foo")
.settings(Settings.builder()
.put("index.version.created", 1)
.put("index.number_of_shards", 32)
.put("index.number_of_replicas", numberOfReplicas)
.build())
.creationDate(randomLong())
.build();
Set<ShardId> shardIds = IndexMetaData.selectShrinkShards(0, metaData, 8);
assertEquals(shardIds, Sets.newHashSet(new ShardId(metaData.getIndex(), 0), new ShardId(metaData.getIndex(), 1),
new ShardId(metaData.getIndex(), 2), new ShardId(metaData.getIndex(), 3)));
shardIds = IndexMetaData.selectShrinkShards(1, metaData, 8);
assertEquals(shardIds, Sets.newHashSet(new ShardId(metaData.getIndex(), 4), new ShardId(metaData.getIndex(), 5),
new ShardId(metaData.getIndex(), 6), new ShardId(metaData.getIndex(), 7)));
shardIds = IndexMetaData.selectShrinkShards(7, metaData, 8);
assertEquals(shardIds, Sets.newHashSet(new ShardId(metaData.getIndex(), 28), new ShardId(metaData.getIndex(), 29),
new ShardId(metaData.getIndex(), 30), new ShardId(metaData.getIndex(), 31)));
assertEquals("the number of target shards (8) must be greater than the shard id: 8",
expectThrows(IllegalArgumentException.class, () -> IndexMetaData.selectShrinkShards(8, metaData, 8)).getMessage());
}
}