package org.dcache.pool.classic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import diskCacheV111.util.CacheException;
import diskCacheV111.util.PnfsId;
import org.dcache.pool.repository.AbstractStateChangeListener;
import org.dcache.pool.repository.CacheEntry;
import org.dcache.pool.repository.ReplicaState;
import org.dcache.pool.repository.Repository;
import org.dcache.pool.repository.SpaceSweeperPolicy;
import org.dcache.pool.repository.StateChangeEvent;
/**
*
* SpaceSweeper which removes files as soon as they become 'CACHED'
* and not 'STICKY'.
*
* @since 1.8.0-16
*
*/
public class NoCachedFilesSpaceSweeper
extends AbstractStateChangeListener
implements SpaceSweeperPolicy
{
private static final Logger _log =
LoggerFactory.getLogger(NoCachedFilesSpaceSweeper.class);
private Repository _repository;
public NoCachedFilesSpaceSweeper()
{
}
public void setRepository(Repository repository)
{
_repository = repository;
_repository.addListener(this);
}
/**
* Returns true if this file is removable. This is the case if the
* file is not sticky and is cached (which under normal
* circumstances implies that it is ready and not precious).
*/
@Override
public boolean isRemovable(CacheEntry entry)
{
return false;
}
@Override
public long getLru()
{
return 0;
}
@Override
public void stateChanged(StateChangeEvent event)
{
try {
if (event.getNewState() == ReplicaState.CACHED) {
PnfsId id = event.getPnfsId();
CacheEntry entry = event.getNewEntry();
if (!entry.isSticky()) {
_repository.setState(id, ReplicaState.REMOVED);
_log.debug(entry.getPnfsId() + " : removed.");
}
}
} catch (InterruptedException | CacheException e) {
_log.warn("Failed to remove entry from repository: " + e.getMessage() );
}
}
}