package voldemort.store.slop.strategy;
import voldemort.VoldemortException;
import voldemort.cluster.Cluster;
import voldemort.store.StoreDefinition;
/**
* A factory that gets the appropriate {@link HintedHandoffStrategy} for a given
* {@link HintedHandoffStrategyType}.
*/
public class HintedHandoffStrategyFactory {
private final boolean enableZoneRouting;
private final int clientZoneId;
public HintedHandoffStrategyFactory(boolean enableZoneRouting, int clientZoneId) {
this.enableZoneRouting = enableZoneRouting;
this.clientZoneId = clientZoneId;
}
public HintedHandoffStrategy updateHintedHandoffStrategy(StoreDefinition storeDef,
Cluster cluster) {
if(HintedHandoffStrategyType.CONSISTENT_STRATEGY.toDisplay()
.compareTo(storeDef.getHintedHandoffStrategyType()
.toDisplay()) == 0) {
Integer hintPrefListSize = storeDef.getHintPrefListSize();
// Default value for hint pref list size = replication factor
if(null == hintPrefListSize) {
if(cluster.getNumberOfNodes() == storeDef.getReplicationFactor())
hintPrefListSize = storeDef.getReplicationFactor() - 1;
else
hintPrefListSize = storeDef.getReplicationFactor();
}
return new ConsistentHandoffStrategy(cluster,
hintPrefListSize,
enableZoneRouting,
clientZoneId);
} else if(HintedHandoffStrategyType.ANY_STRATEGY.toDisplay()
.compareTo(storeDef.getHintedHandoffStrategyType()
.toDisplay()) == 0) {
return new HandoffToAnyStrategy(cluster, enableZoneRouting, clientZoneId);
} else if(HintedHandoffStrategyType.PROXIMITY_STRATEGY.toDisplay()
.compareTo(storeDef.getHintedHandoffStrategyType()
.toDisplay()) == 0) {
return new ProximityHandoffStrategy(cluster, clientZoneId);
} else {
throw new VoldemortException("HintedHandoffStrategyType:"
+ storeDef.getHintedHandoffStrategyType()
+ " not handled by " + this.getClass());
}
}
}