package edu.brown.workload.filters;
import java.util.Collection;
import org.apache.log4j.Logger;
import org.voltdb.catalog.CatalogType;
import edu.brown.hstore.HStoreConstants;
import edu.brown.logging.LoggerUtil.LoggerBoolean;
import edu.brown.utils.PartitionEstimator;
import edu.brown.utils.PartitionSet;
import edu.brown.workload.AbstractTraceElement;
import edu.brown.workload.TransactionTrace;
public class BasePartitionTxnFilter extends Filter {
private static final Logger LOG = Logger.getLogger(BasePartitionTxnFilter.class);
private static final LoggerBoolean debug = new LoggerBoolean();
private final PartitionEstimator p_estimator;
private final PartitionSet allowedPartitions = new PartitionSet();
public BasePartitionTxnFilter(PartitionEstimator p_estimator, int...partitions) {
super();
this.p_estimator = p_estimator;
this.allowedPartitions.addAll(partitions);
}
public void addPartitions(Collection<Integer> partitions) {
this.allowedPartitions.addAll(partitions);
}
@Override
protected void resetImpl() {
// Ignore...
}
@Override
protected FilterResult filter(AbstractTraceElement<? extends CatalogType> element) {
FilterResult result = FilterResult.ALLOW;
if (element instanceof TransactionTrace) {
TransactionTrace xact = (TransactionTrace)element;
int basePartition = HStoreConstants.NULL_PARTITION_ID;
try {
basePartition = this.p_estimator.getBasePartition(xact);
} catch (Exception ex) {
ex.printStackTrace();
assert(false);
}
assert(basePartition >= 0);
result = (this.allowedPartitions.contains(basePartition) ? FilterResult.ALLOW : FilterResult.SKIP);
if (debug.val)
LOG.debug(String.format("%s :: basePartition=%d / allowed=%s ==> %s",
xact, basePartition, this.allowedPartitions, result));
}
return (result);
}
@Override
public String debugImpl() {
return (this.getClass().getSimpleName() + ": allowed=" + this.allowedPartitions);
}
}