Add assertion that checks that the same shard with same id is not added to same node

This commit is contained in:
Yannick Welsch 2016-11-11 10:24:29 +01:00
parent 2d3a52c0f2
commit 7099f10909
1 changed files with 20 additions and 8 deletions

View File

@ -33,6 +33,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -572,14 +573,6 @@ public class IndexShardRoutingTable implements Iterable<ShardRouting> {
} }
public Builder addShard(ShardRouting 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
if (shard.assignedToNode() && shardEntry.assignedToNode()
&& shard.currentNodeId().equals(shardEntry.currentNodeId())) {
return this;
}
}
shards.add(shardEntry); shards.add(shardEntry);
return this; return this;
} }
@ -590,9 +583,28 @@ public class IndexShardRoutingTable implements Iterable<ShardRouting> {
} }
public IndexShardRoutingTable build() { public IndexShardRoutingTable build() {
// don't allow more than one shard copy with same id to be allocated to same node
assert distinctNodes() : "more than one shard with same id assigned to same node (shards: " + shards + ")";
return new IndexShardRoutingTable(shardId, Collections.unmodifiableList(new ArrayList<>(shards))); return new IndexShardRoutingTable(shardId, Collections.unmodifiableList(new ArrayList<>(shards)));
} }
private boolean distinctNodes() {
Set<String> nodes = new HashSet<>();
for (ShardRouting shard : shards) {
if (shard.assignedToNode()) {
if (nodes.add(shard.currentNodeId()) == false) {
return false;
}
if (shard.relocating()) {
if (nodes.add(shard.relocatingNodeId()) == false) {
return false;
}
}
}
}
return true;
}
public static IndexShardRoutingTable readFrom(StreamInput in) throws IOException { public static IndexShardRoutingTable readFrom(StreamInput in) throws IOException {
Index index = new Index(in); Index index = new Index(in);
return readFromThin(in, index); return readFromThin(in, index);