package com.jivesoftware.os.amza.service.ring;
import com.jivesoftware.os.amza.api.ring.RingMemberAndHost;
import com.jivesoftware.os.aquarium.Member;
import java.util.List;
import java.util.Set;
/**
*
*/
public class RingTopology {
private final boolean system;
public final long ringCacheId;
public final long nodeCacheId;
public final List<RingMemberAndHost> entries;
public final Set<Member> aquariumMembers;
public final int rootMemberIndex;
public RingTopology(boolean system, long ringCacheId, long nodeCacheId, List<RingMemberAndHost> entries, Set<Member> aquariumMembers, int rootMemberIndex) {
this.system = system;
this.ringCacheId = ringCacheId;
this.nodeCacheId = nodeCacheId;
this.entries = entries;
this.aquariumMembers = aquariumMembers;
this.rootMemberIndex = rootMemberIndex;
}
public int getTakeFromFactor() {
//TODO We require takeFromFactor to satisfy a quorum, forcing quorum here is a
//TODO temporary workaround until VersionedRing is pushed down to the partition level.
/*int ringSize = entries.size();
return UIO.chunkPower(ringSize < 1 ? 1 : ringSize, 2) - 1;*/
if (system) {
return chunkPower(entries.size(), 1);
} else {
return Math.max(entries.size() / 2, 1);
}
}
public static int chunkPower(long length, int _minPower) {
if (length == 0) {
return 0;
}
int numberOfTrailingZeros = Long.numberOfLeadingZeros(length - 1);
return Math.max(_minPower, 64 - numberOfTrailingZeros);
}
@Override
public String toString() {
return "RingTopology{" +
"ringCacheId=" + ringCacheId +
", nodeCacheId=" + nodeCacheId +
", entries=" + entries +
", rootMemberIndex=" + rootMemberIndex +
'}';
}
}