package com.jivesoftware.os.amza.service.take; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.jivesoftware.os.amza.api.ring.RingHost; import com.jivesoftware.os.amza.api.ring.RingMember; import com.jivesoftware.os.amza.api.ring.RingMemberAndHost; import com.jivesoftware.os.amza.service.ring.RingTopology; import com.jivesoftware.os.amza.service.take.TakeRingCoordinator.VersionedRing; import com.jivesoftware.os.aquarium.Member; import java.util.List; import java.util.Set; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; /** * */ public class VersionedRingTest { @Test public void testCategories() { List<RingMemberAndHost> ring = Lists.newArrayList(); Set<Member> aquariumMembers = Sets.newHashSet(); addMembers(ring, aquariumMembers, memberAndHost("a"), memberAndHost("b"), memberAndHost("c"), memberAndHost("d"), memberAndHost("e")); VersionedRing versionedRing = VersionedRing.compute( new RingTopology(false, -1, -1, ring, aquariumMembers, 0)); assertNull(versionedRing.getCategory(member("a"))); assertEquals(1, versionedRing.getCategory(member("b")).intValue()); assertEquals(1, versionedRing.getCategory(member("c")).intValue()); assertEquals(2, versionedRing.getCategory(member("d")).intValue()); assertEquals(2, versionedRing.getCategory(member("e")).intValue()); versionedRing = VersionedRing.compute( new RingTopology(false, -1, -1, ring, aquariumMembers, 1)); assertEquals(2, versionedRing.getCategory(member("a")).intValue()); assertNull(versionedRing.getCategory(member("b"))); assertEquals(1, versionedRing.getCategory(member("c")).intValue()); assertEquals(1, versionedRing.getCategory(member("d")).intValue()); assertEquals(2, versionedRing.getCategory(member("e")).intValue()); versionedRing = VersionedRing.compute( new RingTopology(false, -1, -1, ring, aquariumMembers, 2)); assertEquals(2, versionedRing.getCategory(member("a")).intValue()); assertEquals(2, versionedRing.getCategory(member("b")).intValue()); assertNull(versionedRing.getCategory(member("c"))); assertEquals(1, versionedRing.getCategory(member("d")).intValue()); assertEquals(1, versionedRing.getCategory(member("e")).intValue()); versionedRing = VersionedRing.compute( new RingTopology(false, -1, -1, ring, aquariumMembers, 3)); assertEquals(1, versionedRing.getCategory(member("a")).intValue()); assertEquals(2, versionedRing.getCategory(member("b")).intValue()); assertEquals(2, versionedRing.getCategory(member("c")).intValue()); assertNull(versionedRing.getCategory(member("d"))); assertEquals(1, versionedRing.getCategory(member("e")).intValue()); } @Test public void testTakeFromFactor() { // using simple quorum method List<RingMemberAndHost> ring = Lists.newArrayList(); Set<Member> aquariumMembers = Sets.newHashSet(); addMembers(ring, aquariumMembers, memberAndHost("1")); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, -1).getTakeFromFactor(), 1); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, 0).getTakeFromFactor(), 1); addMembers(ring, aquariumMembers, memberAndHost("2"), memberAndHost("3"), memberAndHost("4")); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, -1).getTakeFromFactor(), 2); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, 0).getTakeFromFactor(), 2); addMembers(ring, aquariumMembers, memberAndHost("5")); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, -1).getTakeFromFactor(), 2); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, 0).getTakeFromFactor(), 2); addMembers(ring, aquariumMembers, memberAndHost("6"), memberAndHost("7"), memberAndHost("8")); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, -1).getTakeFromFactor(), 4); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, 0).getTakeFromFactor(), 4); addMembers(ring, aquariumMembers, memberAndHost("9")); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, -1).getTakeFromFactor(), 4); assertEquals(new RingTopology(false, -1, -1, ring, aquariumMembers, 0).getTakeFromFactor(), 4); // using simple logarithmic method /*List<RingMemberAndHost> ring = Lists.newArrayList(); ring.add(memberAndHost("1")); assertEquals(new RingTopology(-1, -1, ring, -1).getTakeFromFactor(), 1); assertEquals(new RingTopology(-1, -1, ring, 0).getTakeFromFactor(), 1); ring.addAll(Arrays.asList(memberAndHost("2"), memberAndHost("3"), memberAndHost("4"))); assertEquals(new RingTopology(-1, -1, ring, -1).getTakeFromFactor(), 1); assertEquals(new RingTopology(-1, -1, ring, 0).getTakeFromFactor(), 1); ring.addAll(Arrays.asList(memberAndHost("5"))); assertEquals(new RingTopology(-1, -1, ring, -1).getTakeFromFactor(), 2); assertEquals(new RingTopology(-1, -1, ring, 0).getTakeFromFactor(), 2); ring.addAll(Arrays.asList(memberAndHost("6"), memberAndHost("7"), memberAndHost("8"))); assertEquals(new RingTopology(-1, -1, ring, -1).getTakeFromFactor(), 2); assertEquals(new RingTopology(-1, -1, ring, 0).getTakeFromFactor(), 2); ring.addAll(Arrays.asList(memberAndHost("9"))); assertEquals(new RingTopology(-1, -1, ring, -1).getTakeFromFactor(), 3); assertEquals(new RingTopology(-1, -1, ring, 0).getTakeFromFactor(), 3);*/ } private void addMembers(List<RingMemberAndHost> ring, Set<Member> aquariumMembers, RingMemberAndHost... memberAndHosts) { for (RingMemberAndHost memberAndHost : memberAndHosts) { ring.add(memberAndHost); aquariumMembers.add(memberAndHost.ringMember.asAquariumMember()); } } private RingMemberAndHost memberAndHost(String name) { return new RingMemberAndHost(member(name), new RingHost("datacenter", "rack", name, 1)); } private RingMember member(String name) { return new RingMember(name); } }