package me.prettyprint.cassandra.model;
import java.util.HashMap;
import java.util.Map;
import me.prettyprint.cassandra.service.OperationType;
import me.prettyprint.hector.api.HConsistencyLevel;
import me.prettyprint.hector.api.ConsistencyLevelPolicy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Configurable and Runtime adjustable ConsistencyLevelPolicy
* @author zznate
*/
public class ConfigurableConsistencyLevel implements ConsistencyLevelPolicy {
private final Logger log = LoggerFactory.getLogger(ConfigurableConsistencyLevel.class);
private Map<String, HConsistencyLevel> readCfConsistencyLevels = new HashMap<String, HConsistencyLevel>();
private Map<String, HConsistencyLevel> writeCfConsistencyLevels = new HashMap<String, HConsistencyLevel>();
private HConsistencyLevel defaultReadConsistencyLevel = HConsistencyLevel.QUORUM;
private HConsistencyLevel defaultWriteConsistencyLevel = HConsistencyLevel.QUORUM;
@Override
public HConsistencyLevel get(OperationType op) {
return (op == OperationType.READ) ? defaultReadConsistencyLevel : defaultWriteConsistencyLevel;
}
@Override
public HConsistencyLevel get(OperationType op, String cfName) {
if (op == OperationType.READ) {
HConsistencyLevel rcf = readCfConsistencyLevels.get(cfName);
return rcf != null ? rcf : defaultReadConsistencyLevel;
} else {
HConsistencyLevel wcf = writeCfConsistencyLevels.get(cfName);
return wcf != null ? wcf : defaultWriteConsistencyLevel;
}
}
public void setReadCfConsistencyLevels(Map<String, HConsistencyLevel> columnFamilyConsistencyLevels) {
this.readCfConsistencyLevels = columnFamilyConsistencyLevels;
log.info("Read ColumnFamily ConsistencyLevels set to: {}", columnFamilyConsistencyLevels);
}
public void setWriteCfConsistencyLevels(Map<String, HConsistencyLevel> columnFamilyConsistencyLevels) {
this.writeCfConsistencyLevels = columnFamilyConsistencyLevels;
log.info("Write ColumnFamily ConsistencyLevels set to: {}", columnFamilyConsistencyLevels);
}
public void setConsistencyLevelForCfOperation(HConsistencyLevel consistencyLevel,
String columnFamily,
OperationType operationType) {
if (operationType == OperationType.READ) {
readCfConsistencyLevels.put(columnFamily, consistencyLevel);
} else {
writeCfConsistencyLevels.put(columnFamily, consistencyLevel);
}
log.info("{} ConsistencyLevel set to {} for ColumnFamily {}",
new Object[]{operationType.toString(),consistencyLevel.toString(),columnFamily});
}
public void setDefaultReadConsistencyLevel(HConsistencyLevel defaultReadConsistencyLevel) {
this.defaultReadConsistencyLevel = defaultReadConsistencyLevel;
log.info("Default read ConsistencyLevel set to: {}", defaultReadConsistencyLevel.toString() + ".");
}
public void setDefaultWriteConsistencyLevel(HConsistencyLevel defaultWriteConsistencyLevel) {
this.defaultWriteConsistencyLevel = defaultWriteConsistencyLevel;
log.info("Default write ConsistencyLevel set to: {}", defaultWriteConsistencyLevel.toString() + ".");
}
}