Simplify ShardRouting abstraction
This commit folds ShardRouting, ImmutableShardRouting and MutableShardRouting into ShardRouting. All mutators are package private anyway today so it's just unnecessary abstraction. ShardRoutings are now frozen once they are added to the IndexRoutingTable to prevent modifications outside of the allocation code.
This commit is contained in:
parent
aaa9ee35ea
commit
c57951780e
|
@ -19,7 +19,6 @@
|
|||
|
||||
package org.elasticsearch.action.admin.cluster.shards;
|
||||
|
||||
import org.elasticsearch.cluster.routing.ImmutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.common.io.stream.StreamInput;
|
||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||
|
@ -71,7 +70,7 @@ public class ClusterSearchShardsGroup implements Streamable, ToXContent {
|
|||
shardId = in.readVInt();
|
||||
shards = new ShardRouting[in.readVInt()];
|
||||
for (int i = 0; i < shards.length; i++) {
|
||||
shards[i] = ImmutableShardRouting.readShardRoutingEntry(in, index, shardId);
|
||||
shards[i] = ShardRouting.readShardRoutingEntry(in, index, shardId);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ import java.util.ArrayList;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import static org.elasticsearch.cluster.routing.ImmutableShardRouting.readShardRoutingEntry;
|
||||
import static org.elasticsearch.cluster.routing.ShardRouting.readShardRoutingEntry;
|
||||
|
||||
public class ShardSegments extends BroadcastShardResponse implements Iterable<Segment> {
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ import org.elasticsearch.index.shard.IndexShard;
|
|||
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.elasticsearch.cluster.routing.ImmutableShardRouting.readShardRoutingEntry;
|
||||
import static org.elasticsearch.cluster.routing.ShardRouting.readShardRoutingEntry;
|
||||
|
||||
/**
|
||||
*/
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.elasticsearch.common.io.stream.StreamOutput;
|
|||
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.elasticsearch.cluster.routing.ImmutableShardRouting.readShardRoutingEntry;
|
||||
import static org.elasticsearch.cluster.routing.ShardRouting.readShardRoutingEntry;
|
||||
|
||||
public class ShardUpgradeStatus extends BroadcastShardResponse {
|
||||
|
||||
|
|
|
@ -42,7 +42,6 @@ import org.elasticsearch.indices.IndicesService;
|
|||
import org.elasticsearch.threadpool.ThreadPool;
|
||||
import org.elasticsearch.transport.TransportService;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicReferenceArray;
|
||||
|
||||
|
|
|
@ -38,7 +38,6 @@ import org.elasticsearch.common.inject.Inject;
|
|||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.index.IndexService;
|
||||
import org.elasticsearch.index.engine.Engine;
|
||||
import org.elasticsearch.index.mapper.FieldMapper;
|
||||
import org.elasticsearch.index.mapper.MappedFieldType;
|
||||
import org.elasticsearch.index.mapper.MapperService;
|
||||
import org.elasticsearch.index.shard.IndexShard;
|
||||
|
|
|
@ -43,7 +43,6 @@ import org.elasticsearch.cluster.node.DiscoveryNode;
|
|||
import org.elasticsearch.cluster.routing.*;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.collect.Tuple;
|
||||
import org.elasticsearch.common.compress.CompressedXContent;
|
||||
import org.elasticsearch.common.lease.Releasable;
|
||||
import org.elasticsearch.common.lease.Releasables;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
|
|
|
@ -45,7 +45,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
|
||||
import static org.elasticsearch.cluster.routing.ImmutableShardRouting.readShardRoutingEntry;
|
||||
import static org.elasticsearch.cluster.routing.ShardRouting.readShardRoutingEntry;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -1,396 +0,0 @@
|
|||
/*
|
||||
* 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.routing;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.elasticsearch.Version;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.io.stream.StreamInput;
|
||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||
import org.elasticsearch.common.io.stream.Streamable;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* {@link ImmutableShardRouting} immutably encapsulates information about shard
|
||||
* routings like id, state, version, etc.
|
||||
*/
|
||||
public class ImmutableShardRouting implements Streamable, Serializable, ShardRouting {
|
||||
|
||||
protected String index;
|
||||
|
||||
protected int shardId;
|
||||
|
||||
protected String currentNodeId;
|
||||
|
||||
protected String relocatingNodeId;
|
||||
|
||||
protected boolean primary;
|
||||
|
||||
protected ShardRoutingState state;
|
||||
|
||||
protected long version;
|
||||
|
||||
private transient ShardId shardIdentifier;
|
||||
|
||||
protected RestoreSource restoreSource;
|
||||
|
||||
protected UnassignedInfo unassignedInfo;
|
||||
|
||||
private final transient ImmutableList<ShardRouting> asList;
|
||||
|
||||
ImmutableShardRouting() {
|
||||
this.asList = ImmutableList.of((ShardRouting) this);
|
||||
}
|
||||
|
||||
public ImmutableShardRouting(ShardRouting copy) {
|
||||
this(copy, copy.version());
|
||||
}
|
||||
|
||||
public ImmutableShardRouting(ShardRouting copy, long version) {
|
||||
this(copy.index(), copy.id(), copy.currentNodeId(), copy.relocatingNodeId(), copy.restoreSource(), copy.primary(), copy.state(), version, copy.unassignedInfo());
|
||||
}
|
||||
|
||||
public ImmutableShardRouting(String index, int shardId, String currentNodeId, boolean primary, ShardRoutingState state, long version) {
|
||||
this(index, shardId, currentNodeId, null, primary, state, version);
|
||||
}
|
||||
|
||||
public ImmutableShardRouting(String index, int shardId, String currentNodeId,
|
||||
String relocatingNodeId, boolean primary, ShardRoutingState state, long version) {
|
||||
this(index, shardId, currentNodeId, relocatingNodeId, null, primary, state, version);
|
||||
}
|
||||
|
||||
public ImmutableShardRouting(String index, int shardId, String currentNodeId,
|
||||
String relocatingNodeId, RestoreSource restoreSource, boolean primary, ShardRoutingState state, long version) {
|
||||
this(index, shardId, currentNodeId, relocatingNodeId, restoreSource, primary, state, version, null);
|
||||
}
|
||||
|
||||
public ImmutableShardRouting(String index, int shardId, String currentNodeId,
|
||||
String relocatingNodeId, RestoreSource restoreSource, boolean primary, ShardRoutingState state, long version,
|
||||
UnassignedInfo unassignedInfo) {
|
||||
this.index = index;
|
||||
this.shardId = shardId;
|
||||
this.currentNodeId = currentNodeId;
|
||||
this.relocatingNodeId = relocatingNodeId;
|
||||
this.primary = primary;
|
||||
this.state = state;
|
||||
this.asList = ImmutableList.of((ShardRouting) this);
|
||||
this.version = version;
|
||||
this.restoreSource = restoreSource;
|
||||
this.unassignedInfo = unassignedInfo;
|
||||
assert !(state == ShardRoutingState.UNASSIGNED && unassignedInfo == null) : "unassigned shard must be created with meta";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String index() {
|
||||
return this.index;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIndex() {
|
||||
return index();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return this.shardId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long version() {
|
||||
return this.version;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean unassigned() {
|
||||
return state == ShardRoutingState.UNASSIGNED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean initializing() {
|
||||
return state == ShardRoutingState.INITIALIZING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean active() {
|
||||
return started() || relocating();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean started() {
|
||||
return state == ShardRoutingState.STARTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean relocating() {
|
||||
return state == ShardRoutingState.RELOCATING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean assignedToNode() {
|
||||
return currentNodeId != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String currentNodeId() {
|
||||
return this.currentNodeId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String relocatingNodeId() {
|
||||
return this.relocatingNodeId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShardRouting targetRoutingIfRelocating() {
|
||||
if (!relocating()) {
|
||||
return null;
|
||||
}
|
||||
return new ImmutableShardRouting(index, shardId, relocatingNodeId, currentNodeId, primary, ShardRoutingState.INITIALIZING, version);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RestoreSource restoreSource() {
|
||||
return restoreSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public UnassignedInfo unassignedInfo() {
|
||||
return unassignedInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean primary() {
|
||||
return this.primary;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShardRoutingState state() {
|
||||
return this.state;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShardId shardId() {
|
||||
if (shardIdentifier != null) {
|
||||
return shardIdentifier;
|
||||
}
|
||||
shardIdentifier = new ShardId(index, shardId);
|
||||
return shardIdentifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShardIterator shardsIt() {
|
||||
return new PlainShardIterator(shardId(), asList);
|
||||
}
|
||||
|
||||
public static ImmutableShardRouting readShardRoutingEntry(StreamInput in) throws IOException {
|
||||
ImmutableShardRouting entry = new ImmutableShardRouting();
|
||||
entry.readFrom(in);
|
||||
return entry;
|
||||
}
|
||||
|
||||
public static ImmutableShardRouting readShardRoutingEntry(StreamInput in, String index, int shardId) throws IOException {
|
||||
ImmutableShardRouting entry = new ImmutableShardRouting();
|
||||
entry.readFrom(in, index, shardId);
|
||||
return entry;
|
||||
}
|
||||
|
||||
public void readFrom(StreamInput in, String index, int shardId) throws IOException {
|
||||
this.index = index;
|
||||
this.shardId = shardId;
|
||||
readFromThin(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromThin(StreamInput in) throws IOException {
|
||||
version = in.readLong();
|
||||
if (in.readBoolean()) {
|
||||
currentNodeId = in.readString();
|
||||
}
|
||||
|
||||
if (in.readBoolean()) {
|
||||
relocatingNodeId = in.readString();
|
||||
}
|
||||
|
||||
primary = in.readBoolean();
|
||||
state = ShardRoutingState.fromValue(in.readByte());
|
||||
|
||||
restoreSource = RestoreSource.readOptionalRestoreSource(in);
|
||||
if (in.readBoolean()) {
|
||||
unassignedInfo = new UnassignedInfo(in);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFrom(StreamInput in) throws IOException {
|
||||
readFrom(in, in.readString(), in.readVInt());
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes shard information to {@link StreamOutput} without writing index name and shard id
|
||||
*
|
||||
* @param out {@link StreamOutput} to write shard information to
|
||||
* @throws IOException if something happens during write
|
||||
*/
|
||||
@Override
|
||||
public void writeToThin(StreamOutput out) throws IOException {
|
||||
out.writeLong(version);
|
||||
if (currentNodeId != null) {
|
||||
out.writeBoolean(true);
|
||||
out.writeString(currentNodeId);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
|
||||
if (relocatingNodeId != null) {
|
||||
out.writeBoolean(true);
|
||||
out.writeString(relocatingNodeId);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
|
||||
out.writeBoolean(primary);
|
||||
out.writeByte(state.value());
|
||||
|
||||
if (restoreSource != null) {
|
||||
out.writeBoolean(true);
|
||||
restoreSource.writeTo(out);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
if (unassignedInfo != null) {
|
||||
out.writeBoolean(true);
|
||||
unassignedInfo.writeTo(out);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(StreamOutput out) throws IOException {
|
||||
out.writeString(index);
|
||||
out.writeVInt(shardId);
|
||||
writeToThin(out);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
// we check on instanceof so we also handle the MutableShardRouting case as well
|
||||
if (o == null || !(o instanceof ImmutableShardRouting)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ImmutableShardRouting that = (ImmutableShardRouting) o;
|
||||
|
||||
if (primary != that.primary) {
|
||||
return false;
|
||||
}
|
||||
if (shardId != that.shardId) {
|
||||
return false;
|
||||
}
|
||||
if (currentNodeId != null ? !currentNodeId.equals(that.currentNodeId) : that.currentNodeId != null) {
|
||||
return false;
|
||||
}
|
||||
if (index != null ? !index.equals(that.index) : that.index != null) {
|
||||
return false;
|
||||
}
|
||||
if (relocatingNodeId != null ? !relocatingNodeId.equals(that.relocatingNodeId) : that.relocatingNodeId != null) {
|
||||
return false;
|
||||
}
|
||||
if (state != that.state) {
|
||||
return false;
|
||||
}
|
||||
if (restoreSource != null ? !restoreSource.equals(that.restoreSource) : that.restoreSource != null) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = index != null ? index.hashCode() : 0;
|
||||
result = 31 * result + shardId;
|
||||
result = 31 * result + (currentNodeId != null ? currentNodeId.hashCode() : 0);
|
||||
result = 31 * result + (relocatingNodeId != null ? relocatingNodeId.hashCode() : 0);
|
||||
result = 31 * result + (primary ? 1 : 0);
|
||||
result = 31 * result + (state != null ? state.hashCode() : 0);
|
||||
result = 31 * result + (restoreSource != null ? restoreSource.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return shortSummary();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String shortSummary() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append('[').append(index).append(']').append('[').append(shardId).append(']');
|
||||
sb.append(", node[").append(currentNodeId).append("], ");
|
||||
if (relocatingNodeId != null) {
|
||||
sb.append("relocating [").append(relocatingNodeId).append("], ");
|
||||
}
|
||||
if (primary) {
|
||||
sb.append("[P]");
|
||||
} else {
|
||||
sb.append("[R]");
|
||||
}
|
||||
if (this.restoreSource != null) {
|
||||
sb.append(", restoring[" + restoreSource + "]");
|
||||
}
|
||||
sb.append(", s[").append(state).append("]");
|
||||
if (this.unassignedInfo != null) {
|
||||
sb.append(", ").append(unassignedInfo.toString());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||
builder.startObject()
|
||||
.field("state", state())
|
||||
.field("primary", primary())
|
||||
.field("node", currentNodeId())
|
||||
.field("relocating_node", relocatingNodeId())
|
||||
.field("shard", shardId().id())
|
||||
.field("index", shardId().index().name());
|
||||
if (restoreSource() != null) {
|
||||
builder.field("restore_source");
|
||||
restoreSource().toXContent(builder, params);
|
||||
}
|
||||
if (unassignedInfo != null) {
|
||||
unassignedInfo.toXContent(builder, params);
|
||||
}
|
||||
return builder.endObject();
|
||||
}
|
||||
}
|
|
@ -70,24 +70,21 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
|
|||
// shards with state set to UNASSIGNED
|
||||
private final ImmutableOpenIntMap<IndexShardRoutingTable> shards;
|
||||
|
||||
private final ImmutableList<ShardRouting> allShards;
|
||||
private final ImmutableList<ShardRouting> allActiveShards;
|
||||
private final List<ShardRouting> allActiveShards;
|
||||
|
||||
IndexRoutingTable(String index, ImmutableOpenIntMap<IndexShardRoutingTable> shards) {
|
||||
this.index = index;
|
||||
this.shuffler = new RotationShardShuffler(ThreadLocalRandom.current().nextInt());
|
||||
this.shards = shards;
|
||||
ImmutableList.Builder<ShardRouting> allShards = ImmutableList.builder();
|
||||
ImmutableList.Builder<ShardRouting> allActiveShards = ImmutableList.builder();
|
||||
for (IntObjectCursor<IndexShardRoutingTable> cursor : shards) {
|
||||
for (ShardRouting shardRouting : cursor.value) {
|
||||
allShards.add(shardRouting);
|
||||
shardRouting.freeze();
|
||||
if (shardRouting.active()) {
|
||||
allActiveShards.add(shardRouting);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.allShards = allShards.build();
|
||||
this.allActiveShards = allActiveShards.build();
|
||||
}
|
||||
|
||||
|
@ -275,13 +272,6 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
|
|||
return shards;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an unordered iterator over all shards (including replicas).
|
||||
*/
|
||||
public ShardsIterator randomAllShardsIt() {
|
||||
return new PlainShardsIterator(shuffler.shuffle(allShards));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an unordered iterator over all active shards (including replicas).
|
||||
*/
|
||||
|
@ -443,9 +433,9 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
|
|||
for (int i = 0; i <= indexMetaData.numberOfReplicas(); i++) {
|
||||
if (asNew && ignoreShards.contains(shardId)) {
|
||||
// This shards wasn't completely snapshotted - restore it as new shard
|
||||
indexShardRoutingBuilder.addShard(new ImmutableShardRouting(index, shardId, null, null, null, i == 0, ShardRoutingState.UNASSIGNED, 0, unassignedInfo));
|
||||
indexShardRoutingBuilder.addShard(new ShardRouting(index, shardId, null, null, null, i == 0, ShardRoutingState.UNASSIGNED, 0, unassignedInfo));
|
||||
} else {
|
||||
indexShardRoutingBuilder.addShard(new ImmutableShardRouting(index, shardId, null, null, i == 0 ? restoreSource : null, i == 0, ShardRoutingState.UNASSIGNED, 0, unassignedInfo));
|
||||
indexShardRoutingBuilder.addShard(new ShardRouting(index, shardId, null, null, i == 0 ? restoreSource : null, i == 0, ShardRoutingState.UNASSIGNED, 0, unassignedInfo));
|
||||
}
|
||||
}
|
||||
shards.put(shardId, indexShardRoutingBuilder.build());
|
||||
|
@ -463,7 +453,7 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
|
|||
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, null, i == 0, ShardRoutingState.UNASSIGNED, 0, unassignedInfo));
|
||||
indexShardRoutingBuilder.addShard(new ShardRouting(index, shardId, null, null, null, i == 0, ShardRoutingState.UNASSIGNED, 0, unassignedInfo));
|
||||
}
|
||||
shards.put(shardId, indexShardRoutingBuilder.build());
|
||||
}
|
||||
|
@ -474,7 +464,7 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
|
|||
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, null, null, false, ShardRoutingState.UNASSIGNED, 0, new UnassignedInfo(UnassignedInfo.Reason.REPLICA_ADDED, null));
|
||||
ShardRouting shard = new ShardRouting(index, shardId, null, null, null, false, ShardRoutingState.UNASSIGNED, 0, new UnassignedInfo(UnassignedInfo.Reason.REPLICA_ADDED, null));
|
||||
shards.put(shardId,
|
||||
new IndexShardRoutingTable.Builder(shards.get(shard.id())).addShard(shard).build()
|
||||
);
|
||||
|
@ -493,7 +483,7 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
|
|||
// 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));
|
||||
builder.addShard(new ShardRouting(shardRouting));
|
||||
}
|
||||
// first check if there is one that is not assigned to a node, and remove it
|
||||
boolean removed = false;
|
||||
|
@ -540,9 +530,9 @@ public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> imple
|
|||
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();
|
||||
indexShard = new IndexShardRoutingTable.Builder(refData.shardId(), refData.primaryAllocatedPostApi()).addShard(new ShardRouting(shard)).build();
|
||||
} else {
|
||||
indexShard = new IndexShardRoutingTable.Builder(indexShard).addShard(new ImmutableShardRouting(shard)).build();
|
||||
indexShard = new IndexShardRoutingTable.Builder(indexShard).addShard(new ShardRouting(shard)).build();
|
||||
}
|
||||
shards.put(indexShard.shardId().id(), indexShard);
|
||||
return this;
|
||||
|
|
|
@ -22,7 +22,6 @@ package org.elasticsearch.cluster.routing;
|
|||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.UnmodifiableIterator;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.common.collect.MapBuilder;
|
||||
|
@ -141,7 +140,7 @@ public class IndexShardRoutingTable implements Iterable<ShardRouting> {
|
|||
if (shards.get(i).version() == highestVersion) {
|
||||
shardRoutings.add(shards.get(i));
|
||||
} else {
|
||||
shardRoutings.add(new ImmutableShardRouting(shards.get(i), highestVersion));
|
||||
shardRoutings.add(new ShardRouting(shards.get(i), highestVersion));
|
||||
}
|
||||
}
|
||||
return new IndexShardRoutingTable(shardId, ImmutableList.copyOf(shardRoutings), primaryAllocatedPostApi);
|
||||
|
@ -559,7 +558,7 @@ public class IndexShardRoutingTable implements Iterable<ShardRouting> {
|
|||
this.primaryAllocatedPostApi = primaryAllocatedPostApi;
|
||||
}
|
||||
|
||||
public Builder addShard(ImmutableShardRouting shardEntry) {
|
||||
public Builder addShard(ShardRouting shardEntry) {
|
||||
for (ShardRouting shard : shards) {
|
||||
// don't add two that map to the same node id
|
||||
// we rely on the fact that a node does not have primary and backup of the same shard
|
||||
|
@ -601,7 +600,7 @@ public class IndexShardRoutingTable implements Iterable<ShardRouting> {
|
|||
|
||||
int size = in.readVInt();
|
||||
for (int i = 0; i < size; i++) {
|
||||
ImmutableShardRouting shard = ImmutableShardRouting.readShardRoutingEntry(in, index, iShardId);
|
||||
ShardRouting shard = ShardRouting.readShardRoutingEntry(in, index, iShardId);
|
||||
builder.addShard(shard);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,160 +0,0 @@
|
|||
/*
|
||||
* 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.routing;
|
||||
|
||||
/**
|
||||
* Similar to {@link ImmutableShardRouting} this class keeps metadata of the current shard. But unlike
|
||||
* {@link ImmutableShardRouting} the information kept in this class can be modified.
|
||||
* These modifications include changing the primary state, relocating and assigning the shard
|
||||
* represented by this class
|
||||
*/
|
||||
public class MutableShardRouting extends ImmutableShardRouting {
|
||||
|
||||
public MutableShardRouting(ShardRouting copy) {
|
||||
super(copy);
|
||||
}
|
||||
|
||||
public MutableShardRouting(ShardRouting copy, long version) {
|
||||
super(copy, version);
|
||||
}
|
||||
|
||||
public MutableShardRouting(String index, int shardId, String currentNodeId,
|
||||
String relocatingNodeId, RestoreSource restoreSource, boolean primary, ShardRoutingState state, long version) {
|
||||
super(index, shardId, currentNodeId, relocatingNodeId, restoreSource, primary, state, version);
|
||||
assert state != ShardRoutingState.UNASSIGNED : "new mutable routing should not be created with UNASSIGNED state, should moveToUnassigned";
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the shard to unassigned state.
|
||||
*/
|
||||
void moveToUnassigned(UnassignedInfo unassignedInfo) {
|
||||
version++;
|
||||
assert state != ShardRoutingState.UNASSIGNED;
|
||||
state = ShardRoutingState.UNASSIGNED;
|
||||
currentNodeId = null;
|
||||
relocatingNodeId = null;
|
||||
this.unassignedInfo = unassignedInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign this shard to a node.
|
||||
*
|
||||
* @param nodeId id of the node to assign this shard to
|
||||
*/
|
||||
void assignToNode(String nodeId) {
|
||||
version++;
|
||||
|
||||
if (currentNodeId == null) {
|
||||
assert state == ShardRoutingState.UNASSIGNED;
|
||||
|
||||
state = ShardRoutingState.INITIALIZING;
|
||||
currentNodeId = nodeId;
|
||||
relocatingNodeId = null;
|
||||
} else if (state == ShardRoutingState.STARTED) {
|
||||
state = ShardRoutingState.RELOCATING;
|
||||
relocatingNodeId = nodeId;
|
||||
} else if (state == ShardRoutingState.RELOCATING) {
|
||||
assert nodeId.equals(relocatingNodeId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Relocate the shard to another node.
|
||||
*
|
||||
* @param relocatingNodeId id of the node to relocate the shard
|
||||
*/
|
||||
void relocate(String relocatingNodeId) {
|
||||
version++;
|
||||
assert state == ShardRoutingState.STARTED;
|
||||
state = ShardRoutingState.RELOCATING;
|
||||
this.relocatingNodeId = relocatingNodeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel relocation of a shard. The shards state must be set
|
||||
* to <code>RELOCATING</code>.
|
||||
*/
|
||||
void cancelRelocation() {
|
||||
version++;
|
||||
assert state == ShardRoutingState.RELOCATING;
|
||||
assert assignedToNode();
|
||||
assert relocatingNodeId != null;
|
||||
|
||||
state = ShardRoutingState.STARTED;
|
||||
relocatingNodeId = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the shard from started to initializing and bumps the version
|
||||
*/
|
||||
void reinitializeShard() {
|
||||
assert state == ShardRoutingState.STARTED;
|
||||
version++;
|
||||
state = ShardRoutingState.INITIALIZING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the shards state to <code>STARTED</code>. The shards state must be
|
||||
* <code>INITIALIZING</code> or <code>RELOCATING</code>. Any relocation will be
|
||||
* canceled.
|
||||
*/
|
||||
void moveToStarted() {
|
||||
version++;
|
||||
assert state == ShardRoutingState.INITIALIZING || state == ShardRoutingState.RELOCATING;
|
||||
relocatingNodeId = null;
|
||||
restoreSource = null;
|
||||
state = ShardRoutingState.STARTED;
|
||||
unassignedInfo = null; // we keep the unassigned data until the shard is started
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the shard primary unless it's not Primary
|
||||
* //TODO: doc exception
|
||||
*/
|
||||
void moveToPrimary() {
|
||||
version++;
|
||||
if (primary) {
|
||||
throw new IllegalShardRoutingStateException(this, "Already primary, can't move to primary");
|
||||
}
|
||||
primary = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the primary shard to non-primary
|
||||
*/
|
||||
void moveFromPrimary() {
|
||||
version++;
|
||||
if (!primary) {
|
||||
throw new IllegalShardRoutingStateException(this, "Not primary, can't move to replica");
|
||||
}
|
||||
primary = false;
|
||||
}
|
||||
|
||||
private long hashVersion = version-1;
|
||||
private int hashCode = 0;
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
hashCode = (hashVersion != version ? super.hashCode() : hashCode);
|
||||
hashVersion = version;
|
||||
return hashCode;
|
||||
}
|
||||
}
|
||||
|
|
@ -33,30 +33,30 @@ import static com.google.common.collect.Lists.newArrayList;
|
|||
* A {@link RoutingNode} represents a cluster node associated with a single {@link DiscoveryNode} including all shards
|
||||
* that are hosted on that nodes. Each {@link RoutingNode} has a unique node id that can be used to identify the node.
|
||||
*/
|
||||
public class RoutingNode implements Iterable<MutableShardRouting> {
|
||||
public class RoutingNode implements Iterable<ShardRouting> {
|
||||
|
||||
private final String nodeId;
|
||||
|
||||
private final DiscoveryNode node;
|
||||
|
||||
private final List<MutableShardRouting> shards;
|
||||
private final List<ShardRouting> shards;
|
||||
|
||||
public RoutingNode(String nodeId, DiscoveryNode node) {
|
||||
this(nodeId, node, new ArrayList<MutableShardRouting>());
|
||||
this(nodeId, node, new ArrayList<ShardRouting>());
|
||||
}
|
||||
|
||||
public RoutingNode(String nodeId, DiscoveryNode node, List<MutableShardRouting> shards) {
|
||||
public RoutingNode(String nodeId, DiscoveryNode node, List<ShardRouting> shards) {
|
||||
this.nodeId = nodeId;
|
||||
this.node = node;
|
||||
this.shards = shards;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<MutableShardRouting> iterator() {
|
||||
public Iterator<ShardRouting> iterator() {
|
||||
return Iterators.unmodifiableIterator(shards.iterator());
|
||||
}
|
||||
|
||||
Iterator<MutableShardRouting> mutableIterator() {
|
||||
Iterator<ShardRouting> mutableIterator() {
|
||||
return shards.iterator();
|
||||
}
|
||||
|
||||
|
@ -85,9 +85,9 @@ public class RoutingNode implements Iterable<MutableShardRouting> {
|
|||
* Add a new shard to this node
|
||||
* @param shard Shard to crate on this Node
|
||||
*/
|
||||
void add(MutableShardRouting shard) {
|
||||
void add(ShardRouting shard) {
|
||||
// TODO use Set with ShardIds for faster lookup.
|
||||
for (MutableShardRouting shardRouting : shards) {
|
||||
for (ShardRouting shardRouting : shards) {
|
||||
if (shardRouting.shardId().equals(shard.shardId())) {
|
||||
throw new IllegalStateException("Trying to add a shard [" + shard.shardId().index().name() + "][" + shard.shardId().id() + "] to a node [" + nodeId + "] where it already exists");
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ public class RoutingNode implements Iterable<MutableShardRouting> {
|
|||
*/
|
||||
public int numberOfShardsWithState(ShardRoutingState... states) {
|
||||
int count = 0;
|
||||
for (MutableShardRouting shardEntry : this) {
|
||||
for (ShardRouting shardEntry : this) {
|
||||
for (ShardRoutingState state : states) {
|
||||
if (shardEntry.state() == state) {
|
||||
count++;
|
||||
|
@ -117,9 +117,9 @@ public class RoutingNode implements Iterable<MutableShardRouting> {
|
|||
* @param states set of states which should be listed
|
||||
* @return List of shards
|
||||
*/
|
||||
public List<MutableShardRouting> shardsWithState(ShardRoutingState... states) {
|
||||
List<MutableShardRouting> shards = newArrayList();
|
||||
for (MutableShardRouting shardEntry : this) {
|
||||
public List<ShardRouting> shardsWithState(ShardRoutingState... states) {
|
||||
List<ShardRouting> shards = newArrayList();
|
||||
for (ShardRouting shardEntry : this) {
|
||||
for (ShardRoutingState state : states) {
|
||||
if (shardEntry.state() == state) {
|
||||
shards.add(shardEntry);
|
||||
|
@ -135,10 +135,10 @@ public class RoutingNode implements Iterable<MutableShardRouting> {
|
|||
* @param states set of states which should be listed
|
||||
* @return a list of shards
|
||||
*/
|
||||
public List<MutableShardRouting> shardsWithState(String index, ShardRoutingState... states) {
|
||||
List<MutableShardRouting> shards = newArrayList();
|
||||
public List<ShardRouting> shardsWithState(String index, ShardRoutingState... states) {
|
||||
List<ShardRouting> shards = newArrayList();
|
||||
|
||||
for (MutableShardRouting shardEntry : this) {
|
||||
for (ShardRouting shardEntry : this) {
|
||||
if (!shardEntry.index().equals(index)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ public class RoutingNode implements Iterable<MutableShardRouting> {
|
|||
*/
|
||||
public int numberOfOwningShards() {
|
||||
int count = 0;
|
||||
for (MutableShardRouting shardEntry : this) {
|
||||
for (ShardRouting shardEntry : this) {
|
||||
if (shardEntry.state() != ShardRoutingState.RELOCATING) {
|
||||
count++;
|
||||
}
|
||||
|
@ -168,7 +168,7 @@ public class RoutingNode implements Iterable<MutableShardRouting> {
|
|||
public String prettyPrint() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("-----node_id[").append(nodeId).append("][" + (node == null ? "X" : "V") + "]\n");
|
||||
for (MutableShardRouting entry : shards) {
|
||||
for (ShardRouting entry : shards) {
|
||||
sb.append("--------").append(entry.shortSummary()).append('\n');
|
||||
}
|
||||
return sb.toString();
|
||||
|
@ -190,11 +190,11 @@ public class RoutingNode implements Iterable<MutableShardRouting> {
|
|||
return sb.toString();
|
||||
}
|
||||
|
||||
public MutableShardRouting get(int i) {
|
||||
public ShardRouting get(int i) {
|
||||
return shards.get(i) ;
|
||||
}
|
||||
|
||||
public Collection<MutableShardRouting> copyShards() {
|
||||
public Collection<ShardRouting> copyShards() {
|
||||
return new ArrayList<>(shards);
|
||||
}
|
||||
|
||||
|
|
|
@ -53,9 +53,9 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
|
||||
private final UnassignedShards unassignedShards = new UnassignedShards();
|
||||
|
||||
private final List<MutableShardRouting> ignoredUnassignedShards = newArrayList();
|
||||
private final List<ShardRouting> ignoredUnassignedShards = newArrayList();
|
||||
|
||||
private final Map<ShardId, List<MutableShardRouting>> assignedShards = newHashMap();
|
||||
private final Map<ShardId, List<ShardRouting>> assignedShards = newHashMap();
|
||||
|
||||
private final ImmutableOpenMap<String, ClusterState.Custom> customs;
|
||||
|
||||
|
@ -75,10 +75,10 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
this.routingTable = clusterState.routingTable();
|
||||
this.customs = clusterState.customs();
|
||||
|
||||
Map<String, List<MutableShardRouting>> nodesToShards = newHashMap();
|
||||
Map<String, List<ShardRouting>> nodesToShards = newHashMap();
|
||||
// fill in the nodeToShards with the "live" nodes
|
||||
for (ObjectCursor<DiscoveryNode> cursor : clusterState.nodes().dataNodes().values()) {
|
||||
nodesToShards.put(cursor.value.id(), new ArrayList<MutableShardRouting>());
|
||||
nodesToShards.put(cursor.value.id(), new ArrayList<ShardRouting>());
|
||||
}
|
||||
|
||||
// fill in the inverse of node -> shards allocated
|
||||
|
@ -91,12 +91,12 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
// by the ShardId, as this is common for primary and replicas.
|
||||
// A replica Set might have one (and not more) replicas with the state of RELOCATING.
|
||||
if (shard.assignedToNode()) {
|
||||
List<MutableShardRouting> entries = nodesToShards.get(shard.currentNodeId());
|
||||
List<ShardRouting> entries = nodesToShards.get(shard.currentNodeId());
|
||||
if (entries == null) {
|
||||
entries = newArrayList();
|
||||
nodesToShards.put(shard.currentNodeId(), entries);
|
||||
}
|
||||
MutableShardRouting sr = new MutableShardRouting(shard);
|
||||
ShardRouting sr = new ShardRouting(shard);
|
||||
entries.add(sr);
|
||||
assignedShardsAdd(sr);
|
||||
if (shard.relocating()) {
|
||||
|
@ -108,7 +108,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
// add the counterpart shard with relocatingNodeId reflecting the source from which
|
||||
// it's relocating from.
|
||||
sr = new MutableShardRouting(shard.index(), shard.id(), shard.relocatingNodeId(),
|
||||
sr = new ShardRouting(shard.index(), shard.id(), shard.relocatingNodeId(),
|
||||
shard.currentNodeId(), shard.restoreSource(), shard.primary(), ShardRoutingState.INITIALIZING, shard.version());
|
||||
entries.add(sr);
|
||||
assignedShardsAdd(sr);
|
||||
|
@ -119,14 +119,14 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
inactiveShardCount++;
|
||||
}
|
||||
} else {
|
||||
MutableShardRouting sr = new MutableShardRouting(shard);
|
||||
ShardRouting sr = new ShardRouting(shard);
|
||||
assignedShardsAdd(sr);
|
||||
unassignedShards.add(sr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Map.Entry<String, List<MutableShardRouting>> entry : nodesToShards.entrySet()) {
|
||||
for (Map.Entry<String, List<ShardRouting>> entry : nodesToShards.entrySet()) {
|
||||
String nodeId = entry.getKey();
|
||||
this.nodesToShards.put(nodeId, new RoutingNode(nodeId, clusterState.nodes().get(nodeId), entry.getValue()));
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
return !unassignedShards.isEmpty();
|
||||
}
|
||||
|
||||
public List<MutableShardRouting> ignoredUnassigned() {
|
||||
public List<ShardRouting> ignoredUnassigned() {
|
||||
return this.ignoredUnassignedShards;
|
||||
}
|
||||
|
||||
|
@ -258,8 +258,8 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
* Returns the active primary shard for the given ShardRouting or <code>null</code> if
|
||||
* no primary is found or the primary is not active.
|
||||
*/
|
||||
public MutableShardRouting activePrimary(ShardRouting shard) {
|
||||
for (MutableShardRouting shardRouting : assignedShards(shard.shardId())) {
|
||||
public ShardRouting activePrimary(ShardRouting shard) {
|
||||
for (ShardRouting shardRouting : assignedShards(shard.shardId())) {
|
||||
if (shardRouting.primary() && shardRouting.active()) {
|
||||
return shardRouting;
|
||||
}
|
||||
|
@ -271,8 +271,8 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
* Returns one active replica shard for the given ShardRouting shard ID or <code>null</code> if
|
||||
* no active replica is found.
|
||||
*/
|
||||
public MutableShardRouting activeReplica(ShardRouting shard) {
|
||||
for (MutableShardRouting shardRouting : assignedShards(shard.shardId())) {
|
||||
public ShardRouting activeReplica(ShardRouting shard) {
|
||||
for (ShardRouting shardRouting : assignedShards(shard.shardId())) {
|
||||
if (!shardRouting.primary() && shardRouting.active()) {
|
||||
return shardRouting;
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
* Returns all shards that are not in the state UNASSIGNED with the same shard
|
||||
* ID as the given shard.
|
||||
*/
|
||||
public Iterable<MutableShardRouting> assignedShards(ShardRouting shard) {
|
||||
public Iterable<ShardRouting> assignedShards(ShardRouting shard) {
|
||||
return assignedShards(shard.shardId());
|
||||
}
|
||||
|
||||
|
@ -292,11 +292,11 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
* Returns <code>true</code> iff all replicas are active for the given shard routing. Otherwise <code>false</code>
|
||||
*/
|
||||
public boolean allReplicasActive(ShardRouting shardRouting) {
|
||||
final List<MutableShardRouting> shards = assignedShards(shardRouting.shardId());
|
||||
final List<ShardRouting> shards = assignedShards(shardRouting.shardId());
|
||||
if (shards.isEmpty() || shards.size() < this.routingTable.index(shardRouting.index()).shard(shardRouting.id()).size()) {
|
||||
return false; // if we are empty nothing is active if we have less than total at least one is unassigned
|
||||
}
|
||||
for (MutableShardRouting shard : shards) {
|
||||
for (ShardRouting shard : shards) {
|
||||
if (!shard.active()) {
|
||||
return false;
|
||||
}
|
||||
|
@ -304,10 +304,10 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
return true;
|
||||
}
|
||||
|
||||
public List<MutableShardRouting> shards(Predicate<MutableShardRouting> predicate) {
|
||||
List<MutableShardRouting> shards = newArrayList();
|
||||
public List<ShardRouting> shards(Predicate<ShardRouting> predicate) {
|
||||
List<ShardRouting> shards = newArrayList();
|
||||
for (RoutingNode routingNode : this) {
|
||||
for (MutableShardRouting shardRouting : routingNode) {
|
||||
for (ShardRouting shardRouting : routingNode) {
|
||||
if (predicate.apply(shardRouting)) {
|
||||
shards.add(shardRouting);
|
||||
}
|
||||
|
@ -316,9 +316,9 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
return shards;
|
||||
}
|
||||
|
||||
public List<MutableShardRouting> shardsWithState(ShardRoutingState... state) {
|
||||
public List<ShardRouting> shardsWithState(ShardRoutingState... state) {
|
||||
// TODO these are used on tests only - move into utils class
|
||||
List<MutableShardRouting> shards = newArrayList();
|
||||
List<ShardRouting> shards = newArrayList();
|
||||
for (RoutingNode routingNode : this) {
|
||||
shards.addAll(routingNode.shardsWithState(state));
|
||||
}
|
||||
|
@ -331,15 +331,15 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
return shards;
|
||||
}
|
||||
|
||||
public List<MutableShardRouting> shardsWithState(String index, ShardRoutingState... state) {
|
||||
public List<ShardRouting> shardsWithState(String index, ShardRoutingState... state) {
|
||||
// TODO these are used on tests only - move into utils class
|
||||
List<MutableShardRouting> shards = newArrayList();
|
||||
List<ShardRouting> shards = newArrayList();
|
||||
for (RoutingNode routingNode : this) {
|
||||
shards.addAll(routingNode.shardsWithState(index, state));
|
||||
}
|
||||
for (ShardRoutingState s : state) {
|
||||
if (s == ShardRoutingState.UNASSIGNED) {
|
||||
for (MutableShardRouting unassignedShard : unassignedShards) {
|
||||
for (ShardRouting unassignedShard : unassignedShards) {
|
||||
if (unassignedShard.index().equals(index)) {
|
||||
shards.add(unassignedShard);
|
||||
}
|
||||
|
@ -356,7 +356,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
sb.append(routingNode.prettyPrint());
|
||||
}
|
||||
sb.append("---- unassigned\n");
|
||||
for (MutableShardRouting shardEntry : unassignedShards) {
|
||||
for (ShardRouting shardEntry : unassignedShards) {
|
||||
sb.append("--------").append(shardEntry.shortSummary()).append('\n');
|
||||
}
|
||||
return sb.toString();
|
||||
|
@ -379,7 +379,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
* @param shard the shard to be assigned
|
||||
* @param nodeId the nodeId this shard should initialize on or relocate from
|
||||
*/
|
||||
public void assign(MutableShardRouting shard, String nodeId) {
|
||||
public void assign(ShardRouting shard, String nodeId) {
|
||||
// state will not change if the shard is already initializing.
|
||||
ShardRoutingState oldState = shard.state();
|
||||
shard.assignToNode(nodeId);
|
||||
|
@ -400,7 +400,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
/**
|
||||
* Relocate a shard to another node.
|
||||
*/
|
||||
public void relocate(MutableShardRouting shard, String nodeId) {
|
||||
public void relocate(ShardRouting shard, String nodeId) {
|
||||
relocatingShards++;
|
||||
shard.relocate(nodeId);
|
||||
}
|
||||
|
@ -408,7 +408,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
/**
|
||||
* Mark a shard as started and adjusts internal statistics.
|
||||
*/
|
||||
public void started(MutableShardRouting shard) {
|
||||
public void started(ShardRouting shard) {
|
||||
if (!shard.active() && shard.relocatingNodeId() == null) {
|
||||
inactiveShardCount--;
|
||||
if (shard.primary()) {
|
||||
|
@ -424,7 +424,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
/**
|
||||
* Cancels a relocation of a shard that shard must relocating.
|
||||
*/
|
||||
public void cancelRelocation(MutableShardRouting shard) {
|
||||
public void cancelRelocation(ShardRouting shard) {
|
||||
relocatingShards--;
|
||||
shard.cancelRelocation();
|
||||
}
|
||||
|
@ -434,8 +434,8 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
*
|
||||
* @param shards the shard to have its primary status swapped.
|
||||
*/
|
||||
public void swapPrimaryFlag(MutableShardRouting... shards) {
|
||||
for (MutableShardRouting shard : shards) {
|
||||
public void swapPrimaryFlag(ShardRouting... shards) {
|
||||
for (ShardRouting shard : shards) {
|
||||
if (shard.primary()) {
|
||||
shard.moveFromPrimary();
|
||||
if (shard.unassigned()) {
|
||||
|
@ -450,10 +450,10 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
}
|
||||
|
||||
private static final List<MutableShardRouting> EMPTY = Collections.emptyList();
|
||||
private static final List<ShardRouting> EMPTY = Collections.emptyList();
|
||||
|
||||
private List<MutableShardRouting> assignedShards(ShardId shardId) {
|
||||
final List<MutableShardRouting> replicaSet = assignedShards.get(shardId);
|
||||
private List<ShardRouting> assignedShards(ShardId shardId) {
|
||||
final List<ShardRouting> replicaSet = assignedShards.get(shardId);
|
||||
return replicaSet == null ? EMPTY : Collections.unmodifiableList(replicaSet);
|
||||
}
|
||||
|
||||
|
@ -462,7 +462,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
* the relocation if the shard is relocating.
|
||||
* @param shard
|
||||
*/
|
||||
private void remove(MutableShardRouting shard) {
|
||||
private void remove(ShardRouting shard) {
|
||||
if (!shard.active() && shard.relocatingNodeId() == null) {
|
||||
inactiveShardCount--;
|
||||
assert inactiveShardCount >= 0;
|
||||
|
@ -475,12 +475,12 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
assignedShardsRemove(shard);
|
||||
}
|
||||
|
||||
private void assignedShardsAdd(MutableShardRouting shard) {
|
||||
private void assignedShardsAdd(ShardRouting shard) {
|
||||
if (shard.unassigned()) {
|
||||
// no unassigned
|
||||
return;
|
||||
}
|
||||
List<MutableShardRouting> shards = assignedShards.get(shard.shardId());
|
||||
List<ShardRouting> shards = assignedShards.get(shard.shardId());
|
||||
if (shards == null) {
|
||||
shards = Lists.newArrayList();
|
||||
assignedShards.put(shard.shardId(), shards);
|
||||
|
@ -489,17 +489,17 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
shards.add(shard);
|
||||
}
|
||||
|
||||
private boolean assertInstanceNotInList(MutableShardRouting shard, List<MutableShardRouting> shards) {
|
||||
for (MutableShardRouting s : shards) {
|
||||
private boolean assertInstanceNotInList(ShardRouting shard, List<ShardRouting> shards) {
|
||||
for (ShardRouting s : shards) {
|
||||
assert s != shard;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void assignedShardsRemove(MutableShardRouting shard) {
|
||||
final List<MutableShardRouting> replicaSet = assignedShards.get(shard.shardId());
|
||||
private void assignedShardsRemove(ShardRouting shard) {
|
||||
final List<ShardRouting> replicaSet = assignedShards.get(shard.shardId());
|
||||
if (replicaSet != null) {
|
||||
final Iterator<MutableShardRouting> iterator = replicaSet.iterator();
|
||||
final Iterator<ShardRouting> iterator = replicaSet.iterator();
|
||||
while(iterator.hasNext()) {
|
||||
// yes we check identity here
|
||||
if (shard == iterator.next()) {
|
||||
|
@ -532,7 +532,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
return nodesToShards.values().toArray(new RoutingNode[nodesToShards.size()]);
|
||||
}
|
||||
|
||||
public void reinitShadowPrimary(MutableShardRouting candidate) {
|
||||
public void reinitShadowPrimary(ShardRouting candidate) {
|
||||
if (candidate.relocating()) {
|
||||
cancelRelocation(candidate);
|
||||
}
|
||||
|
@ -542,9 +542,9 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
|
||||
}
|
||||
|
||||
public final static class UnassignedShards implements Iterable<MutableShardRouting> {
|
||||
public final static class UnassignedShards implements Iterable<ShardRouting> {
|
||||
|
||||
private final List<MutableShardRouting> unassigned;
|
||||
private final List<ShardRouting> unassigned;
|
||||
|
||||
private int primaries = 0;
|
||||
private long transactionId = 0;
|
||||
|
@ -564,16 +564,16 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
sourceTransactionId = -1;
|
||||
}
|
||||
|
||||
public void add(MutableShardRouting mutableShardRouting) {
|
||||
if(mutableShardRouting.primary()) {
|
||||
public void add(ShardRouting shardRouting) {
|
||||
if(shardRouting.primary()) {
|
||||
primaries++;
|
||||
}
|
||||
unassigned.add(mutableShardRouting);
|
||||
unassigned.add(shardRouting);
|
||||
transactionId++;
|
||||
}
|
||||
|
||||
public void addAll(Collection<MutableShardRouting> mutableShardRoutings) {
|
||||
for (MutableShardRouting r : mutableShardRoutings) {
|
||||
public void addAll(Collection<ShardRouting> mutableShardRoutings) {
|
||||
for (ShardRouting r : mutableShardRoutings) {
|
||||
add(r);
|
||||
}
|
||||
}
|
||||
|
@ -587,17 +587,17 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Iterator<MutableShardRouting> iterator() {
|
||||
final Iterator<MutableShardRouting> iterator = unassigned.iterator();
|
||||
return new Iterator<MutableShardRouting>() {
|
||||
private MutableShardRouting current;
|
||||
public Iterator<ShardRouting> iterator() {
|
||||
final Iterator<ShardRouting> iterator = unassigned.iterator();
|
||||
return new Iterator<ShardRouting>() {
|
||||
private ShardRouting current;
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return iterator.hasNext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutableShardRouting next() {
|
||||
public ShardRouting next() {
|
||||
return current = iterator.next();
|
||||
}
|
||||
|
||||
|
@ -639,8 +639,8 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
return new UnassignedShards(this);
|
||||
}
|
||||
|
||||
public MutableShardRouting[] drain() {
|
||||
MutableShardRouting[] mutableShardRoutings = unassigned.toArray(new MutableShardRouting[unassigned.size()]);
|
||||
public ShardRouting[] drain() {
|
||||
ShardRouting[] mutableShardRoutings = unassigned.toArray(new ShardRouting[unassigned.size()]);
|
||||
unassigned.clear();
|
||||
primaries = 0;
|
||||
transactionId++;
|
||||
|
@ -650,7 +650,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
|
||||
|
||||
/**
|
||||
* Calculates RoutingNodes statistics by iterating over all {@link MutableShardRouting}s
|
||||
* Calculates RoutingNodes statistics by iterating over all {@link ShardRouting}s
|
||||
* in the cluster to ensure the book-keeping is correct.
|
||||
* For performance reasons, this should only be called from asserts
|
||||
*
|
||||
|
@ -670,7 +670,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
final Set<ShardId> seenShards = newHashSet();
|
||||
Map<String, Integer> indicesAndShards = new HashMap<>();
|
||||
for (RoutingNode node : routingNodes) {
|
||||
for (MutableShardRouting shard : node) {
|
||||
for (ShardRouting shard : node) {
|
||||
if (!shard.active() && shard.relocatingNodeId() == null) {
|
||||
if (!shard.relocating()) {
|
||||
inactiveShardCount++;
|
||||
|
@ -692,20 +692,20 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
// Assert that the active shard routing are identical.
|
||||
Set<Map.Entry<String, Integer>> entries = indicesAndShards.entrySet();
|
||||
final List<MutableShardRouting> shards = newArrayList();
|
||||
final List<ShardRouting> shards = newArrayList();
|
||||
for (Map.Entry<String, Integer> e : entries) {
|
||||
String index = e.getKey();
|
||||
for (int i = 0; i < e.getValue(); i++) {
|
||||
for (RoutingNode routingNode : routingNodes) {
|
||||
for (MutableShardRouting shardRouting : routingNode) {
|
||||
for (ShardRouting shardRouting : routingNode) {
|
||||
if (shardRouting.index().equals(index) && shardRouting.id() == i) {
|
||||
shards.add(shardRouting);
|
||||
}
|
||||
}
|
||||
}
|
||||
List<MutableShardRouting> mutableShardRoutings = routingNodes.assignedShards(new ShardId(index, i));
|
||||
List<ShardRouting> mutableShardRoutings = routingNodes.assignedShards(new ShardId(index, i));
|
||||
assert mutableShardRoutings.size() == shards.size();
|
||||
for (MutableShardRouting r : mutableShardRoutings) {
|
||||
for (ShardRouting r : mutableShardRoutings) {
|
||||
assert shards.contains(r);
|
||||
shards.remove(r);
|
||||
}
|
||||
|
@ -713,7 +713,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
}
|
||||
|
||||
for (MutableShardRouting shard : routingNodes.unassigned()) {
|
||||
for (ShardRouting shard : routingNodes.unassigned()) {
|
||||
if (shard.primary()) {
|
||||
unassignedPrimaryCount++;
|
||||
}
|
||||
|
@ -731,7 +731,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
|
||||
|
||||
public class RoutingNodesIterator implements Iterator<RoutingNode>, Iterable<MutableShardRouting> {
|
||||
public class RoutingNodesIterator implements Iterator<RoutingNode>, Iterable<ShardRouting> {
|
||||
private RoutingNode current;
|
||||
private final Iterator<RoutingNode> delegate;
|
||||
|
||||
|
@ -759,15 +759,15 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Iterator<MutableShardRouting> iterator() {
|
||||
public Iterator<ShardRouting> iterator() {
|
||||
return nodeShards();
|
||||
}
|
||||
}
|
||||
|
||||
public final class RoutingNodeIterator implements Iterator<MutableShardRouting>, Iterable<MutableShardRouting> {
|
||||
public final class RoutingNodeIterator implements Iterator<ShardRouting>, Iterable<ShardRouting> {
|
||||
private final RoutingNode iterable;
|
||||
private MutableShardRouting shard;
|
||||
private final Iterator<MutableShardRouting> delegate;
|
||||
private ShardRouting shard;
|
||||
private final Iterator<ShardRouting> delegate;
|
||||
|
||||
public RoutingNodeIterator(RoutingNode iterable) {
|
||||
this.delegate = iterable.mutableIterator();
|
||||
|
@ -780,7 +780,7 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public MutableShardRouting next() {
|
||||
public ShardRouting next() {
|
||||
return shard = delegate.next();
|
||||
}
|
||||
|
||||
|
@ -791,13 +791,13 @@ public class RoutingNodes implements Iterable<RoutingNode> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Iterator<MutableShardRouting> iterator() {
|
||||
public Iterator<ShardRouting> iterator() {
|
||||
return iterable.iterator();
|
||||
}
|
||||
|
||||
public void moveToUnassigned(UnassignedInfo unassignedInfo) {
|
||||
remove();
|
||||
MutableShardRouting unassigned = new MutableShardRouting(shard); // protective copy of the mutable shard
|
||||
ShardRouting unassigned = new ShardRouting(shard); // protective copy of the mutable shard
|
||||
unassigned.moveToUnassigned(unassignedInfo);
|
||||
unassigned().add(unassigned);
|
||||
}
|
||||
|
|
|
@ -346,7 +346,7 @@ public class RoutingTable implements Iterable<IndexRoutingTable>, Diffable<Routi
|
|||
|
||||
Map<String, IndexRoutingTable.Builder> indexRoutingTableBuilders = newHashMap();
|
||||
for (RoutingNode routingNode : routingNodes) {
|
||||
for (MutableShardRouting shardRoutingEntry : routingNode) {
|
||||
for (ShardRouting shardRoutingEntry : routingNode) {
|
||||
// every relocating shard has a double entry, ignore the target one.
|
||||
if (shardRoutingEntry.state() == ShardRoutingState.INITIALIZING && shardRoutingEntry.relocatingNodeId() != null)
|
||||
continue;
|
||||
|
@ -362,7 +362,7 @@ public class RoutingTable implements Iterable<IndexRoutingTable>, Diffable<Routi
|
|||
indexBuilder.addShard(refData, shardRoutingEntry);
|
||||
}
|
||||
}
|
||||
for (MutableShardRouting shardRoutingEntry : Iterables.concat(routingNodes.unassigned(), routingNodes.ignoredUnassigned())) {
|
||||
for (ShardRouting shardRoutingEntry : Iterables.concat(routingNodes.unassigned(), routingNodes.ignoredUnassigned())) {
|
||||
String index = shardRoutingEntry.index();
|
||||
IndexRoutingTable.Builder indexBuilder = indexRoutingTableBuilders.get(index);
|
||||
if (indexBuilder == null) {
|
||||
|
|
|
@ -19,78 +19,142 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing;
|
||||
|
||||
import org.apache.lucene.util.SetOnce;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.io.stream.StreamInput;
|
||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||
import org.elasticsearch.common.io.stream.Streamable;
|
||||
import org.elasticsearch.common.xcontent.ToXContent;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Shard routing represents the state of a shard instance allocated in the cluster.
|
||||
* {@link ShardRouting} immutably encapsulates information about shard
|
||||
* routings like id, state, version, etc.
|
||||
*/
|
||||
public interface ShardRouting extends Streamable, Serializable, ToXContent {
|
||||
public final class ShardRouting implements Streamable, Serializable, ToXContent {
|
||||
|
||||
/**
|
||||
* The shard id.
|
||||
*/
|
||||
ShardId shardId();
|
||||
protected String index;
|
||||
|
||||
protected int shardId;
|
||||
|
||||
protected String currentNodeId;
|
||||
|
||||
protected String relocatingNodeId;
|
||||
|
||||
protected boolean primary;
|
||||
|
||||
protected ShardRoutingState state;
|
||||
|
||||
protected long version;
|
||||
|
||||
private transient ShardId shardIdentifier;
|
||||
|
||||
protected RestoreSource restoreSource;
|
||||
|
||||
protected UnassignedInfo unassignedInfo;
|
||||
|
||||
private final transient List<ShardRouting> asList;
|
||||
|
||||
private boolean frozen = false;
|
||||
|
||||
ShardRouting() {
|
||||
this.asList = Arrays.asList(this);
|
||||
}
|
||||
|
||||
public ShardRouting(ShardRouting copy) {
|
||||
this(copy, copy.version());
|
||||
}
|
||||
|
||||
public ShardRouting(ShardRouting copy, long version) {
|
||||
this(copy.index(), copy.id(), copy.currentNodeId(), copy.relocatingNodeId(), copy.restoreSource(), copy.primary(), copy.state(), version, copy.unassignedInfo());
|
||||
}
|
||||
|
||||
public ShardRouting(String index, int shardId, String currentNodeId, boolean primary, ShardRoutingState state, long version) {
|
||||
this(index, shardId, currentNodeId, null, primary, state, version);
|
||||
}
|
||||
|
||||
public ShardRouting(String index, int shardId, String currentNodeId,
|
||||
String relocatingNodeId, boolean primary, ShardRoutingState state, long version) {
|
||||
this(index, shardId, currentNodeId, relocatingNodeId, null, primary, state, version);
|
||||
}
|
||||
|
||||
public ShardRouting(String index, int shardId, String currentNodeId,
|
||||
String relocatingNodeId, RestoreSource restoreSource, boolean primary, ShardRoutingState state, long version) {
|
||||
this(index, shardId, currentNodeId, relocatingNodeId, restoreSource, primary, state, version, null);
|
||||
}
|
||||
|
||||
public ShardRouting(String index, int shardId, String currentNodeId,
|
||||
String relocatingNodeId, RestoreSource restoreSource, boolean primary, ShardRoutingState state, long version,
|
||||
UnassignedInfo unassignedInfo) {
|
||||
this.index = index;
|
||||
this.shardId = shardId;
|
||||
this.currentNodeId = currentNodeId;
|
||||
this.relocatingNodeId = relocatingNodeId;
|
||||
this.primary = primary;
|
||||
this.state = state;
|
||||
this.asList = Arrays.asList(this);
|
||||
this.version = version;
|
||||
this.restoreSource = restoreSource;
|
||||
this.unassignedInfo = unassignedInfo;
|
||||
assert !(state == ShardRoutingState.UNASSIGNED && unassignedInfo == null) : "unassigned shard must be created with meta";
|
||||
}
|
||||
|
||||
/**
|
||||
* The index name.
|
||||
*/
|
||||
String index();
|
||||
public String index() {
|
||||
return this.index;
|
||||
}
|
||||
|
||||
/**
|
||||
* The index name.
|
||||
*/
|
||||
String getIndex();
|
||||
public String getIndex() {
|
||||
return index();
|
||||
}
|
||||
|
||||
/**
|
||||
* The shard id.
|
||||
*/
|
||||
int id();
|
||||
public int id() {
|
||||
return this.shardId;
|
||||
}
|
||||
|
||||
/**
|
||||
* The shard id.
|
||||
*/
|
||||
int getId();
|
||||
public int getId() {
|
||||
return id();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The routing version associated with the shard.
|
||||
*/
|
||||
long version();
|
||||
|
||||
/**
|
||||
* The shard state.
|
||||
*/
|
||||
ShardRoutingState state();
|
||||
public long version() {
|
||||
return this.version;
|
||||
}
|
||||
|
||||
/**
|
||||
* The shard is unassigned (not allocated to any node).
|
||||
*/
|
||||
boolean unassigned();
|
||||
public boolean unassigned() {
|
||||
return state == ShardRoutingState.UNASSIGNED;
|
||||
}
|
||||
|
||||
/**
|
||||
* The shard is initializing (usually recovering either from peer shard
|
||||
* or from gateway).
|
||||
*/
|
||||
boolean initializing();
|
||||
|
||||
/**
|
||||
* The shard is in started mode.
|
||||
*/
|
||||
boolean started();
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> iff the this shard is currently relocating to
|
||||
* another node. Otherwise <code>false</code>
|
||||
*
|
||||
* @see ShardRoutingState#RELOCATING
|
||||
*/
|
||||
boolean relocating();
|
||||
public boolean initializing() {
|
||||
return state == ShardRoutingState.INITIALIZING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> iff the this shard is currently
|
||||
|
@ -98,61 +162,427 @@ public interface ShardRouting extends Streamable, Serializable, ToXContent {
|
|||
* {@link ShardRoutingState#RELOCATING relocating} to another node.
|
||||
* Otherwise <code>false</code>
|
||||
*/
|
||||
boolean active();
|
||||
public boolean active() {
|
||||
return started() || relocating();
|
||||
}
|
||||
|
||||
/**
|
||||
* The shard is in started mode.
|
||||
*/
|
||||
public boolean started() {
|
||||
return state == ShardRoutingState.STARTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> iff the this shard is currently relocating to
|
||||
* another node. Otherwise <code>false</code>
|
||||
*
|
||||
* @see ShardRoutingState#RELOCATING
|
||||
*/
|
||||
public boolean relocating() {
|
||||
return state == ShardRoutingState.RELOCATING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> iff this shard is assigned to a node ie. not
|
||||
* {@link ShardRoutingState#UNASSIGNED unassigned}. Otherwise <code>false</code>
|
||||
*/
|
||||
boolean assignedToNode();
|
||||
public boolean assignedToNode() {
|
||||
return currentNodeId != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The current node id the shard is allocated on.
|
||||
*/
|
||||
String currentNodeId();
|
||||
public String currentNodeId() {
|
||||
return this.currentNodeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* The relocating node id the shard is either relocating to or relocating from.
|
||||
*/
|
||||
String relocatingNodeId();
|
||||
public String relocatingNodeId() {
|
||||
return this.relocatingNodeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the shard is relocating, return a shard routing representing the target shard or null o.w.
|
||||
* The target shard routing will be the INITIALIZING state and have relocatingNodeId set to the
|
||||
* source node.
|
||||
*/
|
||||
ShardRouting targetRoutingIfRelocating();
|
||||
public ShardRouting targetRoutingIfRelocating() {
|
||||
if (!relocating()) {
|
||||
return null;
|
||||
}
|
||||
return new ShardRouting(index, shardId, relocatingNodeId, currentNodeId, primary, ShardRoutingState.INITIALIZING, version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Snapshot id and repository where this shard is being restored from
|
||||
*/
|
||||
RestoreSource restoreSource();
|
||||
public RestoreSource restoreSource() {
|
||||
return restoreSource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Additional metadata on why the shard is/was unassigned. The metadata is kept around
|
||||
* until the shard moves to STARTED.
|
||||
*/
|
||||
UnassignedInfo unassignedInfo();
|
||||
@Nullable
|
||||
public UnassignedInfo unassignedInfo() {
|
||||
return unassignedInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> iff this shard is a primary.
|
||||
*/
|
||||
boolean primary();
|
||||
public boolean primary() {
|
||||
return this.primary;
|
||||
}
|
||||
|
||||
/**
|
||||
* A short description of the shard.
|
||||
* The shard state.
|
||||
*/
|
||||
String shortSummary();
|
||||
public ShardRoutingState state() {
|
||||
return this.state;
|
||||
}
|
||||
|
||||
/**
|
||||
* The shard id.
|
||||
*/
|
||||
public ShardId shardId() {
|
||||
if (shardIdentifier != null) {
|
||||
return shardIdentifier;
|
||||
}
|
||||
shardIdentifier = new ShardId(index, shardId);
|
||||
return shardIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* A shard iterator with just this shard in it.
|
||||
*/
|
||||
ShardIterator shardsIt();
|
||||
public ShardIterator shardsIt() {
|
||||
return new PlainShardIterator(shardId(), asList);
|
||||
}
|
||||
|
||||
public static ShardRouting readShardRoutingEntry(StreamInput in) throws IOException {
|
||||
ShardRouting entry = new ShardRouting();
|
||||
entry.readFrom(in);
|
||||
return entry;
|
||||
}
|
||||
|
||||
public static ShardRouting readShardRoutingEntry(StreamInput in, String index, int shardId) throws IOException {
|
||||
ShardRouting entry = new ShardRouting();
|
||||
entry.readFrom(in, index, shardId);
|
||||
return entry;
|
||||
}
|
||||
|
||||
public void readFrom(StreamInput in, String index, int shardId) throws IOException {
|
||||
this.index = index;
|
||||
this.shardId = shardId;
|
||||
readFromThin(in);
|
||||
}
|
||||
|
||||
public void readFromThin(StreamInput in) throws IOException {
|
||||
version = in.readLong();
|
||||
if (in.readBoolean()) {
|
||||
currentNodeId = in.readString();
|
||||
}
|
||||
|
||||
if (in.readBoolean()) {
|
||||
relocatingNodeId = in.readString();
|
||||
}
|
||||
|
||||
primary = in.readBoolean();
|
||||
state = ShardRoutingState.fromValue(in.readByte());
|
||||
|
||||
restoreSource = RestoreSource.readOptionalRestoreSource(in);
|
||||
if (in.readBoolean()) {
|
||||
unassignedInfo = new UnassignedInfo(in);
|
||||
}
|
||||
freeze();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFrom(StreamInput in) throws IOException {
|
||||
readFrom(in, in.readString(), in.readVInt());
|
||||
}
|
||||
|
||||
/**
|
||||
* Does not write index name and shard id
|
||||
* Writes shard information to {@link StreamOutput} without writing index name and shard id
|
||||
*
|
||||
* @param out {@link StreamOutput} to write shard information to
|
||||
* @throws IOException if something happens during write
|
||||
*/
|
||||
void writeToThin(StreamOutput out) throws IOException;
|
||||
|
||||
void readFromThin(StreamInput in) throws ClassNotFoundException, IOException;
|
||||
public void writeToThin(StreamOutput out) throws IOException {
|
||||
out.writeLong(version);
|
||||
if (currentNodeId != null) {
|
||||
out.writeBoolean(true);
|
||||
out.writeString(currentNodeId);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
|
||||
if (relocatingNodeId != null) {
|
||||
out.writeBoolean(true);
|
||||
out.writeString(relocatingNodeId);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
|
||||
out.writeBoolean(primary);
|
||||
out.writeByte(state.value());
|
||||
|
||||
if (restoreSource != null) {
|
||||
out.writeBoolean(true);
|
||||
restoreSource.writeTo(out);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
if (unassignedInfo != null) {
|
||||
out.writeBoolean(true);
|
||||
unassignedInfo.writeTo(out);
|
||||
} else {
|
||||
out.writeBoolean(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(StreamOutput out) throws IOException {
|
||||
out.writeString(index);
|
||||
out.writeVInt(shardId);
|
||||
writeToThin(out);
|
||||
}
|
||||
|
||||
|
||||
// package private mutators start here
|
||||
|
||||
/**
|
||||
* Moves the shard to unassigned state.
|
||||
*/
|
||||
void moveToUnassigned(UnassignedInfo unassignedInfo) {
|
||||
ensureNotFrozen();
|
||||
version++;
|
||||
assert state != ShardRoutingState.UNASSIGNED;
|
||||
state = ShardRoutingState.UNASSIGNED;
|
||||
currentNodeId = null;
|
||||
relocatingNodeId = null;
|
||||
this.unassignedInfo = unassignedInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign this shard to a node.
|
||||
*
|
||||
* @param nodeId id of the node to assign this shard to
|
||||
*/
|
||||
void assignToNode(String nodeId) {
|
||||
ensureNotFrozen();
|
||||
version++;
|
||||
if (currentNodeId == null) {
|
||||
assert state == ShardRoutingState.UNASSIGNED;
|
||||
|
||||
state = ShardRoutingState.INITIALIZING;
|
||||
currentNodeId = nodeId;
|
||||
relocatingNodeId = null;
|
||||
} else if (state == ShardRoutingState.STARTED) {
|
||||
state = ShardRoutingState.RELOCATING;
|
||||
relocatingNodeId = nodeId;
|
||||
} else if (state == ShardRoutingState.RELOCATING) {
|
||||
assert nodeId.equals(relocatingNodeId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Relocate the shard to another node.
|
||||
*
|
||||
* @param relocatingNodeId id of the node to relocate the shard
|
||||
*/
|
||||
void relocate(String relocatingNodeId) {
|
||||
ensureNotFrozen();
|
||||
version++;
|
||||
assert state == ShardRoutingState.STARTED;
|
||||
state = ShardRoutingState.RELOCATING;
|
||||
this.relocatingNodeId = relocatingNodeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel relocation of a shard. The shards state must be set
|
||||
* to <code>RELOCATING</code>.
|
||||
*/
|
||||
void cancelRelocation() {
|
||||
ensureNotFrozen();
|
||||
version++;
|
||||
assert state == ShardRoutingState.RELOCATING;
|
||||
assert assignedToNode();
|
||||
assert relocatingNodeId != null;
|
||||
|
||||
state = ShardRoutingState.STARTED;
|
||||
relocatingNodeId = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the shard from started to initializing and bumps the version
|
||||
*/
|
||||
void reinitializeShard() {
|
||||
ensureNotFrozen();
|
||||
assert state == ShardRoutingState.STARTED;
|
||||
version++;
|
||||
state = ShardRoutingState.INITIALIZING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the shards state to <code>STARTED</code>. The shards state must be
|
||||
* <code>INITIALIZING</code> or <code>RELOCATING</code>. Any relocation will be
|
||||
* canceled.
|
||||
*/
|
||||
void moveToStarted() {
|
||||
ensureNotFrozen();
|
||||
version++;
|
||||
assert state == ShardRoutingState.INITIALIZING || state == ShardRoutingState.RELOCATING;
|
||||
relocatingNodeId = null;
|
||||
restoreSource = null;
|
||||
state = ShardRoutingState.STARTED;
|
||||
unassignedInfo = null; // we keep the unassigned data until the shard is started
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the shard primary unless it's not Primary
|
||||
* //TODO: doc exception
|
||||
*/
|
||||
void moveToPrimary() {
|
||||
ensureNotFrozen();
|
||||
version++;
|
||||
if (primary) {
|
||||
throw new IllegalShardRoutingStateException(this, "Already primary, can't move to primary");
|
||||
}
|
||||
primary = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the primary shard to non-primary
|
||||
*/
|
||||
void moveFromPrimary() {
|
||||
ensureNotFrozen();
|
||||
version++;
|
||||
if (!primary) {
|
||||
throw new IllegalShardRoutingStateException(this, "Not primary, can't move to replica");
|
||||
}
|
||||
primary = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
// we check on instanceof so we also handle the ImmutableShardRouting case as well
|
||||
if (o == null || !(o instanceof ShardRouting)) {
|
||||
return false;
|
||||
}
|
||||
ShardRouting that = (ShardRouting) o;
|
||||
|
||||
if (primary != that.primary) {
|
||||
return false;
|
||||
}
|
||||
if (shardId != that.shardId) {
|
||||
return false;
|
||||
}
|
||||
if (currentNodeId != null ? !currentNodeId.equals(that.currentNodeId) : that.currentNodeId != null) {
|
||||
return false;
|
||||
}
|
||||
if (index != null ? !index.equals(that.index) : that.index != null) {
|
||||
return false;
|
||||
}
|
||||
if (relocatingNodeId != null ? !relocatingNodeId.equals(that.relocatingNodeId) : that.relocatingNodeId != null) {
|
||||
return false;
|
||||
}
|
||||
if (state != that.state) {
|
||||
return false;
|
||||
}
|
||||
if (restoreSource != null ? !restoreSource.equals(that.restoreSource) : that.restoreSource != null) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private long hashVersion = version-1;
|
||||
private int hashCode = 0;
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
if (hashVersion == version) {
|
||||
return hashCode;
|
||||
}
|
||||
int result = index != null ? index.hashCode() : 0;
|
||||
result = 31 * result + shardId;
|
||||
result = 31 * result + (currentNodeId != null ? currentNodeId.hashCode() : 0);
|
||||
result = 31 * result + (relocatingNodeId != null ? relocatingNodeId.hashCode() : 0);
|
||||
result = 31 * result + (primary ? 1 : 0);
|
||||
result = 31 * result + (state != null ? state.hashCode() : 0);
|
||||
result = 31 * result + (restoreSource != null ? restoreSource.hashCode() : 0);
|
||||
return hashCode = result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return shortSummary();
|
||||
}
|
||||
|
||||
/**
|
||||
* A short description of the shard.
|
||||
*/
|
||||
public String shortSummary() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append('[').append(index).append(']').append('[').append(shardId).append(']');
|
||||
sb.append(", node[").append(currentNodeId).append("], ");
|
||||
if (relocatingNodeId != null) {
|
||||
sb.append("relocating [").append(relocatingNodeId).append("], ");
|
||||
}
|
||||
if (primary) {
|
||||
sb.append("[P]");
|
||||
} else {
|
||||
sb.append("[R]");
|
||||
}
|
||||
if (this.restoreSource != null) {
|
||||
sb.append(", restoring[" + restoreSource + "]");
|
||||
}
|
||||
sb.append(", s[").append(state).append("]");
|
||||
if (this.unassignedInfo != null) {
|
||||
sb.append(", ").append(unassignedInfo.toString());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||
builder.startObject()
|
||||
.field("state", state())
|
||||
.field("primary", primary())
|
||||
.field("node", currentNodeId())
|
||||
.field("relocating_node", relocatingNodeId())
|
||||
.field("shard", shardId().id())
|
||||
.field("index", shardId().index().name());
|
||||
if (restoreSource() != null) {
|
||||
builder.field("restore_source");
|
||||
restoreSource().toXContent(builder, params);
|
||||
}
|
||||
if (unassignedInfo != null) {
|
||||
unassignedInfo.toXContent(builder, params);
|
||||
}
|
||||
return builder.endObject();
|
||||
}
|
||||
|
||||
private void ensureNotFrozen() {
|
||||
if (frozen) {
|
||||
throw new IllegalStateException("ShardRouting can't be modified anymore - already frozen");
|
||||
}
|
||||
}
|
||||
|
||||
void freeze() {
|
||||
frozen = true;
|
||||
}
|
||||
|
||||
boolean isFrozen() {
|
||||
return frozen;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -194,7 +194,7 @@ public class AllocationService extends AbstractComponent {
|
|||
boolean changed = false;
|
||||
|
||||
// create a copy of the shards interleaving between nodes, and check if they can remain
|
||||
List<MutableShardRouting> shards = new ArrayList<>();
|
||||
List<ShardRouting> shards = new ArrayList<>();
|
||||
int index = 0;
|
||||
boolean found = true;
|
||||
final RoutingNodes routingNodes = allocation.routingNodes();
|
||||
|
@ -210,7 +210,7 @@ public class AllocationService extends AbstractComponent {
|
|||
index++;
|
||||
}
|
||||
for (int i = 0; i < shards.size(); i++) {
|
||||
MutableShardRouting shardRouting = shards.get(i);
|
||||
ShardRouting shardRouting = shards.get(i);
|
||||
// we can only move started shards...
|
||||
if (!shardRouting.started()) {
|
||||
continue;
|
||||
|
@ -240,9 +240,9 @@ public class AllocationService extends AbstractComponent {
|
|||
|
||||
// go over and remove dangling replicas that are initializing for primary shards
|
||||
List<ShardRouting> shardsToFail = Lists.newArrayList();
|
||||
for (MutableShardRouting shardEntry : routingNodes.unassigned()) {
|
||||
for (ShardRouting shardEntry : routingNodes.unassigned()) {
|
||||
if (shardEntry.primary()) {
|
||||
for (MutableShardRouting routing : routingNodes.assignedShards(shardEntry)) {
|
||||
for (ShardRouting routing : routingNodes.assignedShards(shardEntry)) {
|
||||
if (!routing.primary() && routing.initializing()) {
|
||||
shardsToFail.add(routing);
|
||||
}
|
||||
|
@ -257,9 +257,9 @@ public class AllocationService extends AbstractComponent {
|
|||
// now, go over and elect a new primary if possible, not, from this code block on, if one is elected,
|
||||
// routingNodes.hasUnassignedPrimaries() will potentially be false
|
||||
|
||||
for (MutableShardRouting shardEntry : routingNodes.unassigned()) {
|
||||
for (ShardRouting shardEntry : routingNodes.unassigned()) {
|
||||
if (shardEntry.primary()) {
|
||||
MutableShardRouting candidate = allocation.routingNodes().activeReplica(shardEntry);
|
||||
ShardRouting candidate = allocation.routingNodes().activeReplica(shardEntry);
|
||||
if (candidate != null) {
|
||||
IndexMetaData index = allocation.metaData().index(candidate.index());
|
||||
routingNodes.swapPrimaryFlag(shardEntry, candidate);
|
||||
|
@ -268,7 +268,7 @@ public class AllocationService extends AbstractComponent {
|
|||
// its also relocating, make sure to move the other routing to primary
|
||||
RoutingNode node = routingNodes.node(candidate.relocatingNodeId());
|
||||
if (node != null) {
|
||||
for (MutableShardRouting shardRouting : node) {
|
||||
for (ShardRouting shardRouting : node) {
|
||||
if (shardRouting.shardId().equals(candidate.shardId()) && !shardRouting.primary()) {
|
||||
routingNodes.swapPrimaryFlag(shardRouting);
|
||||
break;
|
||||
|
@ -312,7 +312,7 @@ public class AllocationService extends AbstractComponent {
|
|||
changed = true;
|
||||
// now, go over all the shards routing on the node, and fail them
|
||||
UnassignedInfo unassignedInfo = new UnassignedInfo(UnassignedInfo.Reason.NODE_LEFT, "node_left[" + node.nodeId() + "]");
|
||||
for (MutableShardRouting shardRouting : node.copyShards()) {
|
||||
for (ShardRouting shardRouting : node.copyShards()) {
|
||||
applyFailedShard(allocation, shardRouting, false, unassignedInfo);
|
||||
}
|
||||
// its a dead node, remove it, note, its important to remove it *after* we apply failed shard
|
||||
|
@ -333,7 +333,7 @@ public class AllocationService extends AbstractComponent {
|
|||
|
||||
RoutingNodes.RoutingNodeIterator currentRoutingNode = routingNodes.routingNodeIter(startedShard.currentNodeId());
|
||||
if (currentRoutingNode != null) {
|
||||
for (MutableShardRouting shard : currentRoutingNode) {
|
||||
for (ShardRouting shard : currentRoutingNode) {
|
||||
if (shard.shardId().equals(startedShard.shardId())) {
|
||||
relocatingNodeId = shard.relocatingNodeId();
|
||||
if (!shard.started()) {
|
||||
|
@ -356,7 +356,7 @@ public class AllocationService extends AbstractComponent {
|
|||
RoutingNodes.RoutingNodeIterator sourceRoutingNode = routingNodes.routingNodeIter(relocatingNodeId);
|
||||
if (sourceRoutingNode != null) {
|
||||
while (sourceRoutingNode.hasNext()) {
|
||||
MutableShardRouting shard = sourceRoutingNode.next();
|
||||
ShardRouting shard = sourceRoutingNode.next();
|
||||
if (shard.shardId().equals(startedShard.shardId())) {
|
||||
if (shard.relocating()) {
|
||||
dirty = true;
|
||||
|
@ -377,7 +377,7 @@ public class AllocationService extends AbstractComponent {
|
|||
private boolean applyFailedShard(RoutingAllocation allocation, ShardRouting failedShard, boolean addToIgnoreList, UnassignedInfo unassignedInfo) {
|
||||
// create a copy of the failed shard, since we assume we can change possible references to it without
|
||||
// changing the state of failed shard
|
||||
failedShard = new ImmutableShardRouting(failedShard);
|
||||
failedShard = new ShardRouting(failedShard);
|
||||
|
||||
IndexRoutingTable indexRoutingTable = allocation.routingTable().index(failedShard.index());
|
||||
if (indexRoutingTable == null) {
|
||||
|
@ -394,7 +394,7 @@ public class AllocationService extends AbstractComponent {
|
|||
RoutingNodes.RoutingNodeIterator initializingNode = routingNodes.routingNodeIter(failedShard.currentNodeId());
|
||||
if (initializingNode != null) {
|
||||
while (initializingNode.hasNext()) {
|
||||
MutableShardRouting shardRouting = initializingNode.next();
|
||||
ShardRouting shardRouting = initializingNode.next();
|
||||
if (shardRouting.equals(failedShard)) {
|
||||
dirty = true;
|
||||
initializingNode.remove();
|
||||
|
@ -411,7 +411,7 @@ public class AllocationService extends AbstractComponent {
|
|||
// now, find the node that we are relocating *from*, and cancel its relocation
|
||||
RoutingNode relocatingFromNode = routingNodes.node(failedShard.relocatingNodeId());
|
||||
if (relocatingFromNode != null) {
|
||||
for (MutableShardRouting shardRouting : relocatingFromNode) {
|
||||
for (ShardRouting shardRouting : relocatingFromNode) {
|
||||
if (shardRouting.shardId().equals(failedShard.shardId()) && shardRouting.relocating()) {
|
||||
dirty = true;
|
||||
routingNodes.cancelRelocation(shardRouting);
|
||||
|
@ -431,7 +431,7 @@ public class AllocationService extends AbstractComponent {
|
|||
RoutingNodes.RoutingNodeIterator relocatingFromNode = routingNodes.routingNodeIter(failedShard.currentNodeId());
|
||||
if (relocatingFromNode != null) {
|
||||
while (relocatingFromNode.hasNext()) {
|
||||
MutableShardRouting shardRouting = relocatingFromNode.next();
|
||||
ShardRouting shardRouting = relocatingFromNode.next();
|
||||
if (shardRouting.equals(failedShard)) {
|
||||
dirty = true;
|
||||
if (addToIgnoreList) {
|
||||
|
@ -448,7 +448,7 @@ public class AllocationService extends AbstractComponent {
|
|||
RoutingNodes.RoutingNodeIterator initializingNode = routingNodes.routingNodeIter(failedShard.relocatingNodeId());
|
||||
if (initializingNode != null) {
|
||||
while (initializingNode.hasNext()) {
|
||||
MutableShardRouting shardRouting = initializingNode.next();
|
||||
ShardRouting shardRouting = initializingNode.next();
|
||||
if (shardRouting.shardId().equals(failedShard.shardId()) && shardRouting.state() == INITIALIZING) {
|
||||
dirty = true;
|
||||
initializingNode.remove();
|
||||
|
@ -466,7 +466,7 @@ public class AllocationService extends AbstractComponent {
|
|||
RoutingNodes.RoutingNodeIterator node = routingNodes.routingNodeIter(failedShard.currentNodeId());
|
||||
if (node != null) {
|
||||
while (node.hasNext()) {
|
||||
MutableShardRouting shardRouting = node.next();
|
||||
ShardRouting shardRouting = node.next();
|
||||
if (shardRouting.equals(failedShard)) {
|
||||
dirty = true;
|
||||
if (addToIgnoreList) {
|
||||
|
@ -477,9 +477,9 @@ public class AllocationService extends AbstractComponent {
|
|||
// so we give a chance for other allocations and won't create poison failed allocations
|
||||
// that can keep other shards from being allocated (because of limits applied on how many
|
||||
// shards we can start per node)
|
||||
List<MutableShardRouting> shardsToMove = Lists.newArrayList();
|
||||
for (Iterator<MutableShardRouting> unassignedIt = routingNodes.unassigned().iterator(); unassignedIt.hasNext(); ) {
|
||||
MutableShardRouting unassignedShardRouting = unassignedIt.next();
|
||||
List<ShardRouting> shardsToMove = Lists.newArrayList();
|
||||
for (Iterator<ShardRouting> unassignedIt = routingNodes.unassigned().iterator(); unassignedIt.hasNext(); ) {
|
||||
ShardRouting unassignedShardRouting = unassignedIt.next();
|
||||
if (unassignedShardRouting.shardId().equals(failedShard.shardId())) {
|
||||
unassignedIt.remove();
|
||||
shardsToMove.add(unassignedShardRouting);
|
||||
|
|
|
@ -23,7 +23,7 @@ import com.google.common.base.Predicate;
|
|||
import org.apache.lucene.util.ArrayUtil;
|
||||
import org.apache.lucene.util.IntroSorter;
|
||||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.RoutingNodes;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
|
@ -118,7 +118,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean move(MutableShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
|
||||
public boolean move(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
|
||||
final Balancer balancer = new Balancer(logger, allocation, weightFunction, threshold);
|
||||
return balancer.move(shardRouting, node);
|
||||
}
|
||||
|
@ -227,9 +227,9 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
private final float threshold;
|
||||
private final MetaData metaData;
|
||||
|
||||
private final Predicate<MutableShardRouting> assignedFilter = new Predicate<MutableShardRouting>() {
|
||||
private final Predicate<ShardRouting> assignedFilter = new Predicate<ShardRouting>() {
|
||||
@Override
|
||||
public boolean apply(MutableShardRouting input) {
|
||||
public boolean apply(ShardRouting input) {
|
||||
return input.assignedToNode();
|
||||
}
|
||||
};
|
||||
|
@ -476,7 +476,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
*
|
||||
* @return <code>true</code> iff the shard has successfully been moved.
|
||||
*/
|
||||
public boolean move(MutableShardRouting shard, RoutingNode node ) {
|
||||
public boolean move(ShardRouting shard, RoutingNode node ) {
|
||||
if (nodes.isEmpty() || !shard.started()) {
|
||||
/* with no nodes or a not started shard this is pointless */
|
||||
return false;
|
||||
|
@ -508,7 +508,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
Decision decision = allocation.deciders().canAllocate(shard, target, allocation);
|
||||
if (decision.type() == Type.YES) { // TODO maybe we can respect throttling here too?
|
||||
sourceNode.removeShard(shard);
|
||||
final MutableShardRouting initializingShard = new MutableShardRouting(shard.index(), shard.id(), currentNode.getNodeId(),
|
||||
final ShardRouting initializingShard = new ShardRouting(shard.index(), shard.id(), currentNode.getNodeId(),
|
||||
shard.currentNodeId(), shard.restoreSource(), shard.primary(), INITIALIZING, shard.version() + 1);
|
||||
currentNode.addShard(initializingShard, decision);
|
||||
routingNodes.assign(initializingShard, target.nodeId());
|
||||
|
@ -534,8 +534,8 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
* on the target node which we respect during the allocation / balancing
|
||||
* process. In short, this method recreates the status-quo in the cluster.
|
||||
*/
|
||||
private void buildModelFromAssigned(Iterable<MutableShardRouting> shards) {
|
||||
for (MutableShardRouting shard : shards) {
|
||||
private void buildModelFromAssigned(Iterable<ShardRouting> shards) {
|
||||
for (ShardRouting shard : shards) {
|
||||
assert shard.assignedToNode();
|
||||
/* we skip relocating shards here since we expect an initializing shard with the same id coming in */
|
||||
if (shard.state() == RELOCATING) {
|
||||
|
@ -554,7 +554,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
* Allocates all given shards on the minimal eligable node for the shards index
|
||||
* with respect to the weight function. All given shards must be unassigned.
|
||||
*/
|
||||
private boolean allocateUnassigned(RoutingNodes.UnassignedShards unassigned, List<MutableShardRouting> ignoredUnassigned) {
|
||||
private boolean allocateUnassigned(RoutingNodes.UnassignedShards unassigned, List<ShardRouting> ignoredUnassigned) {
|
||||
assert !nodes.isEmpty();
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("Start allocating unassigned shards");
|
||||
|
@ -569,10 +569,10 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
* use the sorter to save some iterations.
|
||||
*/
|
||||
final AllocationDeciders deciders = allocation.deciders();
|
||||
final Comparator<MutableShardRouting> comparator = new Comparator<MutableShardRouting>() {
|
||||
final Comparator<ShardRouting> comparator = new Comparator<ShardRouting>() {
|
||||
@Override
|
||||
public int compare(MutableShardRouting o1,
|
||||
MutableShardRouting o2) {
|
||||
public int compare(ShardRouting o1,
|
||||
ShardRouting o2) {
|
||||
if (o1.primary() ^ o2.primary()) {
|
||||
return o1.primary() ? -1 : o2.primary() ? 1 : 0;
|
||||
}
|
||||
|
@ -591,15 +591,15 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
* if we allocate for instance (0, R, IDX1) we move the second replica to the secondary array and proceed with
|
||||
* the next replica. If we could not find a node to allocate (0,R,IDX1) we move all it's replicas to ingoreUnassigned.
|
||||
*/
|
||||
MutableShardRouting[] primary = unassigned.drain();
|
||||
MutableShardRouting[] secondary = new MutableShardRouting[primary.length];
|
||||
ShardRouting[] primary = unassigned.drain();
|
||||
ShardRouting[] secondary = new ShardRouting[primary.length];
|
||||
int secondaryLength = 0;
|
||||
int primaryLength = primary.length;
|
||||
ArrayUtil.timSort(primary, comparator);
|
||||
final Set<ModelNode> throttledNodes = Collections.newSetFromMap(new IdentityHashMap<ModelNode, Boolean>());
|
||||
do {
|
||||
for (int i = 0; i < primaryLength; i++) {
|
||||
MutableShardRouting shard = primary[i];
|
||||
ShardRouting shard = primary[i];
|
||||
if (!shard.primary()) {
|
||||
boolean drop = deciders.canAllocate(shard, allocation).type() == Type.NO;
|
||||
if (drop) {
|
||||
|
@ -717,7 +717,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
}
|
||||
}
|
||||
primaryLength = secondaryLength;
|
||||
MutableShardRouting[] tmp = primary;
|
||||
ShardRouting[] tmp = primary;
|
||||
primary = secondary;
|
||||
secondary = tmp;
|
||||
secondaryLength = 0;
|
||||
|
@ -740,11 +740,11 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
minNode.getNodeId());
|
||||
}
|
||||
final RoutingNode node = routingNodes.node(minNode.getNodeId());
|
||||
MutableShardRouting candidate = null;
|
||||
ShardRouting candidate = null;
|
||||
final AllocationDeciders deciders = allocation.deciders();
|
||||
/* make a copy since we modify this list in the loop */
|
||||
final ArrayList<MutableShardRouting> shards = new ArrayList<>(index.getAllShards());
|
||||
for (MutableShardRouting shard : shards) {
|
||||
final ArrayList<ShardRouting> shards = new ArrayList<>(index.getAllShards());
|
||||
for (ShardRouting shard : shards) {
|
||||
if (shard.started()) {
|
||||
// skip initializing, unassigned and relocating shards we can't relocate them anyway
|
||||
Decision allocationDecision = deciders.canAllocate(shard, node, allocation);
|
||||
|
@ -783,7 +783,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
/* now allocate on the cluster - if we are started we need to relocate the shard */
|
||||
if (candidate.started()) {
|
||||
RoutingNode lowRoutingNode = routingNodes.node(minNode.getNodeId());
|
||||
routingNodes.assign(new MutableShardRouting(candidate.index(), candidate.id(), lowRoutingNode.nodeId(), candidate
|
||||
routingNodes.assign(new ShardRouting(candidate.index(), candidate.id(), lowRoutingNode.nodeId(), candidate
|
||||
.currentNodeId(), candidate.restoreSource(), candidate.primary(), INITIALIZING, candidate.version() + 1), lowRoutingNode.nodeId());
|
||||
routingNodes.relocate(candidate, lowRoutingNode.nodeId());
|
||||
|
||||
|
@ -839,8 +839,8 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
return index == null ? 0 : index.numShards();
|
||||
}
|
||||
|
||||
public Collection<MutableShardRouting> shards() {
|
||||
Collection<MutableShardRouting> result = new ArrayList<>();
|
||||
public Collection<ShardRouting> shards() {
|
||||
Collection<ShardRouting> result = new ArrayList<>();
|
||||
for (ModelIndex index : indices.values()) {
|
||||
result.addAll(index.getAllShards());
|
||||
}
|
||||
|
@ -855,7 +855,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
return -1;
|
||||
}
|
||||
|
||||
public void addShard(MutableShardRouting shard, Decision decision) {
|
||||
public void addShard(ShardRouting shard, Decision decision) {
|
||||
numShards = -1;
|
||||
ModelIndex index = indices.get(shard.index());
|
||||
if (index == null) {
|
||||
|
@ -865,7 +865,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
index.addShard(shard, decision);
|
||||
}
|
||||
|
||||
public Decision removeShard(MutableShardRouting shard) {
|
||||
public Decision removeShard(ShardRouting shard) {
|
||||
numShards = -1;
|
||||
ModelIndex index = indices.get(shard.index());
|
||||
Decision removed = null;
|
||||
|
@ -890,7 +890,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
return indices.values().iterator();
|
||||
}
|
||||
|
||||
public boolean containsShard(MutableShardRouting shard) {
|
||||
public boolean containsShard(ShardRouting shard) {
|
||||
ModelIndex index = getIndex(shard.getIndex());
|
||||
return index == null ? false : index.containsShard(shard);
|
||||
}
|
||||
|
@ -899,7 +899,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
|
||||
static final class ModelIndex {
|
||||
private final String id;
|
||||
private final Map<MutableShardRouting, Decision> shards = new HashMap<>();
|
||||
private final Map<ShardRouting, Decision> shards = new HashMap<>();
|
||||
private int numPrimaries = -1;
|
||||
private int highestPrimary = -1;
|
||||
|
||||
|
@ -910,7 +910,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
public int highestPrimary() {
|
||||
if (highestPrimary == -1) {
|
||||
int maxId = -1;
|
||||
for (MutableShardRouting shard : shards.keySet()) {
|
||||
for (ShardRouting shard : shards.keySet()) {
|
||||
if (shard.primary()) {
|
||||
maxId = Math.max(maxId, shard.id());
|
||||
}
|
||||
|
@ -924,7 +924,7 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
return id;
|
||||
}
|
||||
|
||||
public Decision getDecicion(MutableShardRouting shard) {
|
||||
public Decision getDecicion(ShardRouting shard) {
|
||||
return shards.get(shard);
|
||||
}
|
||||
|
||||
|
@ -932,14 +932,14 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
return shards.size();
|
||||
}
|
||||
|
||||
public Collection<MutableShardRouting> getAllShards() {
|
||||
public Collection<ShardRouting> getAllShards() {
|
||||
return shards.keySet();
|
||||
}
|
||||
|
||||
public int numPrimaries() {
|
||||
if (numPrimaries == -1) {
|
||||
int num = 0;
|
||||
for (MutableShardRouting shard : shards.keySet()) {
|
||||
for (ShardRouting shard : shards.keySet()) {
|
||||
if (shard.primary()) {
|
||||
num++;
|
||||
}
|
||||
|
@ -949,19 +949,19 @@ public class BalancedShardsAllocator extends AbstractComponent implements Shards
|
|||
return numPrimaries;
|
||||
}
|
||||
|
||||
public Decision removeShard(MutableShardRouting shard) {
|
||||
public Decision removeShard(ShardRouting shard) {
|
||||
highestPrimary = numPrimaries = -1;
|
||||
return shards.remove(shard);
|
||||
}
|
||||
|
||||
public void addShard(MutableShardRouting shard, Decision decision) {
|
||||
public void addShard(ShardRouting shard, Decision decision) {
|
||||
highestPrimary = numPrimaries = -1;
|
||||
assert decision != null;
|
||||
assert !shards.containsKey(shard) : "Shard already allocated on current node: " + shards.get(shard) + " " + shard;
|
||||
shards.put(shard, decision);
|
||||
}
|
||||
|
||||
public boolean containsShard(MutableShardRouting shard) {
|
||||
public boolean containsShard(ShardRouting shard) {
|
||||
return shards.containsKey(shard);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.allocator;
|
||||
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
|
@ -74,5 +73,5 @@ public interface ShardsAllocator {
|
|||
* @param allocation current node allocation
|
||||
* @return <code>true</code> if the allocation has changed, otherwise <code>false</code>
|
||||
*/
|
||||
boolean move(MutableShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation);
|
||||
boolean move(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.allocator;
|
||||
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.allocation.FailedRerouteAllocation;
|
||||
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
|
||||
|
@ -80,7 +80,7 @@ public class ShardsAllocators extends AbstractComponent implements ShardsAllocat
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean move(MutableShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
|
||||
public boolean move(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
|
||||
return allocator.move(shardRouting, node, allocation);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,9 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.command;
|
||||
|
||||
import org.elasticsearch.ElasticsearchException;
|
||||
import org.elasticsearch.ElasticsearchParseException;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.allocation.RerouteExplanation;
|
||||
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
|
||||
|
@ -168,8 +167,8 @@ public class AllocateAllocationCommand implements AllocationCommand {
|
|||
public RerouteExplanation execute(RoutingAllocation allocation, boolean explain) {
|
||||
DiscoveryNode discoNode = allocation.nodes().resolveNode(node);
|
||||
|
||||
MutableShardRouting shardRouting = null;
|
||||
for (MutableShardRouting routing : allocation.routingNodes().unassigned()) {
|
||||
ShardRouting shardRouting = null;
|
||||
for (ShardRouting routing : allocation.routingNodes().unassigned()) {
|
||||
if (routing.shardId().equals(shardId)) {
|
||||
// prefer primaries first to allocate
|
||||
if (shardRouting == null || routing.primary()) {
|
||||
|
@ -219,7 +218,7 @@ public class AllocateAllocationCommand implements AllocationCommand {
|
|||
throw new IllegalArgumentException("[allocate] allocation of " + shardId + " on node " + discoNode + " is not allowed, reason: " + decision);
|
||||
}
|
||||
// go over and remove it from the unassigned
|
||||
for (Iterator<MutableShardRouting> it = allocation.routingNodes().unassigned().iterator(); it.hasNext(); ) {
|
||||
for (Iterator<ShardRouting> it = allocation.routingNodes().unassigned().iterator(); it.hasNext(); ) {
|
||||
if (it.next() != shardRouting) {
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -164,7 +164,7 @@ public class CancelAllocationCommand implements AllocationCommand {
|
|||
DiscoveryNode discoNode = allocation.nodes().resolveNode(node);
|
||||
boolean found = false;
|
||||
for (RoutingNodes.RoutingNodeIterator it = allocation.routingNodes().routingNodeIter(discoNode.id()); it.hasNext(); ) {
|
||||
MutableShardRouting shardRouting = it.next();
|
||||
ShardRouting shardRouting = it.next();
|
||||
if (!shardRouting.shardId().equals(shardId)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ public class CancelAllocationCommand implements AllocationCommand {
|
|||
// and cancel the relocating state from the shard its being relocated from
|
||||
RoutingNode relocatingFromNode = allocation.routingNodes().node(shardRouting.relocatingNodeId());
|
||||
if (relocatingFromNode != null) {
|
||||
for (MutableShardRouting fromShardRouting : relocatingFromNode) {
|
||||
for (ShardRouting fromShardRouting : relocatingFromNode) {
|
||||
if (fromShardRouting.shardId().equals(shardRouting.shardId()) && fromShardRouting.state() == RELOCATING) {
|
||||
allocation.routingNodes().cancelRelocation(fromShardRouting);
|
||||
break;
|
||||
|
@ -200,7 +200,7 @@ public class CancelAllocationCommand implements AllocationCommand {
|
|||
RoutingNodes.RoutingNodeIterator initializingNode = allocation.routingNodes().routingNodeIter(shardRouting.relocatingNodeId());
|
||||
if (initializingNode != null) {
|
||||
while (initializingNode.hasNext()) {
|
||||
MutableShardRouting initializingShardRouting = initializingNode.next();
|
||||
ShardRouting initializingShardRouting = initializingNode.next();
|
||||
if (initializingShardRouting.shardId().equals(shardRouting.shardId()) && initializingShardRouting.state() == INITIALIZING) {
|
||||
initializingNode.remove();
|
||||
}
|
||||
|
|
|
@ -19,10 +19,9 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.command;
|
||||
|
||||
import org.elasticsearch.ElasticsearchException;
|
||||
import org.elasticsearch.ElasticsearchParseException;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.cluster.routing.allocation.RerouteExplanation;
|
||||
|
@ -152,7 +151,7 @@ public class MoveAllocationCommand implements AllocationCommand {
|
|||
Decision decision = null;
|
||||
|
||||
boolean found = false;
|
||||
for (MutableShardRouting shardRouting : allocation.routingNodes().node(fromDiscoNode.id())) {
|
||||
for (ShardRouting shardRouting : allocation.routingNodes().node(fromDiscoNode.id())) {
|
||||
if (!shardRouting.shardId().equals(shardId)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -180,7 +179,7 @@ public class MoveAllocationCommand implements AllocationCommand {
|
|||
// its being throttled, maybe have a flag to take it into account and fail? for now, just do it since the "user" wants it...
|
||||
}
|
||||
|
||||
allocation.routingNodes().assign(new MutableShardRouting(shardRouting.index(), shardRouting.id(),
|
||||
allocation.routingNodes().assign(new ShardRouting(shardRouting.index(), shardRouting.id(),
|
||||
toRoutingNode.nodeId(), shardRouting.currentNodeId(), shardRouting.restoreSource(),
|
||||
shardRouting.primary(), ShardRoutingState.INITIALIZING, shardRouting.version() + 1), toRoutingNode.nodeId());
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@ package org.elasticsearch.cluster.routing.allocation.decider;
|
|||
import com.carrotsearch.hppc.ObjectIntHashMap;
|
||||
import com.google.common.collect.Maps;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
|
||||
|
@ -185,7 +184,7 @@ public class AwarenessAllocationDecider extends AllocationDecider {
|
|||
|
||||
// build the count of shards per attribute value
|
||||
ObjectIntHashMap<String> shardPerAttribute = new ObjectIntHashMap<>();
|
||||
for (MutableShardRouting assignedShard : allocation.routingNodes().assignedShards(shardRouting)) {
|
||||
for (ShardRouting assignedShard : allocation.routingNodes().assignedShards(shardRouting)) {
|
||||
// if the shard is relocating, then make sure we count it as part of the node it is relocating to
|
||||
if (assignedShard.relocating()) {
|
||||
RoutingNode relocationNode = allocation.routingNodes().node(assignedShard.relocatingNodeId());
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.decider;
|
||||
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.RoutingNodes;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
|
@ -53,7 +52,7 @@ public class NodeVersionAllocationDecider extends AllocationDecider {
|
|||
// we are the primary we can allocate wherever
|
||||
return allocation.decision(Decision.YES, NAME, "primary shard can be allocated anywhere");
|
||||
}
|
||||
final MutableShardRouting primary = allocation.routingNodes().activePrimary(shardRouting);
|
||||
final ShardRouting primary = allocation.routingNodes().activePrimary(shardRouting);
|
||||
if (primary == null) { // we have a primary - it's a start ;)
|
||||
return allocation.decision(Decision.YES, NAME, "no active primary shard yet");
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.decider;
|
||||
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
|
||||
|
@ -48,7 +47,7 @@ public class ReplicaAfterPrimaryActiveAllocationDecider extends AllocationDecide
|
|||
if (shardRouting.primary()) {
|
||||
return allocation.decision(Decision.YES, NAME, "shard is primary");
|
||||
}
|
||||
MutableShardRouting primary = allocation.routingNodes().activePrimary(shardRouting);
|
||||
ShardRouting primary = allocation.routingNodes().activePrimary(shardRouting);
|
||||
if (primary == null) {
|
||||
return allocation.decision(Decision.NO, NAME, "primary shard is not yet active");
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.decider;
|
||||
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
|
||||
|
@ -59,8 +58,8 @@ public class SameShardAllocationDecider extends AllocationDecider {
|
|||
|
||||
@Override
|
||||
public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
|
||||
Iterable<MutableShardRouting> assignedShards = allocation.routingNodes().assignedShards(shardRouting);
|
||||
for (MutableShardRouting assignedShard : assignedShards) {
|
||||
Iterable<ShardRouting> assignedShards = allocation.routingNodes().assignedShards(shardRouting);
|
||||
for (ShardRouting assignedShard : assignedShards) {
|
||||
if (node.nodeId().equals(assignedShard.currentNodeId())) {
|
||||
return allocation.decision(Decision.NO, NAME, "shard cannot be allocated on same node [%s] it already exists on", node.nodeId());
|
||||
}
|
||||
|
@ -83,7 +82,7 @@ public class SameShardAllocationDecider extends AllocationDecider {
|
|||
}
|
||||
}
|
||||
if (checkNodeOnSameHost) {
|
||||
for (MutableShardRouting assignedShard : assignedShards) {
|
||||
for (ShardRouting assignedShard : assignedShards) {
|
||||
if (checkNode.nodeId().equals(assignedShard.currentNodeId())) {
|
||||
return allocation.decision(Decision.NO, NAME,
|
||||
"shard cannot be allocated on same host [%s] it already exists on", node.nodeId());
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
package org.elasticsearch.cluster.routing.allocation.decider;
|
||||
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
|
@ -71,7 +70,7 @@ public class ShardsLimitAllocationDecider extends AllocationDecider {
|
|||
}
|
||||
|
||||
int nodeCount = 0;
|
||||
for (MutableShardRouting nodeShard : node) {
|
||||
for (ShardRouting nodeShard : node) {
|
||||
if (!nodeShard.index().equals(shardRouting.index())) {
|
||||
continue;
|
||||
}
|
||||
|
@ -97,7 +96,7 @@ public class ShardsLimitAllocationDecider extends AllocationDecider {
|
|||
}
|
||||
|
||||
int nodeCount = 0;
|
||||
for (MutableShardRouting nodeShard : node) {
|
||||
for (ShardRouting nodeShard : node) {
|
||||
if (!nodeShard.index().equals(shardRouting.index())) {
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
package org.elasticsearch.cluster.routing.allocation.decider;
|
||||
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
|
@ -81,7 +80,7 @@ public class ThrottlingAllocationDecider extends AllocationDecider {
|
|||
// primary is unassigned, means we are going to do recovery from gateway
|
||||
// count *just the primary* currently doing recovery on the node and check against concurrent_recoveries
|
||||
int primariesInRecovery = 0;
|
||||
for (MutableShardRouting shard : node) {
|
||||
for (ShardRouting shard : node) {
|
||||
// when a primary shard is INITIALIZING, it can be because of *initial recovery* or *relocation from another node*
|
||||
// we only count initial recoveries here, so we need to make sure that relocating node is null
|
||||
if (shard.state() == ShardRoutingState.INITIALIZING && shard.primary() && shard.relocatingNodeId() == null) {
|
||||
|
@ -106,7 +105,7 @@ public class ThrottlingAllocationDecider extends AllocationDecider {
|
|||
@Override
|
||||
public Decision canAllocate(RoutingNode node, RoutingAllocation allocation) {
|
||||
int currentRecoveries = 0;
|
||||
for (MutableShardRouting shard : node) {
|
||||
for (ShardRouting shard : node) {
|
||||
if (shard.state() == ShardRoutingState.INITIALIZING || shard.state() == ShardRoutingState.RELOCATING) {
|
||||
currentRecoveries++;
|
||||
}
|
||||
|
|
|
@ -33,12 +33,13 @@ import org.elasticsearch.cluster.metadata.MetaData;
|
|||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.*;
|
||||
import org.elasticsearch.cluster.routing.allocation.AllocationService;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.RoutingNodes;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.allocation.FailedRerouteAllocation;
|
||||
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
|
||||
import org.elasticsearch.cluster.routing.allocation.StartedRerouteAllocation;
|
||||
import org.elasticsearch.cluster.routing.allocation.decider.Decision;
|
||||
import org.elasticsearch.common.Priority;
|
||||
import org.elasticsearch.common.component.AbstractComponent;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.lease.Releasables;
|
||||
|
@ -54,7 +55,6 @@ import org.elasticsearch.indices.store.TransportNodesListShardStoreMetaData;
|
|||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -148,9 +148,9 @@ public class GatewayAllocator extends AbstractComponent {
|
|||
|
||||
// First, handle primaries, they must find a place to be allocated on here
|
||||
MetaData metaData = routingNodes.metaData();
|
||||
Iterator<MutableShardRouting> unassignedIterator = routingNodes.unassigned().iterator();
|
||||
Iterator<ShardRouting> unassignedIterator = routingNodes.unassigned().iterator();
|
||||
while (unassignedIterator.hasNext()) {
|
||||
MutableShardRouting shard = unassignedIterator.next();
|
||||
ShardRouting shard = unassignedIterator.next();
|
||||
|
||||
if (!shard.primary()) {
|
||||
continue;
|
||||
|
@ -330,7 +330,7 @@ public class GatewayAllocator extends AbstractComponent {
|
|||
// we found a match
|
||||
changed = true;
|
||||
// make sure we create one with the version from the recovered state
|
||||
allocation.routingNodes().assign(new MutableShardRouting(shard, highestVersion), node.nodeId());
|
||||
allocation.routingNodes().assign(new ShardRouting(shard, highestVersion), node.nodeId());
|
||||
unassignedIterator.remove();
|
||||
|
||||
// found a node, so no throttling, no "no", and break out of the loop
|
||||
|
@ -350,7 +350,7 @@ public class GatewayAllocator extends AbstractComponent {
|
|||
// we found a match
|
||||
changed = true;
|
||||
// make sure we create one with the version from the recovered state
|
||||
allocation.routingNodes().assign(new MutableShardRouting(shard, highestVersion), node.nodeId());
|
||||
allocation.routingNodes().assign(new ShardRouting(shard, highestVersion), node.nodeId());
|
||||
unassignedIterator.remove();
|
||||
}
|
||||
} else {
|
||||
|
@ -370,7 +370,7 @@ public class GatewayAllocator extends AbstractComponent {
|
|||
// Now, handle replicas, try to assign them to nodes that are similar to the one the primary was allocated on
|
||||
unassignedIterator = routingNodes.unassigned().iterator();
|
||||
while (unassignedIterator.hasNext()) {
|
||||
MutableShardRouting shard = unassignedIterator.next();
|
||||
ShardRouting shard = unassignedIterator.next();
|
||||
if (shard.primary()) {
|
||||
continue;
|
||||
}
|
||||
|
@ -448,7 +448,7 @@ public class GatewayAllocator extends AbstractComponent {
|
|||
|
||||
if (!shard.primary()) {
|
||||
hasReplicaData |= storeFilesMetaData.iterator().hasNext();
|
||||
MutableShardRouting primaryShard = routingNodes.activePrimary(shard);
|
||||
ShardRouting primaryShard = routingNodes.activePrimary(shard);
|
||||
if (primaryShard != null) {
|
||||
assert primaryShard.active();
|
||||
DiscoveryNode primaryNode = nodes.get(primaryShard.currentNodeId());
|
||||
|
|
|
@ -284,7 +284,7 @@ public class GatewayMetaState extends AbstractComponent implements ClusterStateL
|
|||
throw new IllegalStateException("cluster state does not contain this node - cannot write index meta state");
|
||||
}
|
||||
Set<String> indices = new HashSet<>();
|
||||
for (MutableShardRouting routing : newRoutingNode) {
|
||||
for (ShardRouting routing : newRoutingNode) {
|
||||
indices.add(routing.index());
|
||||
}
|
||||
// we have to check the meta data also: closed indices will not appear in the routing table, but we must still write the state if we have it written on disk previously
|
||||
|
|
|
@ -27,8 +27,10 @@ import org.elasticsearch.common.unit.TimeValue;
|
|||
import org.elasticsearch.common.xcontent.ToXContent;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilderString;
|
||||
import org.elasticsearch.index.shard.ShardPath;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
*/
|
||||
|
@ -111,7 +113,6 @@ public class StoreStats implements Streamable, ToXContent {
|
|||
static final XContentBuilderString STORE = new XContentBuilderString("store");
|
||||
static final XContentBuilderString SIZE = new XContentBuilderString("size");
|
||||
static final XContentBuilderString SIZE_IN_BYTES = new XContentBuilderString("size_in_bytes");
|
||||
|
||||
static final XContentBuilderString THROTTLE_TIME = new XContentBuilderString("throttle_time");
|
||||
static final XContentBuilderString THROTTLE_TIME_IN_MILLIS = new XContentBuilderString("throttle_time_in_millis");
|
||||
}
|
||||
|
|
|
@ -270,7 +270,7 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent<Indic
|
|||
}
|
||||
// now, go over and delete shards that needs to get deleted
|
||||
newShardIds.clear();
|
||||
for (MutableShardRouting shard : routingNode) {
|
||||
for (ShardRouting shard : routingNode) {
|
||||
if (shard.index().equals(index)) {
|
||||
newShardIds.add(shard.id());
|
||||
}
|
||||
|
@ -301,7 +301,7 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent<Indic
|
|||
if (routingNode == null) {
|
||||
return;
|
||||
}
|
||||
for (MutableShardRouting shard : routingNode) {
|
||||
for (ShardRouting shard : routingNode) {
|
||||
if (!indicesService.hasIndex(shard.index())) {
|
||||
final IndexMetaData indexMetaData = event.state().metaData().index(shard.index());
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
|
|
@ -225,7 +225,7 @@ public class ShardReplicationTests extends ElasticsearchTestCase {
|
|||
} else {
|
||||
unassignedInfo = new UnassignedInfo(UnassignedInfo.Reason.INDEX_CREATED, null);
|
||||
}
|
||||
indexShardRoutingBuilder.addShard(new ImmutableShardRouting(index, 0, primaryNode, relocatingNode, null, true, primaryState, 0, unassignedInfo));
|
||||
indexShardRoutingBuilder.addShard(new ShardRouting(index, 0, primaryNode, relocatingNode, null, true, primaryState, 0, unassignedInfo));
|
||||
|
||||
for (ShardRoutingState replicaState : replicaStates) {
|
||||
String replicaNode = null;
|
||||
|
@ -241,7 +241,7 @@ public class ShardReplicationTests extends ElasticsearchTestCase {
|
|||
unassignedInfo = new UnassignedInfo(UnassignedInfo.Reason.INDEX_CREATED, null);
|
||||
}
|
||||
indexShardRoutingBuilder.addShard(
|
||||
new ImmutableShardRouting(index, shardId.id(), replicaNode, relocatingNode, null, false, replicaState, 0, unassignedInfo));
|
||||
new ShardRouting(index, shardId.id(), replicaNode, relocatingNode, null, false, replicaState, 0, unassignedInfo));
|
||||
}
|
||||
|
||||
ClusterState.Builder state = ClusterState.builder(new ClusterName("test"));
|
||||
|
|
|
@ -107,7 +107,7 @@ public class ClusterHealthResponsesTests extends ElasticsearchTestCase {
|
|||
|
||||
static int node_id = 1;
|
||||
|
||||
private ImmutableShardRouting genShardRouting(String index, int shardId, boolean primary) {
|
||||
private ShardRouting genShardRouting(String index, int shardId, boolean primary) {
|
||||
|
||||
ShardRoutingState state;
|
||||
|
||||
|
@ -122,11 +122,11 @@ public class ClusterHealthResponsesTests extends ElasticsearchTestCase {
|
|||
|
||||
switch (state) {
|
||||
case STARTED:
|
||||
return new MutableShardRouting(index, shardId, "node_" + Integer.toString(node_id++), null, null, primary, ShardRoutingState.STARTED, 1);
|
||||
return new ShardRouting(index, shardId, "node_" + Integer.toString(node_id++), null, null, primary, ShardRoutingState.STARTED, 1);
|
||||
case INITIALIZING:
|
||||
return new MutableShardRouting(index, shardId, "node_" + Integer.toString(node_id++), null, null, primary, ShardRoutingState.INITIALIZING, 1);
|
||||
return new ShardRouting(index, shardId, "node_" + Integer.toString(node_id++), null, null, primary, ShardRoutingState.INITIALIZING, 1);
|
||||
case RELOCATING:
|
||||
return new MutableShardRouting(index, shardId, "node_" + Integer.toString(node_id++), "node_" + Integer.toString(node_id++), null, primary, ShardRoutingState.RELOCATING, 1);
|
||||
return new ShardRouting(index, shardId, "node_" + Integer.toString(node_id++), "node_" + Integer.toString(node_id++), null, primary, ShardRoutingState.RELOCATING, 1);
|
||||
default:
|
||||
throw new ElasticsearchException("Unknown state: " + state.name());
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ public class ClusterHealthResponsesTests extends ElasticsearchTestCase {
|
|||
|
||||
private IndexShardRoutingTable genShardRoutingTable(String index, int shardId, int replicas, ShardCounter counter) {
|
||||
IndexShardRoutingTable.Builder builder = new IndexShardRoutingTable.Builder(new ShardId(index, shardId), true);
|
||||
ImmutableShardRouting shardRouting = genShardRouting(index, shardId, true);
|
||||
ShardRouting shardRouting = genShardRouting(index, shardId, true);
|
||||
counter.update(shardRouting);
|
||||
builder.addShard(shardRouting);
|
||||
for (; replicas > 0; replicas--) {
|
||||
|
|
|
@ -222,7 +222,7 @@ public class ClusterStateDiffTests extends ElasticsearchIntegrationTest {
|
|||
int replicaCount = randomIntBetween(1, 10);
|
||||
for (int j = 0; j < replicaCount; j++) {
|
||||
indexShard.addShard(
|
||||
new MutableShardRouting(index, i, randomFrom(nodeIds), null, null, j == 0, ShardRoutingState.fromValue((byte) randomIntBetween(2, 4)), 1));
|
||||
new ShardRouting(index, i, randomFrom(nodeIds), null, null, j == 0, ShardRoutingState.fromValue((byte) randomIntBetween(2, 4)), 1));
|
||||
}
|
||||
builder.addIndexShard(indexShard.build());
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ import org.elasticsearch.client.Client;
|
|||
import org.elasticsearch.cluster.ClusterState;
|
||||
import org.elasticsearch.cluster.metadata.AliasMetaData;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.cluster.routing.allocation.command.MoveAllocationCommand;
|
||||
|
@ -189,18 +189,18 @@ public class AckTests extends ElasticsearchIntegrationTest {
|
|||
|
||||
for (Client client : clients()) {
|
||||
ClusterState clusterState = getLocalClusterState(client);
|
||||
for (MutableShardRouting mutableShardRouting : clusterState.routingNodes().routingNodeIter(moveAllocationCommand.fromNode())) {
|
||||
for (ShardRouting shardRouting : clusterState.routingNodes().routingNodeIter(moveAllocationCommand.fromNode())) {
|
||||
//if the shard that we wanted to move is still on the same node, it must be relocating
|
||||
if (mutableShardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
assertThat(mutableShardRouting.relocating(), equalTo(true));
|
||||
if (shardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
assertThat(shardRouting.relocating(), equalTo(true));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (MutableShardRouting mutableShardRouting : clusterState.routingNodes().routingNodeIter(moveAllocationCommand.toNode())) {
|
||||
if (mutableShardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
assertThat(mutableShardRouting.state(), anyOf(equalTo(ShardRoutingState.INITIALIZING), equalTo(ShardRoutingState.STARTED)));
|
||||
for (ShardRouting shardRouting : clusterState.routingNodes().routingNodeIter(moveAllocationCommand.toNode())) {
|
||||
if (shardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
assertThat(shardRouting.state(), anyOf(equalTo(ShardRoutingState.INITIALIZING), equalTo(ShardRoutingState.STARTED)));
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
@ -239,19 +239,19 @@ public class AckTests extends ElasticsearchIntegrationTest {
|
|||
//all nodes hold the same cluster state version. We only know there was no need to change anything, thus no need for ack on this update.
|
||||
ClusterStateResponse clusterStateResponse = client().admin().cluster().prepareState().get();
|
||||
boolean found = false;
|
||||
for (MutableShardRouting mutableShardRouting : clusterStateResponse.getState().routingNodes().routingNodeIter(moveAllocationCommand.fromNode())) {
|
||||
for (ShardRouting shardRouting : clusterStateResponse.getState().routingNodes().routingNodeIter(moveAllocationCommand.fromNode())) {
|
||||
//the shard that we wanted to move is still on the same node, as we had dryRun flag
|
||||
if (mutableShardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
assertThat(mutableShardRouting.started(), equalTo(true));
|
||||
if (shardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
assertThat(shardRouting.started(), equalTo(true));
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
assertThat(found, equalTo(true));
|
||||
|
||||
for (MutableShardRouting mutableShardRouting : clusterStateResponse.getState().routingNodes().routingNodeIter(moveAllocationCommand.toNode())) {
|
||||
if (mutableShardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
fail("shard [" + mutableShardRouting + "] shouldn't be on node [" + moveAllocationCommand.toString() + "]");
|
||||
for (ShardRouting shardRouting : clusterStateResponse.getState().routingNodes().routingNodeIter(moveAllocationCommand.toNode())) {
|
||||
if (shardRouting.shardId().equals(moveAllocationCommand.shardId())) {
|
||||
fail("shard [" + shardRouting + "] shouldn't be on node [" + moveAllocationCommand.toString() + "]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ public class AckTests extends ElasticsearchIntegrationTest {
|
|||
private MoveAllocationCommand getAllocationCommand() {
|
||||
String fromNodeId = null;
|
||||
String toNodeId = null;
|
||||
MutableShardRouting shardToBeMoved = null;
|
||||
ShardRouting shardToBeMoved = null;
|
||||
ClusterStateResponse clusterStateResponse = client().admin().cluster().prepareState().get();
|
||||
for (RoutingNode routingNode : clusterStateResponse.getState().routingNodes()) {
|
||||
if (routingNode.node().isDataNode()) {
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* 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.routing;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.elasticsearch.Version;
|
||||
import org.elasticsearch.cluster.ClusterState;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.allocation.AllocationService;
|
||||
import org.elasticsearch.cluster.routing.allocation.decider.SameShardAllocationDecider;
|
||||
import org.elasticsearch.common.io.stream.BytesStreamOutput;
|
||||
import org.elasticsearch.common.io.stream.StreamInput;
|
||||
import org.elasticsearch.common.transport.DummyTransportAddress;
|
||||
import org.elasticsearch.test.ElasticsearchAllocationTestCase;
|
||||
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class ShardRoutingTests extends ElasticsearchTestCase {
|
||||
|
||||
public void testFrozenAfterRead() throws IOException {
|
||||
ShardRouting routing = new ShardRouting("foo", 1, "node_1", null, null, false, ShardRoutingState.INITIALIZING, 1);
|
||||
routing.moveToPrimary();
|
||||
assertTrue(routing.primary);
|
||||
routing.moveFromPrimary();
|
||||
assertFalse(routing.primary);
|
||||
BytesStreamOutput out = new BytesStreamOutput();
|
||||
routing.writeTo(out);
|
||||
ShardRouting newRouting = ShardRouting.readShardRoutingEntry(StreamInput.wrap(out.bytes()));
|
||||
try {
|
||||
newRouting.moveToPrimary();
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void testFrozenOnRoutingTable() {
|
||||
MetaData metaData = MetaData.builder()
|
||||
.put(IndexMetaData.builder("test").settings(settings(Version.CURRENT)).numberOfShards(2).numberOfReplicas(1))
|
||||
.build();
|
||||
|
||||
RoutingTable routingTable = RoutingTable.builder()
|
||||
.addAsNew(metaData.index("test"))
|
||||
.build();
|
||||
ClusterState clusterState = ClusterState.builder(org.elasticsearch.cluster.ClusterName.DEFAULT).metaData(metaData).routingTable(routingTable).build();
|
||||
for (ShardRouting routing : clusterState.routingTable().allShards()) {
|
||||
long version = routing.version();
|
||||
assertTrue(routing.isFrozen());
|
||||
try {
|
||||
routing.moveToPrimary();
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
try {
|
||||
routing.moveToStarted();
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
routing.moveFromPrimary();
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
routing.assignToNode("boom");
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
try {
|
||||
routing.cancelRelocation();
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
try {
|
||||
routing.moveToUnassigned(new UnassignedInfo(UnassignedInfo.Reason.REPLICA_ADDED, "foobar"));
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
|
||||
try {
|
||||
routing.relocate("foobar");
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
try {
|
||||
routing.reinitializeShard();
|
||||
fail("must be frozen");
|
||||
} catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
assertEquals(version, routing.version());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -87,7 +87,7 @@ public class UnassignedInfoTests extends ElasticsearchAllocationTestCase {
|
|||
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
|
||||
.metaData(metaData)
|
||||
.routingTable(RoutingTable.builder().addAsNew(metaData.index("test"))).build();
|
||||
for (MutableShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
for (ShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
assertThat(shard.unassignedInfo().getReason(), equalTo(UnassignedInfo.Reason.INDEX_CREATED));
|
||||
}
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ public class UnassignedInfoTests extends ElasticsearchAllocationTestCase {
|
|||
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
|
||||
.metaData(metaData)
|
||||
.routingTable(RoutingTable.builder().addAsRecovery(metaData.index("test"))).build();
|
||||
for (MutableShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
for (ShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
assertThat(shard.unassignedInfo().getReason(), equalTo(UnassignedInfo.Reason.CLUSTER_RECOVERED));
|
||||
}
|
||||
}
|
||||
|
@ -113,7 +113,7 @@ public class UnassignedInfoTests extends ElasticsearchAllocationTestCase {
|
|||
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
|
||||
.metaData(metaData)
|
||||
.routingTable(RoutingTable.builder().addAsFromCloseToOpen(metaData.index("test"))).build();
|
||||
for (MutableShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
for (ShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
assertThat(shard.unassignedInfo().getReason(), equalTo(UnassignedInfo.Reason.INDEX_REOPENED));
|
||||
}
|
||||
}
|
||||
|
@ -126,7 +126,7 @@ public class UnassignedInfoTests extends ElasticsearchAllocationTestCase {
|
|||
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
|
||||
.metaData(metaData)
|
||||
.routingTable(RoutingTable.builder().addAsNewRestore(metaData.index("test"), new RestoreSource(new SnapshotId("rep1", "snp1"), "test"), new IntHashSet())).build();
|
||||
for (MutableShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
for (ShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
assertThat(shard.unassignedInfo().getReason(), equalTo(UnassignedInfo.Reason.NEW_INDEX_RESTORED));
|
||||
}
|
||||
}
|
||||
|
@ -139,7 +139,7 @@ public class UnassignedInfoTests extends ElasticsearchAllocationTestCase {
|
|||
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
|
||||
.metaData(metaData)
|
||||
.routingTable(RoutingTable.builder().addAsRestore(metaData.index("test"), new RestoreSource(new SnapshotId("rep1", "snp1"), "test"))).build();
|
||||
for (MutableShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
for (ShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
assertThat(shard.unassignedInfo().getReason(), equalTo(UnassignedInfo.Reason.EXISTING_INDEX_RESTORED));
|
||||
}
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ public class UnassignedInfoTests extends ElasticsearchAllocationTestCase {
|
|||
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
|
||||
.metaData(metaData)
|
||||
.routingTable(RoutingTable.builder().addAsFromDangling(metaData.index("test"))).build();
|
||||
for (MutableShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
for (ShardRouting shard : clusterState.routingNodes().shardsWithState(UNASSIGNED)) {
|
||||
assertThat(shard.unassignedInfo().getReason(), equalTo(UnassignedInfo.Reason.DANGLING_INDEX_IMPORTED));
|
||||
}
|
||||
}
|
||||
|
@ -186,8 +186,8 @@ public class UnassignedInfoTests extends ElasticsearchAllocationTestCase {
|
|||
*/
|
||||
@Test
|
||||
public void testStateTransitionMetaHandling() {
|
||||
ImmutableShardRouting shard = new ImmutableShardRouting("test", 1, null, null, null, true, ShardRoutingState.UNASSIGNED, 1, new UnassignedInfo(UnassignedInfo.Reason.INDEX_CREATED, null));
|
||||
MutableShardRouting mutable = new MutableShardRouting(shard);
|
||||
ShardRouting shard = new ShardRouting("test", 1, null, null, null, true, ShardRoutingState.UNASSIGNED, 1, new UnassignedInfo(UnassignedInfo.Reason.INDEX_CREATED, null));
|
||||
ShardRouting mutable = new ShardRouting(shard);
|
||||
assertThat(mutable.unassignedInfo(), notNullValue());
|
||||
mutable.assignToNode("test_node");
|
||||
assertThat(mutable.state(), equalTo(ShardRoutingState.INITIALIZING));
|
||||
|
|
|
@ -326,7 +326,7 @@ public class BalanceConfigurationTests extends ElasticsearchAllocationTestCase {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean move(MutableShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
|
||||
public boolean move(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -365,7 +365,7 @@ public class BalanceConfigurationTests extends ElasticsearchAllocationTestCase {
|
|||
public boolean allocateUnassigned(RoutingAllocation allocation) {
|
||||
RoutingNodes.UnassignedShards unassigned = allocation.routingNodes().unassigned();
|
||||
boolean changed = !unassigned.isEmpty();
|
||||
for (MutableShardRouting sr : unassigned) {
|
||||
for (ShardRouting sr : unassigned) {
|
||||
switch (sr.id()) {
|
||||
case 0:
|
||||
if (sr.primary()) {
|
||||
|
@ -430,8 +430,8 @@ public class BalanceConfigurationTests extends ElasticsearchAllocationTestCase {
|
|||
RoutingNodes routingNodes = clusterState.routingNodes();
|
||||
|
||||
for (RoutingNode routingNode : routingNodes) {
|
||||
for (MutableShardRouting mutableShardRouting : routingNode) {
|
||||
assertThat(mutableShardRouting.state(), Matchers.equalTo(ShardRoutingState.INITIALIZING));
|
||||
for (ShardRouting shardRouting : routingNode) {
|
||||
assertThat(shardRouting.state(), Matchers.equalTo(ShardRoutingState.INITIALIZING));
|
||||
}
|
||||
}
|
||||
strategy = createAllocationService(settings.build());
|
||||
|
@ -442,8 +442,8 @@ public class BalanceConfigurationTests extends ElasticsearchAllocationTestCase {
|
|||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
routingNodes = clusterState.routingNodes();
|
||||
for (RoutingNode routingNode : routingNodes) {
|
||||
for (MutableShardRouting mutableShardRouting : routingNode) {
|
||||
assertThat(mutableShardRouting.state(), Matchers.equalTo(ShardRoutingState.STARTED));
|
||||
for (ShardRouting shardRouting : routingNode) {
|
||||
assertThat(shardRouting.state(), Matchers.equalTo(ShardRoutingState.STARTED));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -453,8 +453,8 @@ public class BalanceConfigurationTests extends ElasticsearchAllocationTestCase {
|
|||
routingNodes = clusterState.routingNodes();
|
||||
|
||||
for (RoutingNode routingNode : routingNodes) {
|
||||
for (MutableShardRouting mutableShardRouting : routingNode) {
|
||||
assertThat(mutableShardRouting.state(), Matchers.equalTo(ShardRoutingState.STARTED));
|
||||
for (ShardRouting shardRouting : routingNode) {
|
||||
assertThat(shardRouting.state(), Matchers.equalTo(ShardRoutingState.STARTED));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -464,8 +464,8 @@ public class BalanceConfigurationTests extends ElasticsearchAllocationTestCase {
|
|||
routingNodes = clusterState.routingNodes();
|
||||
|
||||
for (RoutingNode routingNode : routingNodes) {
|
||||
for (MutableShardRouting mutableShardRouting : routingNode) {
|
||||
assertThat(mutableShardRouting.state(), Matchers.equalTo(ShardRoutingState.STARTED));
|
||||
for (ShardRouting shardRouting : routingNode) {
|
||||
assertThat(shardRouting.state(), Matchers.equalTo(ShardRoutingState.STARTED));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ public abstract class CatAllocationTestBase extends ElasticsearchAllocationTestC
|
|||
ShardRoutingState state = ShardRoutingState.valueOf(matcher.group(4));
|
||||
String ip = matcher.group(5);
|
||||
nodes.add(ip);
|
||||
MutableShardRouting routing = new MutableShardRouting(index, shard, ip, null, null, primary, state, 1);
|
||||
ShardRouting routing = new ShardRouting(index, shard, ip, null, null, primary, state, 1);
|
||||
idx.add(routing);
|
||||
logger.debug("Add routing {}", routing);
|
||||
} else {
|
||||
|
@ -95,7 +95,7 @@ public abstract class CatAllocationTestBase extends ElasticsearchAllocationTestC
|
|||
builder.put(idxMeta, false);
|
||||
IndexRoutingTable.Builder tableBuilder = new IndexRoutingTable.Builder(idx.name).initializeAsRecovery(idxMeta);
|
||||
Map<Integer, IndexShardRoutingTable> shardIdToRouting = new HashMap<>();
|
||||
for (MutableShardRouting r : idx.routing) {
|
||||
for (ShardRouting r : idx.routing) {
|
||||
IndexShardRoutingTable refData = new IndexShardRoutingTable.Builder(new ShardId(idx.name, r.id()), true).addShard(r).build();
|
||||
if (shardIdToRouting.containsKey(r.getId())) {
|
||||
refData = new IndexShardRoutingTable.Builder(shardIdToRouting.get(r.getId())).addShard(r).build();
|
||||
|
@ -155,20 +155,20 @@ public abstract class CatAllocationTestBase extends ElasticsearchAllocationTestC
|
|||
|
||||
public class Idx {
|
||||
final String name;
|
||||
final List<MutableShardRouting> routing = new ArrayList<>();
|
||||
final List<ShardRouting> routing = new ArrayList<>();
|
||||
|
||||
public Idx(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
public void add(MutableShardRouting r) {
|
||||
public void add(ShardRouting r) {
|
||||
routing.add(r);
|
||||
}
|
||||
|
||||
public int numReplicas() {
|
||||
int count = 0;
|
||||
for (MutableShardRouting msr : routing) {
|
||||
for (ShardRouting msr : routing) {
|
||||
if (msr.primary() == false && msr.id()==0) {
|
||||
count++;
|
||||
}
|
||||
|
@ -178,7 +178,7 @@ public abstract class CatAllocationTestBase extends ElasticsearchAllocationTestC
|
|||
|
||||
public int numShards() {
|
||||
int max = 0;
|
||||
for (MutableShardRouting msr : routing) {
|
||||
for (ShardRouting msr : routing) {
|
||||
if (msr.primary()) {
|
||||
max = Math.max(msr.getId()+1, max);
|
||||
}
|
||||
|
|
|
@ -111,7 +111,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
assertThat(clusterState.routingNodes().node("node3").get(0).state(), equalTo(INITIALIZING));
|
||||
|
||||
logger.info("--> fail primary shard recovering instance on node3 being initialized");
|
||||
rerouteResult = allocation.applyFailedShard(clusterState, new ImmutableShardRouting(clusterState.routingNodes().node("node3").get(0)));
|
||||
rerouteResult = allocation.applyFailedShard(clusterState, new ShardRouting(clusterState.routingNodes().node("node3").get(0)));
|
||||
clusterState = ClusterState.builder(clusterState).routingTable(rerouteResult.routingTable()).build();
|
||||
|
||||
assertThat(clusterState.routingNodes().node(origPrimaryNodeId).get(0).state(), equalTo(STARTED));
|
||||
|
@ -127,7 +127,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
assertThat(clusterState.routingNodes().node("node3").get(0).state(), equalTo(INITIALIZING));
|
||||
|
||||
logger.info("--> fail primary shard recovering instance on node1 being relocated");
|
||||
rerouteResult = allocation.applyFailedShard(clusterState, new ImmutableShardRouting(clusterState.routingNodes().node(origPrimaryNodeId).get(0)));
|
||||
rerouteResult = allocation.applyFailedShard(clusterState, new ShardRouting(clusterState.routingNodes().node(origPrimaryNodeId).get(0)));
|
||||
clusterState = ClusterState.builder(clusterState).routingTable(rerouteResult.routingTable()).build();
|
||||
|
||||
// check promotion of replica to primary
|
||||
|
@ -199,7 +199,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
}
|
||||
|
||||
logger.info("fail the primary shard, will have no place to be rerouted to (single node), so stays unassigned");
|
||||
ShardRouting shardToFail = new ImmutableShardRouting(routingTable.index("test").shard(0).primaryShard());
|
||||
ShardRouting shardToFail = new ShardRouting(routingTable.index("test").shard(0).primaryShard());
|
||||
prevRoutingTable = routingTable;
|
||||
routingTable = strategy.applyFailedShard(clusterState, shardToFail).routingTable();
|
||||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
|
@ -256,7 +256,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
|
||||
logger.info("fail the first shard, will have no place to be rerouted to (single node), so stays unassigned");
|
||||
prevRoutingTable = routingTable;
|
||||
routingTable = strategy.applyFailedShard(clusterState, new ImmutableShardRouting("test", 0, "node1", true, INITIALIZING, 0)).routingTable();
|
||||
routingTable = strategy.applyFailedShard(clusterState, new ShardRouting("test", 0, "node1", true, INITIALIZING, 0)).routingTable();
|
||||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
RoutingNodes routingNodes = clusterState.routingNodes();
|
||||
|
||||
|
@ -272,7 +272,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
}
|
||||
|
||||
logger.info("fail the shard again, see that nothing happens");
|
||||
assertThat(strategy.applyFailedShard(clusterState, new ImmutableShardRouting("test", 0, "node1", true, INITIALIZING, 0)).changed(), equalTo(false));
|
||||
assertThat(strategy.applyFailedShard(clusterState, new ShardRouting("test", 0, "node1", true, INITIALIZING, 0)).changed(), equalTo(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -318,7 +318,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
String n = "node" + Integer.toString(randomInt(numberOfReplicas));
|
||||
logger.info("failing shard on node [{}]", n);
|
||||
ShardRouting shardToFail = routingNodes.node(n).get(0);
|
||||
failedShards.add(new FailedRerouteAllocation.FailedShard(new MutableShardRouting(shardToFail), null));
|
||||
failedShards.add(new FailedRerouteAllocation.FailedShard(new ShardRouting(shardToFail), null));
|
||||
}
|
||||
|
||||
routingTable = strategy.applyFailedShards(clusterState, failedShards).routingTable();
|
||||
|
@ -371,7 +371,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
|
||||
logger.info("fail the first shard, will start INITIALIZING on the second node");
|
||||
prevRoutingTable = routingTable;
|
||||
routingTable = strategy.applyFailedShard(clusterState, new ImmutableShardRouting("test", 0, nodeHoldingPrimary, true, INITIALIZING, 0)).routingTable();
|
||||
routingTable = strategy.applyFailedShard(clusterState, new ShardRouting("test", 0, nodeHoldingPrimary, true, INITIALIZING, 0)).routingTable();
|
||||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
RoutingNodes routingNodes = clusterState.routingNodes();
|
||||
|
||||
|
@ -387,7 +387,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
}
|
||||
|
||||
logger.info("fail the shard again, see that nothing happens");
|
||||
assertThat(strategy.applyFailedShard(clusterState, new ImmutableShardRouting("test", 0, nodeHoldingPrimary, true, INITIALIZING, 0)).changed(), equalTo(false));
|
||||
assertThat(strategy.applyFailedShard(clusterState, new ShardRouting("test", 0, nodeHoldingPrimary, true, INITIALIZING, 0)).changed(), equalTo(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -471,7 +471,7 @@ public class FailedShardsRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
ShardRouting shardToFail = routingNodes.node("node3").get(0);
|
||||
routingNodes = clusterState.routingNodes();
|
||||
prevRoutingTable = routingTable;
|
||||
routingTable = strategy.applyFailedShard(clusterState, new ImmutableShardRouting(shardToFail)).routingTable();
|
||||
routingTable = strategy.applyFailedShard(clusterState, new ShardRouting(shardToFail)).routingTable();
|
||||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
routingNodes = clusterState.routingNodes();
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ import org.elasticsearch.cluster.ClusterState;
|
|||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.common.logging.ESLogger;
|
||||
|
@ -85,9 +85,9 @@ public class FilterRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
|
||||
logger.info("--> make sure shards are only allocated on tag1 with value1 and value2");
|
||||
List<MutableShardRouting> startedShards = clusterState.routingNodes().shardsWithState(ShardRoutingState.STARTED);
|
||||
List<ShardRouting> startedShards = clusterState.routingNodes().shardsWithState(ShardRoutingState.STARTED);
|
||||
assertThat(startedShards.size(), equalTo(4));
|
||||
for (MutableShardRouting startedShard : startedShards) {
|
||||
for (ShardRouting startedShard : startedShards) {
|
||||
assertThat(startedShard.currentNodeId(), Matchers.anyOf(equalTo("node1"), equalTo("node2")));
|
||||
}
|
||||
}
|
||||
|
@ -134,9 +134,9 @@ public class FilterRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
|
||||
logger.info("--> make sure shards are only allocated on tag1 with value1 and value2");
|
||||
List<MutableShardRouting> startedShards = clusterState.routingNodes().shardsWithState(ShardRoutingState.STARTED);
|
||||
List<ShardRouting> startedShards = clusterState.routingNodes().shardsWithState(ShardRoutingState.STARTED);
|
||||
assertThat(startedShards.size(), equalTo(4));
|
||||
for (MutableShardRouting startedShard : startedShards) {
|
||||
for (ShardRouting startedShard : startedShards) {
|
||||
assertThat(startedShard.currentNodeId(), Matchers.anyOf(equalTo("node1"), equalTo("node2")));
|
||||
}
|
||||
|
||||
|
@ -162,7 +162,7 @@ public class FilterRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
|
||||
startedShards = clusterState.routingNodes().shardsWithState(ShardRoutingState.STARTED);
|
||||
assertThat(startedShards.size(), equalTo(4));
|
||||
for (MutableShardRouting startedShard : startedShards) {
|
||||
for (ShardRouting startedShard : startedShards) {
|
||||
assertThat(startedShard.currentNodeId(), Matchers.anyOf(equalTo("node1"), equalTo("node4")));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNodes;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
|
@ -316,8 +316,8 @@ public class NodeVersionAllocationDeciderTests extends ElasticsearchAllocationTe
|
|||
private final void assertRecoveryNodeVersions(RoutingNodes routingNodes) {
|
||||
logger.trace("RoutingNodes: {}", routingNodes.prettyPrint());
|
||||
|
||||
List<MutableShardRouting> mutableShardRoutings = routingNodes.shardsWithState(ShardRoutingState.RELOCATING);
|
||||
for (MutableShardRouting r : mutableShardRoutings) {
|
||||
List<ShardRouting> mutableShardRoutings = routingNodes.shardsWithState(ShardRoutingState.RELOCATING);
|
||||
for (ShardRouting r : mutableShardRoutings) {
|
||||
String toId = r.relocatingNodeId();
|
||||
String fromId = r.currentNodeId();
|
||||
assertThat(fromId, notNullValue());
|
||||
|
@ -327,9 +327,9 @@ public class NodeVersionAllocationDeciderTests extends ElasticsearchAllocationTe
|
|||
}
|
||||
|
||||
mutableShardRoutings = routingNodes.shardsWithState(ShardRoutingState.INITIALIZING);
|
||||
for (MutableShardRouting r : mutableShardRoutings) {
|
||||
for (ShardRouting r : mutableShardRoutings) {
|
||||
if (r.initializing() && r.relocatingNodeId() == null && !r.primary()) {
|
||||
MutableShardRouting primary = routingNodes.activePrimary(r);
|
||||
ShardRouting primary = routingNodes.activePrimary(r);
|
||||
assertThat(primary, notNullValue());
|
||||
String fromId = primary.currentNodeId();
|
||||
String toId = r.currentNodeId();
|
||||
|
|
|
@ -24,7 +24,7 @@ import org.elasticsearch.cluster.ClusterState;
|
|||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
import org.elasticsearch.test.ElasticsearchAllocationTestCase;
|
||||
import org.junit.Test;
|
||||
|
@ -108,7 +108,7 @@ public class PreferLocalPrimariesToRelocatingPrimariesTests extends Elasticsearc
|
|||
while (clusterState.routingNodes().shardsWithState(STARTED).size() < totalNumberOfShards) {
|
||||
int localInitializations = 0;
|
||||
int relocatingInitializations = 0;
|
||||
for (MutableShardRouting routing : clusterState.routingNodes().shardsWithState(INITIALIZING)) {
|
||||
for (ShardRouting routing : clusterState.routingNodes().shardsWithState(INITIALIZING)) {
|
||||
if (routing.relocatingNodeId() == null) {
|
||||
localInitializations++;
|
||||
} else {
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.cluster.routing.allocation.decider.SameShardAllocationDecider;
|
||||
|
@ -84,7 +84,7 @@ public class SameShardRoutingTests extends ElasticsearchAllocationTestCase {
|
|||
|
||||
assertThat(numberOfShardsOfType(clusterState.readOnlyRoutingNodes(), ShardRoutingState.STARTED), equalTo(2));
|
||||
assertThat(numberOfShardsOfType(clusterState.readOnlyRoutingNodes(), ShardRoutingState.INITIALIZING), equalTo(2));
|
||||
for (MutableShardRouting shardRouting : clusterState.readOnlyRoutingNodes().shardsWithState(INITIALIZING)) {
|
||||
for (ShardRouting shardRouting : clusterState.readOnlyRoutingNodes().shardsWithState(INITIALIZING)) {
|
||||
assertThat(shardRouting.currentNodeId(), equalTo("node3"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ import org.elasticsearch.cluster.ClusterState;
|
|||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNodes;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
|
@ -149,10 +149,10 @@ public class ShardsLimitAllocationTests extends ElasticsearchAllocationTestCase
|
|||
|
||||
assertThat(numberOfShardsOfType(clusterState.readOnlyRoutingNodes(), STARTED), equalTo(10));
|
||||
|
||||
for (MutableShardRouting shardRouting : clusterState.readOnlyRoutingNodes().node("node1")) {
|
||||
for (ShardRouting shardRouting : clusterState.readOnlyRoutingNodes().node("node1")) {
|
||||
assertThat(shardRouting.index(), equalTo("test"));
|
||||
}
|
||||
for (MutableShardRouting shardRouting : clusterState.readOnlyRoutingNodes().node("node2")) {
|
||||
for (ShardRouting shardRouting : clusterState.readOnlyRoutingNodes().node("node2")) {
|
||||
assertThat(shardRouting.index(), equalTo("test1"));
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNode;
|
||||
import org.elasticsearch.cluster.routing.RoutingNodes;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
|
@ -270,7 +270,7 @@ public class SingleShardNoReplicasRoutingTests extends ElasticsearchAllocationTe
|
|||
int nodeIndex = Integer.parseInt(routingNode.nodeId().substring("node".length()));
|
||||
assertThat(nodeIndex, lessThan(25));
|
||||
// check that we don't have a shard associated with a node with the same index name (we have a single shard)
|
||||
for (MutableShardRouting shardRoutingEntry : routingNode) {
|
||||
for (ShardRouting shardRoutingEntry : routingNode) {
|
||||
assertThat(encounteredIndices, not(hasItem(shardRoutingEntry.index())));
|
||||
encounteredIndices.add(shardRoutingEntry.index());
|
||||
}
|
||||
|
|
|
@ -829,8 +829,8 @@ public class DiskThresholdDeciderTests extends ElasticsearchAllocationTestCase {
|
|||
.build();
|
||||
|
||||
// Two shards consuming each 80% of disk space while 70% is allowed, so shard 0 isn't allowed here
|
||||
MutableShardRouting firstRouting = new MutableShardRouting("test", 0, "node1", null, null, true, ShardRoutingState.STARTED, 1);
|
||||
MutableShardRouting secondRouting = new MutableShardRouting("test", 1, "node1", null, null, true, ShardRoutingState.STARTED, 1);
|
||||
ShardRouting firstRouting = new ShardRouting("test", 0, "node1", null, null, true, ShardRoutingState.STARTED, 1);
|
||||
ShardRouting secondRouting = new ShardRouting("test", 1, "node1", null, null, true, ShardRoutingState.STARTED, 1);
|
||||
RoutingNode firstRoutingNode = new RoutingNode("node1", discoveryNode1, Arrays.asList(firstRouting, secondRouting));
|
||||
RoutingTable.Builder builder = RoutingTable.builder().add(
|
||||
IndexRoutingTable.builder("test")
|
||||
|
@ -849,8 +849,8 @@ public class DiskThresholdDeciderTests extends ElasticsearchAllocationTestCase {
|
|||
assertThat(decision.type(), equalTo(Decision.Type.NO));
|
||||
|
||||
// Two shards consuming each 80% of disk space while 70% is allowed, but one is relocating, so shard 0 can stay
|
||||
firstRouting = new MutableShardRouting("test", 0, "node1", null, null, true, ShardRoutingState.STARTED, 1);
|
||||
secondRouting = new MutableShardRouting("test", 1, "node1", "node2", null, true, ShardRoutingState.RELOCATING, 1);
|
||||
firstRouting = new ShardRouting("test", 0, "node1", null, null, true, ShardRoutingState.STARTED, 1);
|
||||
secondRouting = new ShardRouting("test", 1, "node1", "node2", null, true, ShardRoutingState.RELOCATING, 1);
|
||||
firstRoutingNode = new RoutingNode("node1", discoveryNode1, Arrays.asList(firstRouting, secondRouting));
|
||||
builder = RoutingTable.builder().add(
|
||||
IndexRoutingTable.builder("test")
|
||||
|
@ -904,9 +904,9 @@ public class DiskThresholdDeciderTests extends ElasticsearchAllocationTestCase {
|
|||
public void logShardStates(ClusterState state) {
|
||||
RoutingNodes rn = state.routingNodes();
|
||||
logger.info("--> counts: total: {}, unassigned: {}, initializing: {}, relocating: {}, started: {}",
|
||||
rn.shards(new Predicate<MutableShardRouting>() {
|
||||
rn.shards(new Predicate<ShardRouting>() {
|
||||
@Override
|
||||
public boolean apply(org.elasticsearch.cluster.routing.MutableShardRouting input) {
|
||||
public boolean apply(ShardRouting input) {
|
||||
return true;
|
||||
}
|
||||
}).size(),
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.elasticsearch.cluster.ClusterState;
|
|||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
import org.elasticsearch.cluster.routing.allocation.AllocationService;
|
||||
import org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider.Allocation;
|
||||
|
@ -236,22 +236,22 @@ public class EnableAllocationTests extends ElasticsearchAllocationTestCase {
|
|||
clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
||||
assertThat("expected 6 shards to be started 2 to relocate useClusterSettings: " + useClusterSetting, clusterState.routingNodes().shardsWithState(STARTED).size(), equalTo(6));
|
||||
assertThat("expected 2 shards to relocate useClusterSettings: " + useClusterSetting, clusterState.routingNodes().shardsWithState(RELOCATING).size(), equalTo(2));
|
||||
List<MutableShardRouting> mutableShardRoutings = clusterState.routingNodes().shardsWithState(RELOCATING);
|
||||
List<ShardRouting> mutableShardRoutings = clusterState.routingNodes().shardsWithState(RELOCATING);
|
||||
switch (allowedOnes) {
|
||||
case PRIMARIES:
|
||||
for (MutableShardRouting routing : mutableShardRoutings) {
|
||||
for (ShardRouting routing : mutableShardRoutings) {
|
||||
assertTrue("only primaries are allowed to relocate", routing.primary());
|
||||
assertThat("only test index can rebalance", routing.getIndex(), equalTo("test"));
|
||||
}
|
||||
break;
|
||||
case REPLICAS:
|
||||
for (MutableShardRouting routing : mutableShardRoutings) {
|
||||
for (ShardRouting routing : mutableShardRoutings) {
|
||||
assertFalse("only replicas are allowed to relocate", routing.primary());
|
||||
assertThat("only test index can rebalance", routing.getIndex(), equalTo("test"));
|
||||
}
|
||||
break;
|
||||
case ALL:
|
||||
for (MutableShardRouting routing : mutableShardRoutings) {
|
||||
for (ShardRouting routing : mutableShardRoutings) {
|
||||
assertThat("only test index can rebalance", routing.getIndex(), equalTo("test"));
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.elasticsearch.action.index.IndexAction;
|
|||
import org.elasticsearch.action.index.IndexResponse;
|
||||
import org.elasticsearch.cluster.ClusterState;
|
||||
import org.elasticsearch.cluster.routing.IndexShardRoutingTable;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingNodes;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
|
@ -135,9 +135,9 @@ public class TransportIndexFailuresTest extends ElasticsearchIntegrationTest {
|
|||
state = getNodeClusterState(randomFrom(nodes.toArray(Strings.EMPTY_ARRAY)));
|
||||
RoutingNodes rn = state.routingNodes();
|
||||
logger.info("--> counts: total: {}, unassigned: {}, initializing: {}, relocating: {}, started: {}",
|
||||
rn.shards(new Predicate<MutableShardRouting>() {
|
||||
rn.shards(new Predicate<ShardRouting>() {
|
||||
@Override
|
||||
public boolean apply(org.elasticsearch.cluster.routing.MutableShardRouting input) {
|
||||
public boolean apply(ShardRouting input) {
|
||||
return true;
|
||||
}
|
||||
}).size(),
|
||||
|
|
|
@ -22,7 +22,6 @@ import org.elasticsearch.ElasticsearchException;
|
|||
import org.elasticsearch.Version;
|
||||
import org.elasticsearch.action.admin.indices.stats.IndexStats;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.common.bytes.BytesArray;
|
||||
|
@ -140,40 +139,40 @@ public class IndexShardTests extends ElasticsearchSingleNodeTest {
|
|||
IndexShard shard = test.shard(0);
|
||||
ShardStateMetaData shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertEquals(getShardStateMetadata(shard), shardStateMetaData);
|
||||
ShardRouting routing = new MutableShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
ShardRouting routing = new ShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
shard.updateRoutingEntry(routing, true);
|
||||
|
||||
shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertEquals(shardStateMetaData, getShardStateMetadata(shard));
|
||||
assertEquals(shardStateMetaData, new ShardStateMetaData(routing.version(), routing.primary(), shard.indexSettings.get(IndexMetaData.SETTING_UUID)));
|
||||
|
||||
routing = new MutableShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
routing = new ShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
shard.updateRoutingEntry(routing, true);
|
||||
shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertEquals(shardStateMetaData, getShardStateMetadata(shard));
|
||||
assertEquals(shardStateMetaData, new ShardStateMetaData(routing.version(), routing.primary(), shard.indexSettings.get(IndexMetaData.SETTING_UUID)));
|
||||
|
||||
routing = new MutableShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
routing = new ShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
shard.updateRoutingEntry(routing, true);
|
||||
shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertEquals(shardStateMetaData, getShardStateMetadata(shard));
|
||||
assertEquals(shardStateMetaData, new ShardStateMetaData(routing.version(), routing.primary(), shard.indexSettings.get(IndexMetaData.SETTING_UUID)));
|
||||
|
||||
// test if we still write it even if the shard is not active
|
||||
MutableShardRouting inactiveRouting = new MutableShardRouting(shard.shardRouting.index(), shard.shardRouting.shardId().id(), shard.shardRouting.currentNodeId(), null, null, true, ShardRoutingState.INITIALIZING, shard.shardRouting.version() + 1);
|
||||
ShardRouting inactiveRouting = new ShardRouting(shard.shardRouting.index(), shard.shardRouting.shardId().id(), shard.shardRouting.currentNodeId(), null, null, true, ShardRoutingState.INITIALIZING, shard.shardRouting.version() + 1);
|
||||
shard.persistMetadata(inactiveRouting, shard.shardRouting);
|
||||
shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertEquals("inactive shard state shouldn't be persisted", shardStateMetaData, getShardStateMetadata(shard));
|
||||
assertEquals("inactive shard state shouldn't be persisted", shardStateMetaData, new ShardStateMetaData(routing.version(), routing.primary(), shard.indexSettings.get(IndexMetaData.SETTING_UUID)));
|
||||
|
||||
|
||||
shard.updateRoutingEntry(new MutableShardRouting(shard.shardRouting, shard.shardRouting.version() + 1), false);
|
||||
shard.updateRoutingEntry(new ShardRouting(shard.shardRouting, shard.shardRouting.version() + 1), false);
|
||||
shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertFalse("shard state persisted despite of persist=false", shardStateMetaData.equals(getShardStateMetadata(shard)));
|
||||
assertEquals("shard state persisted despite of persist=false", shardStateMetaData, new ShardStateMetaData(routing.version(), routing.primary(), shard.indexSettings.get(IndexMetaData.SETTING_UUID)));
|
||||
|
||||
|
||||
routing = new MutableShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
routing = new ShardRouting(shard.shardRouting, shard.shardRouting.version() + 1);
|
||||
shard.updateRoutingEntry(routing, true);
|
||||
shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertEquals(shardStateMetaData, getShardStateMetadata(shard));
|
||||
|
@ -198,7 +197,7 @@ public class IndexShardTests extends ElasticsearchSingleNodeTest {
|
|||
ShardStateMetaData shardStateMetaData = load(logger, env.availableShardPaths(shard.shardId));
|
||||
assertEquals(shardStateMetaData, getShardStateMetadata(shard));
|
||||
|
||||
routing = new MutableShardRouting(shard.shardId.index().getName(), shard.shardId.id(), routing.currentNodeId(), null, null, routing.primary(), ShardRoutingState.INITIALIZING, shard.shardRouting.version() + 1);
|
||||
routing = new ShardRouting(shard.shardId.index().getName(), shard.shardId.id(), routing.currentNodeId(), null, null, routing.primary(), ShardRoutingState.INITIALIZING, shard.shardRouting.version() + 1);
|
||||
shard.updateRoutingEntry(routing, true);
|
||||
shard.deleteShardState();
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ import org.elasticsearch.ElasticsearchException;
|
|||
import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse;
|
||||
import org.elasticsearch.cluster.ClusterState;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.cluster.routing.allocation.command.MoveAllocationCommand;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
|
@ -124,7 +124,7 @@ public class IndicesLifecycleListenerTests extends ElasticsearchIntegrationTest
|
|||
client().admin().cluster().prepareReroute().add(new MoveAllocationCommand(new ShardId("index1", 0), node1, node2)).get();
|
||||
ensureGreen("index1");
|
||||
ClusterState state = client().admin().cluster().prepareState().get().getState();
|
||||
List<MutableShardRouting> shard = state.getRoutingNodes().shardsWithState(ShardRoutingState.STARTED);
|
||||
List<ShardRouting> shard = state.getRoutingNodes().shardsWithState(ShardRoutingState.STARTED);
|
||||
assertThat(shard, hasSize(1));
|
||||
assertThat(state.nodes().resolveNode(shard.get(0).currentNodeId()).getName(), Matchers.equalTo(node1));
|
||||
}
|
||||
|
|
|
@ -21,7 +21,6 @@ package org.elasticsearch.indices.flush;
|
|||
|
||||
import com.carrotsearch.hppc.ObjectIntHashMap;
|
||||
import com.carrotsearch.hppc.ObjectIntMap;
|
||||
import org.elasticsearch.cluster.routing.ImmutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
|
@ -107,7 +106,7 @@ public class SyncedFlushUnitTests extends ElasticsearchTestCase {
|
|||
} else {
|
||||
Map<ShardRouting, SyncedFlushResponse> shardResponses = new HashMap<>();
|
||||
for (int copy = 0; copy < replicas + 1; copy++) {
|
||||
final ShardRouting shardRouting = new ImmutableShardRouting(index, shard, "node_" + shardId + "_" + copy, null,
|
||||
final ShardRouting shardRouting = new ShardRouting(index, shard, "node_" + shardId + "_" + copy, null,
|
||||
copy == 0, ShardRoutingState.STARTED, 0);
|
||||
if (randomInt(5) < 2) {
|
||||
// shard copy failure
|
||||
|
|
|
@ -226,8 +226,8 @@ public class IndicesStoreIntegrationTests extends ElasticsearchIntegrationTest {
|
|||
RoutingNode routingNode = stateResponse.getState().routingNodes().node(node_2_id);
|
||||
final int[] node2Shards = new int[routingNode.numberOfOwningShards()];
|
||||
int i = 0;
|
||||
for (MutableShardRouting mutableShardRouting : routingNode) {
|
||||
node2Shards[i] = mutableShardRouting.shardId().id();
|
||||
for (ShardRouting shardRouting : routingNode) {
|
||||
node2Shards[i] = shardRouting.shardId().id();
|
||||
i++;
|
||||
}
|
||||
logger.info("Node 2 has shards: {}", Arrays.toString(node2Shards));
|
||||
|
@ -249,7 +249,7 @@ public class IndicesStoreIntegrationTests extends ElasticsearchIntegrationTest {
|
|||
for (int i = 0; i < numShards; i++) {
|
||||
indexRoutingTableBuilder.addIndexShard(
|
||||
new IndexShardRoutingTable.Builder(new ShardId("test", i), false)
|
||||
.addShard(new ImmutableShardRouting("test", i, node_1_id, true, ShardRoutingState.STARTED, shardVersions[shardIds[i]]))
|
||||
.addShard(new ShardRouting("test", i, node_1_id, true, ShardRoutingState.STARTED, shardVersions[shardIds[i]]))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.ImmutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.IndexShardRoutingTable;
|
||||
import org.elasticsearch.cluster.routing.ShardRoutingState;
|
||||
import org.elasticsearch.cluster.routing.UnassignedInfo;
|
||||
|
@ -100,7 +100,7 @@ public class IndicesStoreTests extends ElasticsearchTestCase {
|
|||
if (state == ShardRoutingState.UNASSIGNED) {
|
||||
unassignedInfo = new UnassignedInfo(UnassignedInfo.Reason.INDEX_CREATED, null);
|
||||
}
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, "xyz", null, null, j == 0, state, 0, unassignedInfo));
|
||||
routingTable.addShard(new ShardRouting("test", i, "xyz", null, null, j == 0, state, 0, unassignedInfo));
|
||||
}
|
||||
}
|
||||
assertFalse(indicesStore.shardCanBeDeleted(clusterState.build(), routingTable.build()));
|
||||
|
@ -119,9 +119,9 @@ public class IndicesStoreTests extends ElasticsearchTestCase {
|
|||
for (int i = 0; i < numShards; i++) {
|
||||
String nodeId = i == localShardId ? localNode.getId() : randomBoolean() ? "abc" : "xyz";
|
||||
String relocationNodeId = randomBoolean() ? null : randomBoolean() ? localNode.getId() : "xyz";
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, nodeId, relocationNodeId, true, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, nodeId, relocationNodeId, true, ShardRoutingState.STARTED, 0));
|
||||
for (int j = 0; j < numReplicas; j++) {
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, nodeId, relocationNodeId, false, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, nodeId, relocationNodeId, false, ShardRoutingState.STARTED, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,9 +140,9 @@ public class IndicesStoreTests extends ElasticsearchTestCase {
|
|||
IndexShardRoutingTable.Builder routingTable = new IndexShardRoutingTable.Builder(new ShardId("test", 1), false);
|
||||
for (int i = 0; i < numShards; i++) {
|
||||
String relocatingNodeId = randomBoolean() ? null : "def";
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, "xyz", relocatingNodeId, true, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, "xyz", relocatingNodeId, true, ShardRoutingState.STARTED, 0));
|
||||
for (int j = 0; j < numReplicas; j++) {
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, "xyz", relocatingNodeId, false, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, "xyz", relocatingNodeId, false, ShardRoutingState.STARTED, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -162,9 +162,9 @@ public class IndicesStoreTests extends ElasticsearchTestCase {
|
|||
clusterState.nodes(DiscoveryNodes.builder().localNodeId(localNode.id()).put(localNode).put(new DiscoveryNode("xyz", new LocalTransportAddress("xyz"), nodeVersion)));
|
||||
IndexShardRoutingTable.Builder routingTable = new IndexShardRoutingTable.Builder(new ShardId("test", 1), false);
|
||||
for (int i = 0; i < numShards; i++) {
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, "xyz", null, true, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, "xyz", null, true, ShardRoutingState.STARTED, 0));
|
||||
for (int j = 0; j < numReplicas; j++) {
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, "xyz", null, false, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, "xyz", null, false, ShardRoutingState.STARTED, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -188,9 +188,9 @@ public class IndicesStoreTests extends ElasticsearchTestCase {
|
|||
));
|
||||
IndexShardRoutingTable.Builder routingTable = new IndexShardRoutingTable.Builder(new ShardId("test", 1), false);
|
||||
for (int i = 0; i < numShards; i++) {
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, "xyz", "def", true, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, "xyz", "def", true, ShardRoutingState.STARTED, 0));
|
||||
for (int j = 0; j < numReplicas; j++) {
|
||||
routingTable.addShard(new ImmutableShardRouting("test", i, "xyz", "def", false, ShardRoutingState.STARTED, 0));
|
||||
routingTable.addShard(new ShardRouting("test", i, "xyz", "def", false, ShardRoutingState.STARTED, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.elasticsearch.Version;
|
|||
import org.elasticsearch.cluster.ClusterInfoService;
|
||||
import org.elasticsearch.cluster.ClusterState;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.routing.MutableShardRouting;
|
||||
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||
import org.elasticsearch.cluster.routing.RoutingTable;
|
||||
import org.elasticsearch.cluster.routing.allocation.AllocationService;
|
||||
import org.elasticsearch.cluster.routing.allocation.allocator.ShardsAllocators;
|
||||
|
@ -114,7 +114,7 @@ public abstract class ElasticsearchAllocationTestCase extends ElasticsearchTestC
|
|||
}
|
||||
|
||||
public static ClusterState startRandomInitializingShard(ClusterState clusterState, AllocationService strategy) {
|
||||
List<MutableShardRouting> initializingShards = clusterState.routingNodes().shardsWithState(INITIALIZING);
|
||||
List<ShardRouting> initializingShards = clusterState.routingNodes().shardsWithState(INITIALIZING);
|
||||
if (initializingShards.isEmpty()) {
|
||||
return clusterState;
|
||||
}
|
||||
|
|
|
@ -31,7 +31,6 @@ import org.apache.commons.lang3.StringUtils;
|
|||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.elasticsearch.cluster.routing.UnassignedInfo;
|
||||
import org.elasticsearch.index.shard.MergeSchedulerConfig;
|
||||
import org.apache.lucene.store.StoreRateLimiting;
|
||||
import org.apache.lucene.util.IOUtils;
|
||||
import org.apache.lucene.util.LuceneTestCase;
|
||||
import org.apache.lucene.util.TestUtil;
|
||||
|
@ -110,19 +109,15 @@ import org.elasticsearch.index.translog.TranslogService;
|
|||
import org.elasticsearch.index.translog.TranslogWriter;
|
||||
import org.elasticsearch.indices.IndicesService;
|
||||
import org.elasticsearch.indices.cache.query.IndicesQueryCache;
|
||||
import org.elasticsearch.indices.fielddata.cache.IndicesFieldDataCache;
|
||||
import org.elasticsearch.indices.flush.IndicesSyncedFlushResult;
|
||||
import org.elasticsearch.indices.flush.SyncedFlushService;
|
||||
import org.elasticsearch.indices.recovery.RecoverySettings;
|
||||
import org.elasticsearch.indices.store.IndicesStore;
|
||||
import org.elasticsearch.node.Node;
|
||||
import org.elasticsearch.rest.RestStatus;
|
||||
import org.elasticsearch.script.ScriptService;
|
||||
import org.elasticsearch.search.SearchService;
|
||||
import org.elasticsearch.test.client.RandomizingClient;
|
||||
import org.elasticsearch.test.disruption.ServiceDisruptionScheme;
|
||||
import org.elasticsearch.test.rest.client.http.HttpRequestBuilder;
|
||||
import org.elasticsearch.transport.netty.NettyTransport;
|
||||
import org.hamcrest.Matchers;
|
||||
import org.joda.time.DateTimeZone;
|
||||
import org.junit.*;
|
||||
|
|
|
@ -82,8 +82,6 @@ import org.elasticsearch.index.shard.IndexShard;
|
|||
import org.elasticsearch.index.shard.IndexShardModule;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
import org.elasticsearch.index.store.IndexStoreModule;
|
||||
import org.elasticsearch.index.translog.TranslogConfig;
|
||||
import org.elasticsearch.index.translog.TranslogWriter;
|
||||
import org.elasticsearch.indices.IndicesService;
|
||||
import org.elasticsearch.indices.breaker.CircuitBreakerService;
|
||||
import org.elasticsearch.indices.breaker.HierarchyCircuitBreakerService;
|
||||
|
|
Loading…
Reference in New Issue