package config;
import com.google.common.collect.Sets;
import com.sun.istack.internal.Nullable;
import java.util.Set;
/**
* Created by andrew on 11/27/14.
* Simple group membership provider that doesn't take into account dynamic network conditions or change.
*/
public class StaticGroupConfigProvider<T extends org.apache.thrift.TServiceClient> implements GroupConfigProvider<T> {
private final GroupMember<T> me;
private Set<GroupMember<T>> members;
private int viewID;
private GroupMember<T> leader;
public StaticGroupConfigProvider(GroupMember<T> leader, GroupMember<T> me, Set<GroupMember<T>> members, int viewID) {
this.me = me;
this.members = members;
assert (leader != null);
assert (this.members != null);
this.leader = leader;
this.viewID = viewID;
}
@Override
public synchronized void setViewID(int viewID) {
this.viewID = viewID;
}
@Override
public synchronized int getViewID() {
return this.viewID;
}
@Override
public int getQuorumSize() {
return members.size() - (members.size()-1)/3;
}
@Override
public Set<GroupMember<T>> getOtherGroupMembers() {
Set<GroupMember<T>> otherMembers = Sets.newHashSet(members);
otherMembers.remove(me);
return otherMembers;
}
@Override
public Set<GroupMember<T>> getGroupMembers() {
return members;
}
@Override
@Nullable
public GroupMember getGroupMember(int replicaID) {
for (GroupMember member : members) {
if (member.getReplicaID() == replicaID) {
return member;
}
}
return null;
}
@Override
public GroupMember getLeader() { return leader; }
@Override
public void setLeader(GroupMember leader) {
assert (members.contains(leader));
this.leader = leader;
}
@Override
public GroupMember getMe(){ return me; }
@Override
public String toString() {
return "StaticGroupConfigProvider{" +
"members=" + members +
", viewID=" + viewID +
", leader=" + leader +
'}';
}
}