/* * Copyright 2010 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.store.routed.action; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.List; import java.util.concurrent.TimeUnit; import org.junit.Test; import voldemort.cluster.Node; import voldemort.routing.RouteToAllStrategy; import voldemort.routing.RoutingStrategy; import voldemort.routing.ZoneRoutingStrategy; import voldemort.store.InsufficientOperationalNodesException; import voldemort.store.routed.BasicPipelineData; import voldemort.store.routed.Pipeline; import voldemort.store.routed.Pipeline.Event; import voldemort.store.routed.Pipeline.Operation; public class ConfigureNodesTest extends AbstractActionTest { @Test public void testConfigureNodes() throws Exception { RoutingStrategy routingStrategy = new RouteToAllStrategy(cluster.getNodesShuffled()); BasicPipelineData<byte[]> pipelineData = new BasicPipelineData<byte[]>(); ConfigureNodes<byte[], BasicPipelineData<byte[]>> action = new ConfigureNodes<byte[], BasicPipelineData<byte[]>>(pipelineData, Event.COMPLETED, failureDetector, 1, routingStrategy, aKey, null); Pipeline pipeline = new Pipeline(Operation.GET, 10000, TimeUnit.MILLISECONDS); pipeline.addEventAction(Event.STARTED, action); pipeline.addEvent(Event.STARTED); pipeline.execute(); if(pipelineData.getFatalError() != null) throw pipelineData.getFatalError(); assertEquals(cluster.getNodes().size(), pipelineData.getNodes().size()); } @Test(expected = InsufficientOperationalNodesException.class) public void testConfigureNodesNotEnoughNodes() throws Exception { RoutingStrategy routingStrategy = new RouteToAllStrategy(cluster.getNodesShuffled()); BasicPipelineData<byte[]> pipelineData = new BasicPipelineData<byte[]>(); ConfigureNodes<byte[], BasicPipelineData<byte[]>> action = new ConfigureNodes<byte[], BasicPipelineData<byte[]>>(pipelineData, Event.COMPLETED, failureDetector, cluster.getNodes() .size() + 1, routingStrategy, aKey, null); Pipeline pipeline = new Pipeline(Operation.GET, 10000, TimeUnit.MILLISECONDS); pipeline.addEventAction(Event.STARTED, action); pipeline.addEvent(Event.STARTED); pipeline.execute(); if(pipelineData.getFatalError() != null) throw pipelineData.getFatalError(); else fail(); } @Test public void testConfigureNodesWithZones() throws Exception { RoutingStrategy routingStrategy = new ZoneRoutingStrategy(clusterWithZones, storeDef.getZoneReplicationFactor(), storeDef.getReplicationFactor()); BasicPipelineData<byte[]> pipelineData = new BasicPipelineData<byte[]>(); Pipeline pipeline = new Pipeline(Operation.PUT, 10000, TimeUnit.MILLISECONDS); // PUT with changing zone id for(int clusterZoneId = 0; clusterZoneId < clusterWithZones.getNumberOfZones(); clusterZoneId++) { pipelineData.setZonesRequired(storeDef.getZoneCountWrites()); pipeline.addEventAction(Event.STARTED, new ConfigureNodes<byte[], BasicPipelineData<byte[]>>(pipelineData, Event.COMPLETED, failureDetectorWithZones, storeDef.getRequiredReads(), routingStrategy, aKey, clusterWithZones.getZoneById(clusterZoneId))); pipeline.addEvent(Event.STARTED); pipeline.execute(); List<Node> pipelineNodes = pipelineData.getNodes(); int pipelineNodesIndex = 0; List<Integer> proximityList = clusterWithZones.getZoneById(clusterZoneId) .getProximityList(); // Check if returned list is as per the proximity list assertEquals(pipelineNodes.get(pipelineNodesIndex++).getZoneId(), clusterZoneId); for(; pipelineNodesIndex < pipelineNodes.size(); pipelineNodesIndex++) { assertEquals(proximityList.get(pipelineNodesIndex - 1), new Integer(pipelineNodes.get(pipelineNodesIndex).getZoneId())); } } // GET with changing zone requirements for(int zoneReq = 0; zoneReq < clusterWithZones.getNumberOfZones(); zoneReq++) { pipelineData = new BasicPipelineData<byte[]>(); pipeline = new Pipeline(Operation.GET, 10000, TimeUnit.MILLISECONDS); pipelineData.setZonesRequired(zoneReq); pipeline.addEventAction(Event.STARTED, new ConfigureNodes<byte[], BasicPipelineData<byte[]>>(pipelineData, Event.COMPLETED, failureDetectorWithZones, storeDef.getRequiredReads(), routingStrategy, aKey, clusterWithZones.getZoneById(0))); pipeline.addEvent(Event.STARTED); pipeline.execute(); // Check the first few nodes which are from different zones int zoneId = 1; for(int index = 0; index < zoneReq; index++) { assertEquals(pipelineData.getNodes().get(index).getZoneId(), zoneId++); } } } }