The done keeps getting called without a lock. Not sure why. You are right we can remove the cachename.
> -----Original Message----- > From: James Taylor [mailto:[EMAIL PROTECTED]] > Sent: Tuesday, May 14, 2002 4:52 PM > To: Turbine JCS Developers List > Subject: Re: cvs commit: jakarta-turbine- > jcs/src/java/org/apache/jcs/auxiliary/disk AbstractDiskCache.java > > Two questions: > > 1) Does this last commit contain anything but formatting changes? If so > I want to back it out -- it was better before =] I can't find any > difference, so I'll test it. > > 2) Do we need to include the cacheName when locking? Since each cache > has its own lock manager and is specific to a given region, can we just > use the key? Would save a string concatenation in a spot where it > probably matters =] > > Looks like a good approach though. Better than what I was doing (locking > the whole region). > > On Tue, 2002-05-14 at 16:41, [EMAIL PROTECTED] wrote: > > asmuts 02/05/14 13:41:04 > > > > Modified: src/java/org/apache/jcs/auxiliary/disk > > AbstractDiskCache.java > > Log: > > seems to work fine. > > > > Adjusting the default log level changes everything. > > > > Please look at this. > > > > Revision Changes Path > > 1.9 +120 -91 jakarta-turbine- > jcs/src/java/org/apache/jcs/auxiliary/disk/AbstractDiskCache.java > > > > Index: AbstractDiskCache.java > > =================================================================== > > RCS file: /home/cvs/jakarta-turbine- > jcs/src/java/org/apache/jcs/auxiliary/disk/AbstractDiskCache.java,v > > retrieving revision 1.8 > > retrieving revision 1.9 > > diff -u -r1.8 -r1.9 > > --- AbstractDiskCache.java 14 May 2002 20:36:03 -0000 1.8 > > +++ AbstractDiskCache.java 14 May 2002 20:41:04 -0000 1.9 > > @@ -53,7 +53,6 @@ > > * information on the Apache Software Foundation, please see > > * <http://www.apache.org/>. > > */ > > - > > import org.apache.commons.logging.Log; > > import org.apache.commons.logging.LogFactory; > > import org.apache.jcs.engine.CacheElement; > > @@ -73,22 +72,20 @@ > > import java.util.Hashtable; > > > > /** > > - * Abstract class providing a base implementation of a disk cache, > which can > > - * be easily extended to implement a disk cache for a specific > perstistence > > - * mechanism. > > - * > > - * When implementing the abstract methods note that while this base > class > > - * handles most things, it does not acquire or release any locks. > > - * Implementations should do so as neccesary. This is mainly done to > minimize > > - * the time speant in critical sections. > > + * Abstract class providing a base implementation of a disk cache, > which can be > > + * easily extended to implement a disk cache for a specific > perstistence > > + * mechanism. When implementing the abstract methods note that while > this base > > + * class handles most things, it does not acquire or release any > locks. > > + * Implementations should do so as neccesary. This is mainly done to > minimize > > + * the time speant in critical sections. Error handling in this > class needs to > > + * be addressed. Currently if an exception is thrown by the > persistence > > + * mechanism, this class destroys the event queue. Should it also > destory > > + * purgatory? Should it dispose itself? > > * > > - * Error handling in this class needs to be addressed. Currently if > an > > - * exception is thrown by the persistence mechanism, this class > destroys the > > - * event queue. Should it also destory purgatory? Should it dispose > itself? > > - * > > - * @author <a href="mailto:[EMAIL PROTECTED]">Aaron Smuts</a> > > - * @author <a href="mailto:[EMAIL PROTECTED]">James Taylor</a> > > - * @version $Id: AbstractDiskCache.java,v 1.8 2002/05/14 20:36:03 > asmuts Exp $ > > + *@author <a href="mailto:[EMAIL PROTECTED]">Aaron Smuts</a> > > + *@author <a href="mailto:[EMAIL PROTECTED]">James Taylor</a> > > + *@created May 13, 2002 > > + *@version $Id: AbstractDiskCache.java,v 1.9 2002/05/14 20:41:04 > asmuts Exp $ > > */ > > public abstract class AbstractDiskCache implements AuxiliaryCache, > Serializable > > { > > @@ -96,66 +93,75 @@ > > LogFactory.getLog( AbstractDiskCache.class ); > > > > /** > > - * Map where elements are stored between being added to this > cache and > > - * actually spooled to disk. This allows puts to the disk cache > to return > > - * quickly, and the more expensive operation of serializing the > elements > > - * to persistent storage queued for later. If the elements are > pulled into > > - * the memory cache while the are still in purgatory, writing to > disk can > > - * be cancelled. > > + * Map where elements are stored between being added to this > cache and > > + * actually spooled to disk. This allows puts to the disk cache > to return > > + * quickly, and the more expensive operation of serializing the > elements to > > + * persistent storage queued for later. If the elements are > pulled into the > > + * memory cache while the are still in purgatory, writing to > disk can be > > + * cancelled. > > */ > > protected Hashtable purgatory = new Hashtable(); > > > > /** > > - * The CacheEventQueue where changes will be queued for > asynchronous > > - * updating of the persistent storage. > > + * The CacheEventQueue where changes will be queued for > asynchronous > > + * updating of the persistent storage. > > */ > > protected ICacheEventQueue cacheEventQueue; > > > > /** > > - * Each instance of a Disk cache should use this lock to > synchronize reads > > - * and writes to the underlying storage mechansism. > > + * Each instance of a Disk cache should use this lock to > synchronize reads > > + * and writes to the underlying storage mechansism. > > */ > > protected ReadWriteLock lock = new ReadWriteLock(); > > > > - /** Manages locking for purgatory item manipulation. */ > > + /** > > + * Manages locking for purgatory item manipulation. > > + */ > > protected ReadWriteLockManager locker = new > ReadWriteLockManager(); > > > > /** > > - * Indicates whether the cache is 'alive', defined as having been > > - * initialized, but not yet disposed. > > + * Indicates whether the cache is 'alive', defined as having > been > > + * initialized, but not yet disposed. > > */ > > protected boolean alive = false; > > > > /** > > - * Every cache will have a name, subclasses must set this when > they are > > - * initialized. > > + * Every cache will have a name, subclasses must set this when > they are > > + * initialized. > > */ > > protected String cacheName; > > > > /** > > - * DEBUG: Keeps a count of the number of purgatory hits for debug > messages > > + * DEBUG: Keeps a count of the number of purgatory hits for > debug messages > > */ > > protected int purgHits = 0; > > > > // ----------------------------------------------------------- > constructors > > > > + /** > > + * Constructor for the AbstractDiskCache object > > + * > > + *@param cacheName Description of the Parameter > > + */ > > public AbstractDiskCache( String cacheName ) > > { > > this.cacheName = cacheName; > > > > this.cacheEventQueue = new CacheEventQueue( new > MyCacheListener(), > > - > CacheInfo.listenerId, > > - cacheName ); > > + CacheInfo.listenerId, > > + cacheName ); > > } > > > > // ------------------------------------------------------- > interface ICache > > > > /** > > - * Adds the provided element to the cache. Element will be added > to > > - * purgatory, and then queued for later writing to the serialized > storage > > - * mechanism. > > + * Adds the provided element to the cache. Element will be added > to > > + * purgatory, and then queued for later writing to the > serialized storage > > + * mechanism. > > * > > - * @see org.apache.jcs.engine.behavior.ICache#update > > + *@param cacheElement Description of the Parameter > > + *@exception IOException Description of the Exception > > + *@see > org.apache.jcs.engine.behavior.ICache#update > > */ > > public final void update( ICacheElement cacheElement ) > > throws IOException > > @@ -163,7 +169,7 @@ > > if ( log.isDebugEnabled() ) > > { > > log.debug( "Putting element in purgatory, cacheName: " + > cacheName + > > - ", key: " + cacheElement.getKey() ); > > + ", key: " + cacheElement.getKey() ); > > } > > > > try > > @@ -195,7 +201,9 @@ > > } > > > > /** > > - * @see AuxiliaryCache#get > > + *@param key Description of the Parameter > > + *@return Description of the Return Value > > + *@see AuxiliaryCache#get > > */ > > public final ICacheElement get( Serializable key ) > > { > > @@ -229,7 +237,7 @@ > > pe.setSpoolable( false ); > > > > log.debug( "Found element in purgatory, cacheName: " + > cacheName + > > - ", key: " + key ); > > + ", key: " + key ); > > > > purgatory.remove( key ); > > > > @@ -254,7 +262,9 @@ > > } > > > > /** > > - * @see org.apache.jcs.engine.behavior.ICache#remove > > + *@param key Description of the Parameter > > + *@return Description of the Return Value > > + *@see org.apache.jcs.engine.behavior.ICache#remove > > */ > > public final boolean remove( Serializable key ) > > { > > @@ -265,14 +275,14 @@ > > try > > { > > > > - purgatory.remove( key ); > > + purgatory.remove( key ); > > > > - doRemove( key ); > > + doRemove( key ); > > > > } > > finally > > { > > - releaseLock( this.cacheName + key.toString() ); > > + releaseLock( this.cacheName + key.toString() ); > > } > > // Remove from persistent store immediately > > > > @@ -280,7 +290,7 @@ > > } > > > > /** > > - * @see org.apache.jcs.engine.behavior.ICache#removeAll > > + *@see org.apache.jcs.engine.behavior.ICache#removeAll > > */ > > public final void removeAll() > > { > > @@ -294,7 +304,7 @@ > > } > > > > /** > > - * Adds a dispose request to the disk cache. > > + * Adds a dispose request to the disk cache. > > */ > > public final void dispose() > > { > > @@ -310,7 +320,8 @@ > > } > > > > /** > > - * @see ICache#getCacheName > > + *@return The cacheName value > > + *@see ICache#getCacheName > > */ > > public String getCacheName() > > { > > @@ -318,7 +329,8 @@ > > } > > > > /** > > - * @see ICache#getStatus > > + *@return The status value > > + *@see ICache#getStatus > > */ > > public int getStatus() > > { > > @@ -326,18 +338,18 @@ > > } > > > > /** > > - * Size cannot be determined without knowledge of the cache > implementation, > > - * so subclasses will need to implement this method. > > + * Size cannot be determined without knowledge of the cache > implementation, > > + * so subclasses will need to implement this method. > > * > > - * @see ICache#getSize > > + *@return The size value > > + *@see ICache#getSize > > */ > > public abstract int getSize(); > > > > /** > > - * @see org.apache.jcs.engine.behavior.ICacheType#getCacheType > > - * > > - * @return Always returns DISK_CACHE since subclasses should all > be of > > - * that type. > > + *@return Always returns DISK_CACHE since subclasses should > all be of > > + * that type. > > + *@see > org.apache.jcs.engine.behavior.ICacheType#getCacheType > > */ > > public int getCacheType() > > { > > @@ -346,9 +358,9 @@ > > > > > > /** > > - * Internally used write lock for purgatory item modification. > > + * Internally used write lock for purgatory item modification. > > * > > - * @param id What name to lock on. > > + *@param id What name to lock on. > > */ > > private void writeLock( String id ) > > { > > @@ -365,15 +377,15 @@ > > catch ( Throwable e ) > > { > > > > - log.error( e ); > > + log.error( e ); > > } > > } > > > > > > /** > > - * Internally used write lock for purgatory item modification. > > + * Internally used write lock for purgatory item modification. > > * > > - * @param id What name to lock on. > > + *@param id What name to lock on. > > */ > > private void releaseLock( String id ) > > { > > @@ -384,21 +396,26 @@ > > catch ( Throwable e ) > > { > > > > - log.error( e ); > > + log.error( e ); > > } > > } > > > > > > /** > > - * Cache that implements the CacheListener interface, and calls > appropriate > > - * methods in its parent class. > > + * Cache that implements the CacheListener interface, and calls > appropriate > > + * methods in its parent class. > > + * > > + *@author asmuts > > + *@created May 13, 2002 > > */ > > private class MyCacheListener implements ICacheListener > > { > > private byte listenerId = 0; > > > > /** > > - * @see org.apache.jcs.engine.CacheListener#getListenerId > > + *@return The listenerId value > > + *@exception IOException Description of the Exception > > + *@see > org.apache.jcs.engine.CacheListener#getListenerId > > */ > > public byte getListenerId() > > throws IOException > > @@ -407,7 +424,9 @@ > > } > > > > /** > > - * @see ICacheListener#setListenerId > > + *@param id The new listenerId value > > + *@exception IOException Description of the Exception > > + *@see ICacheListener#setListenerId > > */ > > public void setListenerId( byte id ) > > throws IOException > > @@ -416,12 +435,13 @@ > > } > > > > /** > > - * @see ICacheListener#handlePut > > - * > > - * NOTE: This checks if the element is a puratory element and > behaves > > - * differently depending. However since we have control over > how > > - * elements are added to the cache event queue, that may not > be needed > > - * ( they are always PurgatoryElements ). > > + *@param element Description of the Parameter > > + *@exception IOException Description of the Exception > > + *@see ICacheListener#handlePut NOTE: > This checks if > > + * the element is a puratory element and behaves > differently > > + * depending. However since we have control over how > elements are > > + * added to the cache event queue, that may not be > needed ( they > > + * are always PurgatoryElements ). > > */ > > public void handlePut( ICacheElement element ) > > throws IOException > > @@ -438,20 +458,20 @@ > > // If the element has already been removed from > purgatory > > // do nothing > > > > - String lK =element.getKey().toString(); > > + String lK = element.getKey().toString(); > > writeLock( getCacheName() + lK ); > > try > > { > > > > - if ( ! purgatory.contains( pe ) ) > > - { > > - return; > > - } > > + if ( !purgatory.contains( pe ) ) > > + { > > + return; > > + } > > > > } > > finally > > { > > - releaseLock( getCacheName() + lK ); > > + releaseLock( getCacheName() + lK ); > > } > > > > element = pe.getCacheElement(); > > @@ -476,7 +496,10 @@ > > } > > > > /** > > - * @see org.apache.jcs.engine.CacheListener#handleRemove > > + *@param cacheName Description of the Parameter > > + *@param key Description of the Parameter > > + *@exception IOException Description of the Exception > > + *@see > org.apache.jcs.engine.CacheListener#handleRemove > > */ > > public void handleRemove( String cacheName, Serializable key > ) > > throws IOException > > @@ -491,7 +514,9 @@ > > } > > > > /** > > - * @see org.apache.jcs.engine.CacheListener#handleRemoveAll > > + *@param cacheName Description of the Parameter > > + *@exception IOException Description of the Exception > > + *@see > org.apache.jcs.engine.CacheListener#handleRemoveAll > > */ > > public void handleRemoveAll( String cacheName ) > > throws IOException > > @@ -503,7 +528,9 @@ > > } > > > > /** > > - * @see org.apache.jcs.engine.CacheListener#handleDispose > > + *@param cacheName Description of the Parameter > > + *@exception IOException Description of the Exception > > + *@see > org.apache.jcs.engine.CacheListener#handleDispose > > */ > > public void handleDispose( String cacheName ) > > throws IOException > > @@ -519,36 +546,38 @@ > > // ---------------------- subclasses should implement the > following methods > > > > /** > > - * Get a value from the persistent store. > > + * Get a value from the persistent store. > > * > > - * @param key Key to locate value for. > > - * @return An object matching key, or null. > > + *@param key Key to locate value for. > > + *@return An object matching key, or null. > > */ > > protected abstract ICacheElement doGet( Serializable key ); > > > > /** > > - * Add a cache element to the persistent store. > > + * Add a cache element to the persistent store. > > + * > > + *@param element Description of the Parameter > > */ > > protected abstract void doUpdate( ICacheElement element ); > > > > /** > > - * Remove an object from the persistent store if found. > > + * Remove an object from the persistent store if found. > > * > > - * @param key Key of object to remove. > > + *@param key Key of object to remove. > > + *@return Description of the Return Value > > */ > > protected abstract boolean doRemove( Serializable key ); > > > > /** > > - * Remove all objects from the persistent store. > > + * Remove all objects from the persistent store. > > */ > > protected abstract void doRemoveAll(); > > > > /** > > - * Dispose of the persistent store. Note that disposal of > purgatory and > > - * setting alive to false does NOT need to be done by this > method. > > + * Dispose of the persistent store. Note that disposal of > purgatory and > > + * setting alive to false does NOT need to be done by this > method. > > */ > > protected abstract void doDispose(); > > - > > > > } > > > > > > > > > > > > -- > > To unsubscribe, e-mail: <mailto:turbine-jcs-dev- > [EMAIL PROTECTED]> > > For additional commands, e-mail: <mailto:turbine-jcs-dev- > [EMAIL PROTECTED]> > > > > > > > > -- > To unsubscribe, e-mail: <mailto:turbine-jcs-dev- > [EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:turbine-jcs-dev- > [EMAIL PROTECTED]>
