blob: 925308c8025f3899c2e7252f813b8e2de823b560 [file] [log] [blame]
package accord.topology;
import java.util.List;
import java.util.Set;
import accord.local.Node.Id;
import accord.api.Key;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
public class Shard
{
public final Key start, end;
public final List<Id> nodes;
public final Set<Id> fastPathElectorate;
public final int recoveryFastPathSize;
public final int fastPathQuorumSize;
public final int slowPathQuorumSize;
public Shard(Key start, Key end, List<Id> nodes, Set<Id> fastPathElectorate)
{
this.start = start;
this.end = end;
this.nodes = nodes;
int f = maxToleratedFailures(nodes.size());
this.fastPathElectorate = fastPathElectorate;
int e = fastPathElectorate.size();
this.recoveryFastPathSize = (f+1)/2;
this.slowPathQuorumSize = f + 1;
this.fastPathQuorumSize = fastPathQuorumSize(nodes.size(), e, f);
}
@VisibleForTesting
static int maxToleratedFailures(int replicas)
{
return (replicas - 1) / 2;
}
@VisibleForTesting
static int fastPathQuorumSize(int replicas, int electorate, int f)
{
Preconditions.checkArgument(electorate >= replicas - f);
// return (fastPathElectorateSize + f + 1 + 1) / 2;
return (f + electorate)/2 + 1;
}
public boolean contains(Key key)
{
return key.compareTo(start) >= 0 && key.compareTo(end) < 0;
}
@Override
public String toString()
{
return "Shard[" + start + ',' + end + ']';
}
}