package voldemort.server.scheduler.slop; import java.util.Set; import org.apache.log4j.Logger; import voldemort.cluster.Cluster; import voldemort.cluster.failuredetector.FailureDetector; import voldemort.server.StoreRepository; import voldemort.server.VoldemortConfig; import voldemort.server.storage.ScanPermitWrapper; import voldemort.store.metadata.MetadataStore; import voldemort.store.slop.Slop; import voldemort.store.slop.SlopStorageEngine; import voldemort.utils.ByteArray; import voldemort.utils.Pair; import voldemort.utils.Utils; import voldemort.versioning.Versioned; /** * * TODO there is potentially lot more the two slop pushers can share. * */ public abstract class SlopPusherJob { protected final StoreRepository storeRepo; protected final MetadataStore metadataStore; protected final FailureDetector failureDetector; protected final ScanPermitWrapper repairPermits; protected final VoldemortConfig voldemortConfig; SlopPusherJob(StoreRepository storeRepo, MetadataStore metadataStore, FailureDetector failureDetector, VoldemortConfig voldemortConfig, ScanPermitWrapper repairPermits) { this.storeRepo = storeRepo; this.metadataStore = metadataStore; this.repairPermits = Utils.notNull(repairPermits); this.failureDetector = failureDetector; this.voldemortConfig = voldemortConfig; } /** * A slop is dead if the destination node or the store does not exist * anymore on the cluster. * * @param slop * @return */ protected boolean isSlopDead(Cluster cluster, Set<String> storeNames, Slop slop) { // destination node , no longer exists if(!cluster.getNodeIds().contains(slop.getNodeId())) { return true; } // destination store, no longer exists if(!storeNames.contains(slop.getStoreName())) { return true; } // else. slop is alive return false; } /** * Handle slop for nodes that are no longer part of the cluster. It may not * always be the case. For example, shrinking a zone or deleting a store. */ protected void handleDeadSlop(SlopStorageEngine slopStorageEngine, Pair<ByteArray, Versioned<Slop>> keyAndVal) { Versioned<Slop> versioned = keyAndVal.getSecond(); // If configured to delete the dead slop if(voldemortConfig.getAutoPurgeDeadSlops()) { slopStorageEngine.delete(keyAndVal.getFirst(), versioned.getVersion()); if(getLogger().isDebugEnabled()) { getLogger().debug("Auto purging dead slop :" + versioned.getValue()); } } else { // Keep ignoring the dead slops if(getLogger().isDebugEnabled()) { getLogger().debug("Ignoring dead slop :" + versioned.getValue()); } } } public abstract Logger getLogger(); }