Mercurial > hg > blitz_condensed
diff src/org/dancres/blitz/entry/CleanerImpl.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/dancres/blitz/entry/CleanerImpl.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,87 @@ +package org.dancres.blitz.entry; + +import java.io.IOException; + +import org.dancres.blitz.arc.CacheBlockDescriptor; +import org.dancres.blitz.lease.ReapFilter; +import org.dancres.blitz.oid.OID; + +/** + Responsible for taking each ID passed, attempting to load the + specified sleeve, checking with ReapFilters and then deleting sleeve + if appropriate. Note, Storage is expected to pass OID's to us + whilst we pass EntrySleeveImpls to our ReapFilter. + */ +public class CleanerImpl implements EntryReaper { + private SleeveCache theCache; + private ReapFilter theFilter; + + /** + * @param aCache the cache to request sleeves from for OIDs + * passed in by Storage + * @param aFilter the filter to check with before performing deletion. + */ + CleanerImpl(SleeveCache aCache, ReapFilter aFilter) { + theCache = aCache; + theFilter = aFilter; + } + + public void clean(TupleLocator aLocator) throws IOException { + /** + Accept TupleLocator from Storage + Attempt load to cache + Check with theFilter + Mark deleted (if filter says okay) + Release CBD + */ + long myCurrentTime = System.currentTimeMillis(); + + long myPurged = 0; + + while (aLocator.fetchNext()) { + OID myOID = aLocator.getOID(); + + CacheBlockDescriptor myCBD = theCache.load(myOID); + + if (myCBD != null) { + EntrySleeveImpl mySleeve = (EntrySleeveImpl) + myCBD.getContent(); + + /* + If you expect a particular EntrySleeve to be cleaned + and it's not happening, uncomment these to provide some + hints + System.err.println("Has expired: " + + mySleeve.hasExpired(myCurrentTime)); + + System.err.println("Has deleted: " + + mySleeve.getState().test(SleeveState.DELETED)); + + System.err.println("Filtered: " + + theFilter.filter(mySleeve)); + */ + + if ((mySleeve.hasExpired(myCurrentTime)) && + (! mySleeve.getState().test(SleeveState.DELETED)) && + (! theFilter.filter(mySleeve))) { + + /* + System.err.println("Lease delete:" + + mySleeve.getUid()); + */ + + mySleeve.getState().set(SleeveState.DELETED); + mySleeve.markDirty(); + theCache.getCounters().didPurge(); + + ++myPurged; + } + + myCBD.release(); + } + } + + EntryStorage.theLogger.info("Reaper purged " + theCache + + " " + myPurged); + } +}