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++);