/* * Copyright 2013 LinkedIn, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package voldemort.routing; import static org.junit.Assert.assertEquals; import java.util.HashMap; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import voldemort.ClusterTestUtils; import voldemort.ServerTestUtils; import voldemort.TestUtils; import voldemort.client.RoutingTier; import voldemort.cluster.Cluster; import voldemort.cluster.Zone; import voldemort.serialization.SerializerDefinition; import voldemort.store.StoreDefinition; import voldemort.store.StoreDefinitionBuilder; import voldemort.store.bdb.BdbStorageConfiguration; import voldemort.store.slop.strategy.HintedHandoffStrategyType; import com.google.common.collect.Lists; // TODO: Break this test into part that tests BaseStoreRoutingPlan and // StoreRoutingPlan. public class StoreRoutingPlanTest { // plan for 2 zones BaseStoreRoutingPlan zzBaseRoutingPlan; BaseStoreRoutingPlan nonZonedBaseRoutingPlan; BaseStoreRoutingPlan z1z3BaseRoutingPlan; // plan for 3 zones BaseStoreRoutingPlan zzzBaseRoutingPlan; BaseStoreRoutingPlan z1z3z5BaseRoutingPlan; // plan for 2 zones StoreRoutingPlan zzStoreRoutingPlan; StoreRoutingPlan nonZonedStoreRoutingPlan; StoreRoutingPlan z1z3StoreRoutingPlan; // plan for 3 zones StoreRoutingPlan zzzStoreRoutingPlan; StoreRoutingPlan z1z3z5StoreRoutingPlan; public StoreRoutingPlanTest() {} @Before public void setup() { Cluster nonZonedCluster = ServerTestUtils.getLocalCluster(3, new int[] { 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000 }, new int[][] { { 0 }, { 1, 3 }, { 2 } }); StoreDefinition nonZoned211StoreDef = new StoreDefinitionBuilder().setName("non-zoned") .setType(BdbStorageConfiguration.TYPE_NAME) .setKeySerializer(new SerializerDefinition("string")) .setValueSerializer(new SerializerDefinition("string")) .setRoutingPolicy(RoutingTier.CLIENT) .setRoutingStrategyType(RoutingStrategyType.CONSISTENT_STRATEGY) .setReplicationFactor(2) .setPreferredReads(1) .setRequiredReads(1) .setPreferredWrites(1) .setRequiredWrites(1) .build(); nonZonedBaseRoutingPlan = new BaseStoreRoutingPlan(nonZonedCluster, nonZoned211StoreDef); nonZonedStoreRoutingPlan = new StoreRoutingPlan(nonZonedCluster, nonZoned211StoreDef); int[] dummyZonedPorts = new int[] { 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000 }; Cluster zzCluster = ServerTestUtils.getLocalZonedCluster(6, 2, new int[] { 0, 0, 0, 1, 1, 1 }, new int[][] { { 0 }, { 1, 6 }, { 2 }, { 3 }, { 4, 7 }, { 5 } }, dummyZonedPorts); HashMap<Integer, Integer> zrfRWStoreWithReplication = new HashMap<Integer, Integer>(); zrfRWStoreWithReplication.put(0, 2); zrfRWStoreWithReplication.put(1, 2); StoreDefinition zz211StoreDef = new StoreDefinitionBuilder().setName("zoned") .setType(BdbStorageConfiguration.TYPE_NAME) .setKeySerializer(new SerializerDefinition("string")) .setValueSerializer(new SerializerDefinition("string")) .setRoutingPolicy(RoutingTier.CLIENT) .setRoutingStrategyType(RoutingStrategyType.ZONE_STRATEGY) .setReplicationFactor(4) .setPreferredReads(1) .setRequiredReads(1) .setPreferredWrites(1) .setRequiredWrites(1) .setZoneCountReads(0) .setZoneCountWrites(0) .setZoneReplicationFactor(zrfRWStoreWithReplication) .setHintedHandoffStrategy(HintedHandoffStrategyType.PROXIMITY_STRATEGY) .build(); zzBaseRoutingPlan = new BaseStoreRoutingPlan(zzCluster, zz211StoreDef); zzStoreRoutingPlan = new StoreRoutingPlan(zzCluster, zz211StoreDef); Cluster zzzCluster = ServerTestUtils.getLocalZonedCluster(9, 3, new int[] { 0, 0, 0, 1, 1, 1, 2, 2, 2 }, new int[][] { { 0 }, { 10 }, { 1, 2 }, { 3 }, { 4 }, { 6 }, { 5, 7 }, { 9 }, { 8 } }, new int[] { 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000, 1000, 2000, 3000 }); HashMap<Integer, Integer> zoneRep211 = new HashMap<Integer, Integer>(); zoneRep211.put(0, 2); zoneRep211.put(1, 2); zoneRep211.put(2, 2); StoreDefinition zzz211StoreDef = new StoreDefinitionBuilder().setName("zzz") .setType(BdbStorageConfiguration.TYPE_NAME) .setKeySerializer(new SerializerDefinition("string")) .setValueSerializer(new SerializerDefinition("string")) .setRoutingPolicy(RoutingTier.CLIENT) .setRoutingStrategyType(RoutingStrategyType.ZONE_STRATEGY) .setReplicationFactor(6) .setPreferredReads(1) .setRequiredReads(1) .setPreferredWrites(1) .setRequiredWrites(1) .setZoneCountReads(0) .setZoneCountWrites(0) .setZoneReplicationFactor(zoneRep211) .setHintedHandoffStrategy(HintedHandoffStrategyType.PROXIMITY_STRATEGY) .build(); zzzBaseRoutingPlan = new BaseStoreRoutingPlan(zzzCluster, zzz211StoreDef); zzzStoreRoutingPlan = new StoreRoutingPlan(zzzCluster, zzz211StoreDef); } @Before public void setupNonContiguous() { Cluster z1z3Current = ClusterTestUtils.getZ1Z3ClusterWithNonContiguousNodeIds(); HashMap<Integer, Integer> zoneRep211 = new HashMap<Integer, Integer>(); zoneRep211.put(1, 2); zoneRep211.put(3, 2); StoreDefinition z1z3211StoreDef = new StoreDefinitionBuilder().setName("z1z3211") .setType(BdbStorageConfiguration.TYPE_NAME) .setKeySerializer(new SerializerDefinition("string")) .setValueSerializer(new SerializerDefinition("string")) .setRoutingPolicy(RoutingTier.CLIENT) .setRoutingStrategyType(RoutingStrategyType.ZONE_STRATEGY) .setReplicationFactor(4) .setPreferredReads(1) .setRequiredReads(1) .setPreferredWrites(1) .setRequiredWrites(1) .setZoneCountReads(0) .setZoneCountWrites(0) .setZoneReplicationFactor(zoneRep211) .setHintedHandoffStrategy(HintedHandoffStrategyType.PROXIMITY_STRATEGY) .build(); z1z3BaseRoutingPlan = new BaseStoreRoutingPlan(z1z3Current, z1z3211StoreDef); z1z3StoreRoutingPlan = new StoreRoutingPlan(z1z3Current, z1z3211StoreDef); // 3 zones Cluster z1z3z5Current = ClusterTestUtils.getZ1Z3Z5ClusterWithNonContiguousNodeIds(); HashMap<Integer, Integer> zoneRep3zones211 = new HashMap<Integer, Integer>(); zoneRep3zones211.put(1, 2); zoneRep3zones211.put(3, 2); zoneRep3zones211.put(5, 2); StoreDefinition z1z3z5211StoreDef = new StoreDefinitionBuilder().setName("z1z3z5211") .setType(BdbStorageConfiguration.TYPE_NAME) .setKeySerializer(new SerializerDefinition("string")) .setValueSerializer(new SerializerDefinition("string")) .setRoutingPolicy(RoutingTier.CLIENT) .setRoutingStrategyType(RoutingStrategyType.ZONE_STRATEGY) .setReplicationFactor(6) .setPreferredReads(1) .setRequiredReads(1) .setPreferredWrites(1) .setRequiredWrites(1) .setZoneCountReads(0) .setZoneCountWrites(0) .setZoneReplicationFactor(zoneRep3zones211) .setHintedHandoffStrategy(HintedHandoffStrategyType.PROXIMITY_STRATEGY) .build(); z1z3z5BaseRoutingPlan = new BaseStoreRoutingPlan(z1z3z5Current, z1z3z5211StoreDef); z1z3z5StoreRoutingPlan = new StoreRoutingPlan(z1z3z5Current, z1z3z5211StoreDef); } @Test public void testZZStoreRoutingPlan() { HashMap<Integer, List<byte[]>> samplePartitionKeysMap = TestUtils.createPartitionsKeys(zzStoreRoutingPlan, 1); assertEquals("Node 1 does not contain p5?", (Integer) 6, zzStoreRoutingPlan.getNodesPartitionIdForKey(1, samplePartitionKeysMap.get(5) .get(0))); assertEquals("Node 4 does not contain p5?", (Integer) 7, zzStoreRoutingPlan.getNodesPartitionIdForKey(4, samplePartitionKeysMap.get(5) .get(0))); assertEquals("Replication list does not match up", Lists.newArrayList(0, 1, 3, 4), zzStoreRoutingPlan.getReplicationNodeList(0)); assertEquals("Zone replica type should be 1", 1, zzBaseRoutingPlan.getZoneNAry(0, 0, samplePartitionKeysMap.get(6).get(0))); assertEquals("Zone replica type should be 0", 0, zzBaseRoutingPlan.getZoneNAry(0, 1, samplePartitionKeysMap.get(6).get(0))); assertEquals("Zone replica type should be 1", 1, zzBaseRoutingPlan.getZoneNAry(1, 3, samplePartitionKeysMap.get(7).get(0))); assertEquals("Zone replica type should be 0", 0, zzBaseRoutingPlan.getZoneNAry(1, 4, samplePartitionKeysMap.get(7).get(0))); assertEquals("Replica owner should be 1", 1, zzBaseRoutingPlan.getNodeIdForZoneNary(0, 1, samplePartitionKeysMap.get(2) .get(0))); assertEquals("Replica owner should be 1", 1, zzBaseRoutingPlan.getNodeIdForZoneNary(0, 0, samplePartitionKeysMap.get(3) .get(0))); assertEquals("Replica owner should be 4", 4, zzBaseRoutingPlan.getNodeIdForZoneNary(1, 1, samplePartitionKeysMap.get(1) .get(0))); assertEquals("Replica owner should be 3", 3, zzBaseRoutingPlan.getNodeIdForZoneNary(1, 0, samplePartitionKeysMap.get(2) .get(0))); assertEquals("Does Zone 1 have a replica", true, zzzStoreRoutingPlan.zoneNAryExists(1, 0, 1)); } @Test public void testZ1Z3StoreRoutingPlan() { HashMap<Integer, List<byte[]>> samplePartitionKeysMap = TestUtils.createPartitionsKeys(z1z3StoreRoutingPlan, 1); assertEquals("Node 3 does not contain p6?", (Integer) 6, z1z3StoreRoutingPlan.getNodesPartitionIdForKey(3, samplePartitionKeysMap.get(6) .get(0))); assertEquals("Node 4 does not contain p10?", (Integer) 10, z1z3StoreRoutingPlan.getNodesPartitionIdForKey(4, samplePartitionKeysMap.get(10) .get(0))); assertEquals("Replication list does not match up", Lists.newArrayList(3, 4, 9, 10), z1z3StoreRoutingPlan.getReplicationNodeList(0)); assertEquals("Zone replica type should be 0", 0, z1z3BaseRoutingPlan.getZoneNAry(1, 3, samplePartitionKeysMap.get(6).get(0))); assertEquals("Zone replica type should be 1", 1, z1z3BaseRoutingPlan.getZoneNAry(1, 5, samplePartitionKeysMap.get(6).get(0))); assertEquals("Zone replica type should be 1", 1, z1z3BaseRoutingPlan.getZoneNAry(1, 3, samplePartitionKeysMap.get(7).get(0))); assertEquals("Zone replica type should be 0", 0, z1z3BaseRoutingPlan.getZoneNAry(1, 5, samplePartitionKeysMap.get(7).get(0))); assertEquals("Replica owner should be 3", 3, z1z3BaseRoutingPlan.getNodeIdForZoneNary(1, 1, samplePartitionKeysMap.get(2) .get(0))); assertEquals("Replica owner should be 9", 5, z1z3BaseRoutingPlan.getNodeIdForZoneNary(1, 1, samplePartitionKeysMap.get(3) .get(0))); assertEquals("Replica owner should be 5", 5, z1z3BaseRoutingPlan.getNodeIdForZoneNary(1, 1, samplePartitionKeysMap.get(1) .get(0))); assertEquals("Replica owner should be 4", 4, zzBaseRoutingPlan.getNodeIdForZoneNary(1, 0, samplePartitionKeysMap.get(2) .get(0))); } @Test public void testZZZStoreRoutingPlan() { HashMap<Integer, List<byte[]>> samplePartitionKeysMap = TestUtils.createPartitionsKeys(zzzStoreRoutingPlan, 1); assertEquals("Node 1 does not contain p8?", (Integer) 10, zzzStoreRoutingPlan.getNodesPartitionIdForKey(1, samplePartitionKeysMap.get(8).get(0))); assertEquals("Node 3 does not contain p1?", (Integer) 3, zzzStoreRoutingPlan.getNodesPartitionIdForKey(3, samplePartitionKeysMap.get(1).get(0))); assertEquals("Replication list does not match up", Lists.newArrayList(0, 2, 3, 4, 6, 8), zzzStoreRoutingPlan.getReplicationNodeList(0)); assertEquals("Replication list does not match up", Lists.newArrayList(3, 4, 6, 8, 1, 0), zzzStoreRoutingPlan.getReplicationNodeList(3)); assertEquals("Zone replica type should be 0", 0, zzzBaseRoutingPlan.getZoneNAry(0, 1, samplePartitionKeysMap.get(6).get(0))); assertEquals("Zone replica type should be 0 in zone 2", 0, zzzBaseRoutingPlan.getZoneNAry(2, 6, samplePartitionKeysMap.get(6).get(0))); assertEquals("Replica owner should be 3", 3, zzzBaseRoutingPlan.getNodeIdForZoneNary(1, 0, samplePartitionKeysMap.get(1) .get(0))); assertEquals("Replica secondary should be 8", 8, zzzBaseRoutingPlan.getNodeIdForZoneNary(2, 1, samplePartitionKeysMap.get(0) .get(0))); assertEquals("Does Zone 2 have a replica", true, zzzStoreRoutingPlan.zoneNAryExists(2, 1, 0)); } @Test public void testZ1Z3Z5StoreRoutingPlan() { HashMap<Integer, List<byte[]>> samplePartitionKeysMap = TestUtils.createPartitionsKeys(z1z3z5StoreRoutingPlan, 1); assertEquals("Node 3 does not contain p8?", (Integer) 9, z1z3z5StoreRoutingPlan.getNodesPartitionIdForKey(3, samplePartitionKeysMap.get(8).get(0))); assertEquals("Node 5 does not contain p1?", (Integer) 2, z1z3z5StoreRoutingPlan.getNodesPartitionIdForKey(5, samplePartitionKeysMap.get(1).get(0))); assertEquals("Replication list does not match up", Lists.newArrayList(3, 4, 9, 10, 15, 16 ), z1z3z5StoreRoutingPlan.getReplicationNodeList(0)); assertEquals("Replication list does not match up", Lists.newArrayList(9, 10, 3, 5, 15, 16), z1z3z5StoreRoutingPlan.getReplicationNodeList(3)); assertEquals("Zone replica type should be 0", 0, z1z3z5BaseRoutingPlan.getZoneNAry(1, 3, samplePartitionKeysMap.get(6).get(0))); assertEquals("Zone replica type should be 1 in zone 1", 1, z1z3z5BaseRoutingPlan.getZoneNAry(1, 5, samplePartitionKeysMap.get(6).get(0))); assertEquals("Replica owner should be 4", 4, z1z3z5BaseRoutingPlan.getNodeIdForZoneNary(1, 0, samplePartitionKeysMap.get(1) .get(0))); assertEquals("Replica secondary should be 10", 10, z1z3z5BaseRoutingPlan.getNodeIdForZoneNary(3, 1, samplePartitionKeysMap.get(0) .get(0))); assertEquals("Does Zone 3 have a replica", true, z1z3z5StoreRoutingPlan.zoneNAryExists(3, 1, 0)); } @Test public void testNonZonedStoreRoutingPlan() { HashMap<Integer, List<byte[]>> samplePartitionKeysMap = TestUtils.createPartitionsKeys(nonZonedStoreRoutingPlan, 1); assertEquals("Node 1 does not contain p2 as secondary?", (Integer) 3, nonZonedStoreRoutingPlan.getNodesPartitionIdForKey(1, samplePartitionKeysMap.get(2) .get(0))); assertEquals("Replication list does not match up", Lists.newArrayList(1, 2), nonZonedStoreRoutingPlan.getReplicationNodeList(1)); assertEquals("Zone replica type should be 1", 1, nonZonedBaseRoutingPlan.getZoneNAry(Zone.DEFAULT_ZONE_ID, 2, samplePartitionKeysMap.get(1).get(0))); assertEquals("Zone replica type should be 0", 0, nonZonedBaseRoutingPlan.getZoneNAry(Zone.DEFAULT_ZONE_ID, 1, samplePartitionKeysMap.get(3).get(0))); assertEquals("Replica owner should be 2", 2, nonZonedBaseRoutingPlan.getNodeIdForZoneNary(Zone.DEFAULT_ZONE_ID, 1, samplePartitionKeysMap.get(1).get(0))); assertEquals("Replica owner should be 1", 1, nonZonedBaseRoutingPlan.getNodeIdForZoneNary(Zone.DEFAULT_ZONE_ID, 0, samplePartitionKeysMap.get(3).get(0))); } @After public void teardown() { } }