package voldemort.store.routed;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import voldemort.cluster.Cluster;
import voldemort.store.InsufficientOperationalNodesException;
import voldemort.store.StoreDefinition;
import voldemort.versioning.Versioned;
public class ZoneAffinityGetAllTest extends AbstractZoneAffinityTest{
public ZoneAffinityGetAllTest(Integer clientZoneId, Cluster cluster, List<StoreDefinition> storeDefs) {
super(clientZoneId, cluster, storeDefs);
}
@Override
public void setupZoneAffinitySettings() {
clientConfig.getZoneAffinity().setEnableGetAllOpZoneAffinity(true);
}
@Test
public void testAllUp() {
try {
ArrayList<String> keys = new ArrayList<String>();
keys.add("K1");
keys.add("K2");
keys.add("K3");
Map<String, List<Versioned<String>>> versioneds = client.getAll(keys, null);
assertEquals("V1", versioneds.get("K1").get(0).getValue());
assertEquals("V1", versioneds.get("K2").get(0).getValue());
assertEquals(null, versioneds.get("K3"));
} catch(InsufficientOperationalNodesException e) {
fail("Failed with exception: " + e);
}
}
@Test
public void testLocalZoneDown() {
for(Integer nodeId: cluster.getNodeIdsInZone(clientZoneId)) {
this.vservers.get(nodeId).stop();
}
try {
ArrayList<String> keys = new ArrayList<String>();
keys.add("K1");
keys.add("K2");
keys.add("K3");
Map<String, List<Versioned<String>>> versioneds = client.getAll(keys, null);
assertEquals(null, versioneds.get("K1"));
assertEquals(null, versioneds.get("K2"));
assertEquals(null, versioneds.get("K3"));
} 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 {
ArrayList<String> keys = new ArrayList<String>();
keys.add("K1");
keys.add("K2");
keys.add("K3");
Map<String, List<Versioned<String>>> versioneds = client.getAll(keys, null);
assertEquals("V1", versioneds.get("K1").get(0).getValue());
assertEquals("V1", versioneds.get("K2").get(0).getValue());
assertEquals(null, versioneds.get("K3"));
} 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 {
ArrayList<String> keys = new ArrayList<String>();
keys.add("K1");
keys.add("K2");
keys.add("K3");
Map<String, List<Versioned<String>>> versioneds = client.getAll(keys, null);
assertEquals(null, versioneds.get("K1"));
assertEquals(null, versioneds.get("K2"));
assertEquals(null, versioneds.get("K3"));
} catch(InsufficientOperationalNodesException e) {
}
}
}