package voldemort.store.routed; import static org.junit.Assert.fail; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import voldemort.ClusterTestUtils; import voldemort.ServerTestUtils; import voldemort.TestUtils; import voldemort.client.ClientConfig; import voldemort.client.SocketStoreClientFactory; import voldemort.cluster.Cluster; import voldemort.cluster.Node; import voldemort.server.VoldemortConfig; import voldemort.server.VoldemortServer; import voldemort.store.InsufficientOperationalNodesException; import voldemort.store.Store; import voldemort.store.StoreDefinition; import voldemort.store.socket.SocketStoreFactory; import voldemort.store.socket.clientrequest.ClientRequestExecutorPool; import voldemort.utils.ByteArray; import voldemort.versioning.VectorClock; import voldemort.versioning.Versioned; public class ZoneAffinityGetVersionsTest extends AbstractZoneAffinityTest { public ZoneAffinityGetVersionsTest(Integer clientZoneId, Cluster cluster, List<StoreDefinition> storeDefs) { super(clientZoneId, cluster, storeDefs); } @Override public void setupZoneAffinitySettings() { clientConfig.getZoneAffinity().setEnableGetVersionsOpZoneAffinity(true); } @Test public void testAllUp() { try { client.getVersions("K1"); } catch(InsufficientOperationalNodesException e) { fail("Failed with exception: " + e); } } @Test public void testLocalZoneDown() { for(Integer nodeId: cluster.getNodeIdsInZone(clientZoneId)) { this.vservers.get(nodeId).stop(); } try { client.getVersions("K1"); fail("Did not fail fast"); } catch(InsufficientOperationalNodesException e) { } } @Test public void testLocalZonePartialDownSufficientReads() { // turn off one node in same zone as client so that reads can still // complete this.vservers.get(cluster.getNodeIdsInZone(clientZoneId).iterator().next()).stop(); try { client.getVersions("K1"); } catch(InsufficientOperationalNodesException e) { fail("Failed with exception: " + e); } } @Test public void testLocalZonePartialDownInSufficientReads() { // Stop all but one node in same zone as client. This is not sufficient // for zone reads. Set<Integer> nodeIds = cluster.getNodeIdsInZone(clientZoneId); nodeIds.remove(nodeIds.iterator().next()); for(Integer nodeId: nodeIds) { this.vservers.get(nodeId).stop(); } try { client.getVersions("K1"); fail("Did not fail fast"); } catch(InsufficientOperationalNodesException e) { } } }