Add assertion that checks that the same shard with same id is not added to same node
This commit is contained in:
parent
2d3a52c0f2
commit
7099f10909
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue