diff --git a/src/com/silverwrist/util/cache/ObjectCache.java b/src/com/silverwrist/util/cache/ObjectCache.java new file mode 100644 index 0000000..27d1b36 --- /dev/null +++ b/src/com/silverwrist/util/cache/ObjectCache.java @@ -0,0 +1,195 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.util.cache; + +import java.lang.ref.*; +import java.util.*; + +/** + * A chache which stores objects by key value, and is capable of creating them given an instance of + * ObjectFactory to do the creating. The cache uses SoftReferences which can + * automatically be removed by the garbage collector if necessary. + * + * @author Eric J. Bowersox <erbo@silcom.com> + * @version X + * @see ObjectFactory + * @see java.lang.ref.SoftReference + */ +public class ObjectCache +{ + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private HashMap the_data = new HashMap(); // the actual underlying map + private ObjectFactory factory; // used to create new objects + private ReferenceQueue rq = new ReferenceQueue(); // where our references go when they die + private ArrayList sweeper = new ArrayList(); // temporary used in doing sweeps + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + /** + * Creates a new ObjectCache. + * + * @param factory The factory object used to create new objects when getOrCreate is called. + * @exception java.lang.NullPointerException The object factory passed in is null. + */ + public ObjectCache(ObjectFactory factory) + { + if (factory==null) + throw new NullPointerException("object factory cannot be null!"); + this.factory = factory; + + } // end constructor + + /*-------------------------------------------------------------------------------- + * Internal operations + *-------------------------------------------------------------------------------- + */ + + /** + * "Sweeps" the cache by taking all references that have been cleared and queued by the garbage + * collector and removing them from the map. Should be called fairly often, to minimize wasted + * hashmap slots. + */ + private synchronized void doSweep() + { + Set entries = the_data.entrySet(); // used to find entries with the specified value + Reference r = rq.poll(); // reference that's been cleared + Iterator it; + + while (r!=null) + { // look for this reference in our hash map + it = entries.iterator(); + while (it.hasNext()) + { // look for the map entry containing the reference + Map.Entry ntry = (Map.Entry)(it.next()); + if (r==(Reference)(ntry.getValue())) + { // found the entry with this reference - nuke it + sweeper.add(ntry.getKey()); + break; // don't need to take this loop any farther + + } // end if + + } // end while + + r = rq.poll(); // get the next cleared reference + + } // end while + + if (sweeper.isEmpty()) + return; // no entries to remove + + // Remove all the corresponding keys from the hashmap. + it = sweeper.iterator(); + while (it.hasNext()) + the_data.remove(it.next()); + sweeper.clear(); // reset for next time + + } // end doSweep + + /*-------------------------------------------------------------------------------- + * External operations + *-------------------------------------------------------------------------------- + */ + + /** + * Retrieves an object from the cache. + * + * @param key The key value of the object to look up. + * @return The corresponding object value, or null if that object isn't in the cache. + */ + public synchronized Object get(Object key) + { + doSweep(); + SoftReference r = (SoftReference)(the_data.get(key)); + return ((r==null) ? null : r.get()); + + } // end get + + /** + * Retrieves an object from the cache, creating it if it doesn't already exist. + * + * @param key The key value of the object to look up or create. + * @return The corresponding object value. + * @exception com.silverwrist.util.cache.ObjectFactoryException If an exception occurred while creating + * a new object. + * @see ObjectFactory#newObject(java.lang.Object) + */ + public synchronized Object getOrCreate(Object key) throws ObjectFactoryException + { + doSweep(); + SoftReference r = (SoftReference)(the_data.get(key)); + Object rc = ((r==null) ? null : r.get()); + if (rc==null) + { // attempt to create a new object + rc = factory.newObject(key); + if (rc!=null) + { // clear the old reference, throw it away, and put in a new one + if (r!=null) + r.clear(); + r = new SoftReference(rc,rq); + the_data.put(key,r); + + } // end if + + } // end if + + return rc; + + } // end getOrCreate + + /** + * Registers a newly-created object with the cache. + * + * @param key The key value to register this object with. + * @param data The object to be registered. + * @exception com.silverwrist.util.cache.ObjectCacheException If an object with that key value already + * exists in the cache. + */ + public synchronized void register(Object key, Object data) + { + doSweep(); + SoftReference old = (SoftReference)(the_data.get(key)); + if ((old!=null) && (old.get()!=null)) + throw new ObjectCacheException("object already in cache",key); + the_data.put(key,new SoftReference(data,rq)); + if (old!=null) + old.clear(); + + } // end register + + /** + * Detaches an object from the cache. + * + * @param key Key value of the object to be detached. + */ + public synchronized void detach(Object key) + { + doSweep(); + SoftReference old = (SoftReference)(the_data.remove(key)); + if (old!=null) + old.clear(); + + } // end detach + +} // end class ObjectCache diff --git a/src/com/silverwrist/util/rcache/ReferenceCacheException.java b/src/com/silverwrist/util/cache/ObjectCacheException.java similarity index 61% rename from src/com/silverwrist/util/rcache/ReferenceCacheException.java rename to src/com/silverwrist/util/cache/ObjectCacheException.java index 6c178e7..060b609 100644 --- a/src/com/silverwrist/util/rcache/ReferenceCacheException.java +++ b/src/com/silverwrist/util/cache/ObjectCacheException.java @@ -15,23 +15,37 @@ * * Contributor(s): */ -package com.silverwrist.util.rcache; +package com.silverwrist.util.cache; -public class ReferenceCacheException extends RuntimeException +/** + * An exception thrown by the ObjectCache in unusual circumstances. The main reason why this + * exception would be thrown is if some code tried to register an object that was already in the cache. + * + * @author Eric J. Bowersox <erbo@silcom.com> + * @version X + * @see ObjectCache#register(java.lang.Object,java.lang.Object) + */ +public class ObjectCacheException extends RuntimeException { /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- */ - private Object keyval; + private Object keyval; // key value /*-------------------------------------------------------------------------------- * Constructor *-------------------------------------------------------------------------------- */ - public ReferenceCacheException(String msg, Object keyval) + /** + * Constructs a new ObjectCacheException. + * + * @param msg The message to include with this exception. + * @param keyval The key value of the object that caused this exception to be generated. + */ + public ObjectCacheException(String msg, Object keyval) { super("[keyval " + keyval.toString() + "]: " + msg); this.keyval = keyval; @@ -43,10 +57,15 @@ public class ReferenceCacheException extends RuntimeException *-------------------------------------------------------------------------------- */ + /** + * Returns the key value of the object that caused this exception to be generated. + * + * @return The key value of the object that caused this exception to be generated. + */ public Object getKeyVal() { return keyval; } // end getKeyVal -} // end class ReferenceCacheException +} // end class ObjectClassException diff --git a/src/com/silverwrist/util/cache/ObjectFactory.java b/src/com/silverwrist/util/cache/ObjectFactory.java new file mode 100644 index 0000000..5ec759e --- /dev/null +++ b/src/com/silverwrist/util/cache/ObjectFactory.java @@ -0,0 +1,41 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.util.cache; + +/** + * An interface which is used by ObjectCache to create new objects which match a specified + * key. An instance of an object implementing this interface must be specified to the constructor + * of ObjectFactory. + * + * @see ObjectCache#Constructor(com.silverwrist.util.cache.ObjectFactory) + * @see ObjectCache#getOrCreate(java.lang.Object) + */ +public interface ObjectFactory +{ + /** + * Creates a new instance of an object for the object cache. + * + * @param key The key value of the new object to be created. + * @return The new object instance. + * @exception com.silverwrist.util.cache.ObjectFactoryException An exception was thrown by the + * constructors and/or methods called by newObject; it is wrapped in this exception. + * @see ObjectCache#getOrCreate(java.lang.Object) + */ + public abstract Object newObject(Object key) throws ObjectFactoryException; + +} // end interface ObjectFactory diff --git a/src/com/silverwrist/util/cache/ObjectFactoryException.java b/src/com/silverwrist/util/cache/ObjectFactoryException.java new file mode 100644 index 0000000..e9900ad --- /dev/null +++ b/src/com/silverwrist/util/cache/ObjectFactoryException.java @@ -0,0 +1,126 @@ +/* + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at . + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT + * WARRANTY OF ANY KIND, either express or implied. See the License for the specific + * language governing rights and limitations under the License. + * + * The Original Code is the Venice Web Communities System. + * + * The Initial Developer of the Original Code is Eric J. Bowersox , + * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are + * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.util.cache; + +import java.io.PrintStream; +import java.io.PrintWriter; + +/** + * The exception which may be thrown by ObjectFactory.newObject, which wraps any exception + * that might be thrown by constructors or other method calls within the method. + * + * @author Eric J. Bowersox <erbo@silcom.com> + * @version X + * @see ObjectFactory#newObject(java.lang.Object) + */ +public class ObjectFactoryException extends Exception +{ + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + + private Throwable inner = null; // internal "root cause" exception + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + /** + * Creates a new ObjectFactoryException. + * + * @param t Exception being wrapped by this one. + */ + public ObjectFactoryException(Throwable t) + { + super("Error creating new object: " + t.getMessage()); + inner = t; + + } // end constructor + + /*-------------------------------------------------------------------------------- + * Overrides from class Throwable + *-------------------------------------------------------------------------------- + */ + + /** + * Prints this exception and its backtrace to the standard error stream. Also prints the backtrace + * of any "wrapped" exception. + * + * @see java.lang.System#err + */ + public void printStackTrace() + { + this.printStackTrace(System.err); + + } // end printStackTrace + + /** + * Prints this exception and its backtrace to the specified PrintStream. Also prints the + * backtrace of any "wrapped" exception. + * + * @param s PrintStream to use for output. + */ + public void printStackTrace(PrintStream s) + { + super.printStackTrace(s); + if (inner!=null) + { // print the inner stack trace + s.print("Root cause: "); + inner.printStackTrace(s); + + } // end if + + } // end printStackTrace + + /** + * Prints this exception and its backtrace to the specified PrintWriter. Also prints the + * backtrace of any "wrapped" exception. + * + * @param s PrintWriter to use for output. + */ + public void printStackTrace(PrintWriter s) + { + super.printStackTrace(s); + if (inner!=null) + { // print the inner stack trace + s.print("Root cause: "); + inner.printStackTrace(s); + + } // end if + + } // end printStackTrace + + /*-------------------------------------------------------------------------------- + * External operations + *-------------------------------------------------------------------------------- + */ + + /** + * Returns the exception wrapped by this exception, or null if there is none. + * + * @return See above. + */ + public Throwable getException() + { + return inner; + + } // end getException + +} // end class ObjectFactoryException diff --git a/src/com/silverwrist/util/rcache/ReferenceCache.java b/src/com/silverwrist/util/rcache/ReferenceCache.java deleted file mode 100644 index e310428..0000000 --- a/src/com/silverwrist/util/rcache/ReferenceCache.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * The contents of this file are subject to the Mozilla Public License Version 1.1 - * (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at . - * - * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT - * WARRANTY OF ANY KIND, either express or implied. See the License for the specific - * language governing rights and limitations under the License. - * - * The Original Code is the Venice Web Communities System. - * - * The Initial Developer of the Original Code is Eric J. Bowersox , - * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are - * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. - * - * Contributor(s): - */ -package com.silverwrist.util.rcache; - -import java.util.*; - -public class ReferenceCache -{ - /*-------------------------------------------------------------------------------- - * Attributes - *-------------------------------------------------------------------------------- - */ - - private HashMap the_data; - - /*-------------------------------------------------------------------------------- - * Constructor - *-------------------------------------------------------------------------------- - */ - - public ReferenceCache() - { - the_data = new HashMap(); - - } // end constructor - - /*-------------------------------------------------------------------------------- - * External operations - *-------------------------------------------------------------------------------- - */ - - public synchronized ReferencedData get(Object key) - { - ReferencedData rc = (ReferencedData)(the_data.get(key)); - if (rc!=null) - rc.rd_addRef(); - return rc; - - } // end get - - public synchronized ReferencedData getOrCreate(Object key, ReferencedDataBuilder builder) - throws ReferencedDataBuilderException - { - ReferencedData rc = (ReferencedData)(the_data.get(key)); - if (rc==null) - { // use the builder to build one - rc = builder.build(key); - if (rc!=null) - the_data.put(key,rc); - - } // end if - else // just add a reference - rc.rd_addRef(); - - return rc; - - } // end getOrCreate - - public void register(ReferencedData data) - { - Object key = data.rd_getKey(); - - synchronized (this) - { // see if it's in the cache, if not, add it - if (the_data.get(key)!=null) - throw new ReferenceCacheException("object already in cache",key); - - // dump it in the object cache - the_data.put(key,data); - - } // end synchronized block - - } // end register - - public synchronized void detach(Object key) - { - the_data.remove(key); - - } // end detach - - public void sweep() - { - int count = 0; - - synchronized (this) - { // bail out early if possible - if (the_data.size()==0) - return; - - // provide a storage bin for all keys we decide to 86 - Object keyzap[] = new Object[the_data.size()]; - Iterator it = the_data.values().iterator(); - - while (it.hasNext()) - { // check each value we contain in turn - ReferencedData rd = (ReferencedData)(it.next()); - if (rd.rd_unreferenced()) - keyzap[count++] = rd.rd_getKey(); - - } // end while - - for (int i=0; i0) - { // provide a storage bin for all keys we decide to 86 - Object keyzap[] = new Object[the_data.size()]; - Iterator it = the_data.values().iterator(); - - while (it.hasNext()) - { // check each value we contain in turn - ReferencedData rd = (ReferencedData)(it.next()); - if (rd.rd_unreferenced()) - keyzap[count++] = rd.rd_getKey(); - else - { // add another reference and tack it onto the list - rd.rd_addRef(); - rc.add(rd); - - } // end else - - } // end while - - for (int i=0; i. - * - * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT - * WARRANTY OF ANY KIND, either express or implied. See the License for the specific - * language governing rights and limitations under the License. - * - * The Original Code is the Venice Web Communities System. - * - * The Initial Developer of the Original Code is Eric J. Bowersox , - * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are - * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. - * - * Contributor(s): - */ -package com.silverwrist.util.rcache; - -public interface ReferencedData -{ - public abstract int rd_addRef(); - - public abstract int rd_release(); - - public abstract boolean rd_unreferenced(); - - public abstract Object rd_getKey(); - -} // end interface ReferencedData diff --git a/src/com/silverwrist/util/rcache/ReferencedDataBuilder.java b/src/com/silverwrist/util/rcache/ReferencedDataBuilder.java deleted file mode 100644 index 821db2f..0000000 --- a/src/com/silverwrist/util/rcache/ReferencedDataBuilder.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * The contents of this file are subject to the Mozilla Public License Version 1.1 - * (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at . - * - * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT - * WARRANTY OF ANY KIND, either express or implied. See the License for the specific - * language governing rights and limitations under the License. - * - * The Original Code is the Venice Web Communities System. - * - * The Initial Developer of the Original Code is Eric J. Bowersox , - * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are - * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. - * - * Contributor(s): - */ -package com.silverwrist.util.rcache; - -public interface ReferencedDataBuilder -{ - public abstract ReferencedData build(Object key) throws ReferencedDataBuilderException; - -} // end interface ReferencedDataBuilder diff --git a/src/com/silverwrist/util/rcache/ReferencedDataBuilderException.java b/src/com/silverwrist/util/rcache/ReferencedDataBuilderException.java deleted file mode 100644 index 36a978e..0000000 --- a/src/com/silverwrist/util/rcache/ReferencedDataBuilderException.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * The contents of this file are subject to the Mozilla Public License Version 1.1 - * (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at . - * - * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT - * WARRANTY OF ANY KIND, either express or implied. See the License for the specific - * language governing rights and limitations under the License. - * - * The Original Code is the Venice Web Communities System. - * - * The Initial Developer of the Original Code is Eric J. Bowersox , - * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are - * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. - * - * Contributor(s): - */ -package com.silverwrist.util.rcache; - -public class ReferencedDataBuilderException extends Exception -{ - /*-------------------------------------------------------------------------------- - * Attributes - *-------------------------------------------------------------------------------- - */ - - private Exception target; - - /*-------------------------------------------------------------------------------- - * Constructors - *-------------------------------------------------------------------------------- - */ - - public ReferencedDataBuilderException(Exception target) - { - super("Error building new object: " + target.getMessage()); - this.target = target; - - } // end constructor - - /*-------------------------------------------------------------------------------- - * External operations - *-------------------------------------------------------------------------------- - */ - - public Exception getTarget() - { - return target; - - } // end getTarget - -} // end class ReferencedDataBuilderException diff --git a/src/com/silverwrist/venice/core/InternalStateError.java b/src/com/silverwrist/venice/core/InternalStateError.java index 63ea1f2..8df7b6e 100644 --- a/src/com/silverwrist/venice/core/InternalStateError.java +++ b/src/com/silverwrist/venice/core/InternalStateError.java @@ -17,47 +17,134 @@ */ package com.silverwrist.venice.core; +import java.io.PrintStream; +import java.io.PrintWriter; + public class InternalStateError extends RuntimeException { - // Attributes - private Exception e = null; // internal "root cause" exception + /*-------------------------------------------------------------------------------- + * Attributes + *-------------------------------------------------------------------------------- + */ + private Throwable inner = null; // internal "root cause" exception + + /*-------------------------------------------------------------------------------- + * Constructors + *-------------------------------------------------------------------------------- + */ + + /** + * Constructs a new InternalStateError. + */ public InternalStateError() { super(); } // end constructor + /** + * Constructs a new InternalStateError with a text message. + * + * @param msg The message to set in this exception. + */ public InternalStateError(String msg) { super(msg); } // end constructor - public InternalStateError(Exception e) + /** + * Constructs a new InternalStateError wrapping another exception. + * + * @param inner The exception wrapped by this one. + */ + public InternalStateError(Throwable inner) { - super(e.getMessage()); - this.e = e; + super(inner.getMessage()); + this.inner = inner; } // end constructor - public InternalStateError(String msg, Exception e) + /** + * Constructs a new InternalStateError wrapping another exception. + * + * @param msg The message to set in this exception. + * @param inner The exception wrapped by this one. + */ + public InternalStateError(String msg, Throwable inner) { super(msg); - this.e = e; + this.inner = inner; } // end constructor - protected void finalize() throws Throwable - { - e = null; - super.finalize(); + /*-------------------------------------------------------------------------------- + * Overrides from class Throwable + *-------------------------------------------------------------------------------- + */ - } // end finalize - - public Exception getException() + /** + * Prints this exception and its backtrace to the standard error stream. Also prints the backtrace + * of any "wrapped" exception. + * + * @see java.lang.System#err + */ + public void printStackTrace() { - return e; + this.printStackTrace(System.err); + + } // end printStackTrace + + /** + * Prints this exception and its backtrace to the specified PrintStream. Also prints the + * backtrace of any "wrapped" exception. + * + * @param s PrintStream to use for output. + */ + public void printStackTrace(PrintStream s) + { + super.printStackTrace(s); + if (inner!=null) + { // print the inner stack trace + s.print("Root cause: "); + inner.printStackTrace(s); + + } // end if + + } // end printStackTrace + + /** + * Prints this exception and its backtrace to the specified PrintWriter. Also prints the + * backtrace of any "wrapped" exception. + * + * @param s PrintWriter to use for output. + */ + public void printStackTrace(PrintWriter s) + { + super.printStackTrace(s); + if (inner!=null) + { // print the inner stack trace + s.print("Root cause: "); + inner.printStackTrace(s); + + } // end if + + } // end printStackTrace + + /*-------------------------------------------------------------------------------- + * External operations + *-------------------------------------------------------------------------------- + */ + + /** + * Returns the exception wrapped by this exception, or null if there is none. + * + * @return See above. + */ + public Throwable getException() + { + return inner; } // end getException diff --git a/src/com/silverwrist/venice/core/impl/BackgroundCommunityPurge.java b/src/com/silverwrist/venice/core/impl/BackgroundCommunityPurge.java index ae8e981..1fd1fa9 100644 --- a/src/com/silverwrist/venice/core/impl/BackgroundCommunityPurge.java +++ b/src/com/silverwrist/venice/core/impl/BackgroundCommunityPurge.java @@ -21,7 +21,7 @@ import java.sql.*; import java.util.*; import org.apache.log4j.*; import com.silverwrist.util.ParallelRunQueue; -import com.silverwrist.util.rcache.ReferenceCache; +import com.silverwrist.util.cache.ObjectCache; import com.silverwrist.venice.db.*; import com.silverwrist.venice.core.DataException; import com.silverwrist.venice.core.InternalStateError; @@ -46,7 +46,7 @@ class BackgroundCommunityPurge implements Runnable private int cid; private int num_confs; private int max_confid; - private ReferenceCache conf_refcache; + private ObjectCache conf_objcache; /*-------------------------------------------------------------------------------- * Constructor @@ -54,7 +54,7 @@ class BackgroundCommunityPurge implements Runnable */ BackgroundCommunityPurge(EngineBackend engine, DataPool datapool, UserBackend user, int cid, int num_confs, - int max_confid, ReferenceCache conf_refcache) + int max_confid, ObjectCache conf_objcache) { this.engine = engine; this.datapool = datapool; @@ -62,7 +62,7 @@ class BackgroundCommunityPurge implements Runnable this.cid = cid; this.num_confs = num_confs; this.max_confid = max_confid; - this.conf_refcache = conf_refcache; + this.conf_objcache = conf_objcache; } // end constructor @@ -102,12 +102,11 @@ class BackgroundCommunityPurge implements Runnable for (int i=0; i