JBoss Cache SVN: r7826 - core/branches/flat/src/main/java/org/horizon/loader/bdbje.
by jbosscache-commits@lists.jboss.org
Author: adriancole
Date: 2009-03-02 14:04:28 -0500 (Mon, 02 Mar 2009)
New Revision: 7826
Modified:
core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
Log:
clearing all entries and loading from input is severe, but normal behaviour. degrading log to info
Modified: core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 19:02:09 UTC (rev 7825)
+++ core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 19:04:28 UTC (rev 7826)
@@ -498,7 +498,7 @@
*/
public void fromStream(ObjectInput ois) throws CacheLoaderException {
checkOpen();
- log.warn("Clearing all entries and loading from input");
+ log.info("Clearing all entries and loading from input");
try {
long recordCount = ois.readLong();
log.info("reading {0} records from stream", recordCount);
15 years, 10 months
JBoss Cache SVN: r7825 - core/branches/flat/src/main/java/org/horizon/loader/bdbje.
by jbosscache-commits@lists.jboss.org
Author: adriancole
Date: 2009-03-02 14:02:09 -0500 (Mon, 02 Mar 2009)
New Revision: 7825
Modified:
core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
Log:
commit/abort without prepare is expected, moving logging to trace
Modified: core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 18:59:01 UTC (rev 7824)
+++ core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 19:02:09 UTC (rev 7825)
@@ -365,7 +365,7 @@
completeTransaction(txn, commit);
}
} else {
- log.error("no sleepycat transaction associated transaction {0}", tx);
+ if (trace) log.trace("no sleepycat transaction associated transaction {0}", tx);
}
}
15 years, 10 months
JBoss Cache SVN: r7824 - core/branches/flat/src/main/java/org/horizon/loader/bdbje.
by jbosscache-commits@lists.jboss.org
Author: adriancole
Date: 2009-03-02 13:59:01 -0500 (Mon, 02 Mar 2009)
New Revision: 7824
Modified:
core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
Log:
guarding trace logging
Modified: core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 18:52:30 UTC (rev 7823)
+++ core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 18:59:01 UTC (rev 7824)
@@ -58,6 +58,7 @@
public class BdbjeCacheStore extends AbstractCacheStore {
private static final Log log = LogFactory.getLog(BdbjeCacheStore.class);
+ private static final boolean trace = log.isTraceEnabled();
private BdbjeCacheStoreConfig cfg;
private Cache cache;
@@ -81,7 +82,7 @@
* @see BdbjeCacheStoreConfig
*/
public void init(CacheLoaderConfig config, Cache cache, Marshaller m) {
- log.trace("initializing BdbjeCacheStore");
+ if (trace) log.trace("initializing BdbjeCacheStore");
printLicense();
this.cfg = (BdbjeCacheStoreConfig) config;
this.cache = cache;
@@ -104,7 +105,7 @@
* transactional services are instantiated.
*/
public void start() throws CacheLoaderException {
- log.trace("starting BdbjeCacheStore");
+ if (trace) log.trace("starting BdbjeCacheStore");
checkNotOpen();
if (cache == null) {
@@ -155,7 +156,7 @@
envConfig.setConfigParam("je.txn.deadlockStackTrace", "true");
envConfig.setConfigParam("je.txn.dumpLocks", "true");
}
- log.trace("creating je environment with home dir {0}", location);
+ if (trace) log.trace("creating je environment with home dir {0}", location);
env = new Environment(location, envConfig);
log.debug("created je environment {0} for cache store {1}", env, this);
/* Open cache and catalog databases. */
@@ -178,17 +179,17 @@
* associated} with the stored entry and class catalog databases.
*/
private void openDatabases() throws DatabaseException {
- log.trace("opening databases");
+ if (trace) log.trace("opening databases");
/* Use a generic database config, with no duplicates allowed. */
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setTransactional(true);
dbConfig.setAllowCreate(true);
- log.trace("opening or creating stored entry database {0}", cacheDbName);
+ if (trace) log.trace("opening or creating stored entry database {0}", cacheDbName);
cacheDb = env.openDatabase(null, cacheDbName, dbConfig);
log.debug("opened stored entry database {0}", cacheDbName);
- log.trace("opening or creating class catalog database {0}", catalogDbName);
+ if (trace) log.trace("opening or creating class catalog database {0}", catalogDbName);
Database catalogDb = env.openDatabase(null, catalogDbName, dbConfig);
catalog = new StoredClassCatalog(catalogDb);
log.debug("created stored class catalog from database {0}", catalogDbName);
@@ -223,7 +224,7 @@
* not removed from the file system. Exceptions during close are ignored.
*/
private void closeDatabases() {
- log.trace("closing databases");
+ if (trace) log.trace("closing databases");
try {
cacheDb.close();
catalog.close();
@@ -243,7 +244,7 @@
*/
public void stop() throws CacheLoaderException {
checkOpen();
- log.trace("stopping BdbjeCacheStore");
+ if (trace) log.trace("stopping BdbjeCacheStore");
transactionRunner = null;
currentTransaction = null;
txnMap = null;
@@ -307,7 +308,7 @@
try {
transactionRunner.prepare(new ModificationsTransactionWorker(this, mods));
Transaction txn = currentTransaction.getTransaction();
- log.trace("transaction {0} == sleepycat transaction {1}", tx, txn);
+ if (trace) log.trace("transaction {0} == sleepycat transaction {1}", tx, txn);
txnMap.put(tx, txn);
ReflectionUtil.setValue(currentTransaction, "localTrans", new ThreadLocal());
} catch (Exception e) {
@@ -410,7 +411,7 @@
public boolean remove(Object key) throws CacheLoaderException {
checkOpen();
checkNonNull(key, "key");
- log.trace("Removing key {0}", key);
+ if (trace) log.trace("Removing key {0}", key);
try {
if (cacheMap.containsKey(key)) {
cacheMap.remove(key);
@@ -430,7 +431,7 @@
public StoredEntry load(Object key) throws CacheLoaderException {
checkOpen();
checkNonNull(key, "key");
- log.trace("Loading key {0}", key);
+ if (trace) log.trace("Loading key {0}", key);
try {
StoredEntry s = cacheMap.get(key);
if (s == null)
@@ -452,7 +453,7 @@
public void store(StoredEntry ed) throws CacheLoaderException {
checkOpen();
checkNonNull(ed, "entry");
- log.trace("Storing entry {0}", ed);
+ if (trace) log.trace("Storing entry {0}", ed);
try {
cacheMap.put(ed.getKey(), ed);
} catch (Exception caught) {
@@ -466,7 +467,7 @@
*/
public void clear() throws CacheLoaderException {
checkOpen();
- log.trace("Clearing store");
+ if (trace) log.trace("Clearing store");
try {cacheMap.clear(); } catch (Exception caught) {
caught = ExceptionUnwrapper.unwrap(caught);
throw new CacheLoaderException("error clearing store", caught);
@@ -478,7 +479,7 @@
*/
public Set<StoredEntry> loadAll() throws CacheLoaderException {
checkOpen();
- log.trace("Loading all entries");
+ if (trace) log.trace("Loading all entries");
try {
return new HashSet(cacheMap.values());
} catch (Exception caught) {
@@ -537,7 +538,7 @@
*/
public void toStream(ObjectOutput oos) throws CacheLoaderException {
checkOpen();
- log.trace("dumping current database to outputstream");
+ if (trace) log.trace("dumping current database to outputstream");
Cursor cursor = null;
try {
currentTransaction.beginTransaction(null);
15 years, 10 months
JBoss Cache SVN: r7823 - in core/branches/flat/src: test/java/org/horizon/loader/bdbje and 1 other directory.
by jbosscache-commits@lists.jboss.org
Author: adriancole
Date: 2009-03-02 13:52:30 -0500 (Mon, 02 Mar 2009)
New Revision: 7823
Modified:
core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java
core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java
Log:
changed location to be consistent with FileCacheStore
Modified: core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java 2009-03-02 18:47:12 UTC (rev 7822)
+++ core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java 2009-03-02 18:52:30 UTC (rev 7823)
@@ -6,8 +6,8 @@
* Configures {@link org.horizon.loader.bdbje.BdbjeCacheStore}. This allows you to tune a number of characteristics of
* the {@link BdbjeCacheStore}.
* <p/>
- * <ul> <li><tt>location</tt> - a location on disk where the store can write databases. This defaults to
- * <tt>${java.io.tmpdir}</tt></li> <li><tt>purgeSynchronously</tt> - whether {@link
+ * <ul> <li><tt>location</tt> - a location on disk where the store can write internal files. This defaults to
+ * <tt>Horizon-BdbjeCacheStore</tt> in the current working directory.</li> <li><tt>purgeSynchronously</tt> - whether {@link
* org.horizon.loader.CacheStore#purgeExpired()} calls happen synchronously or not. By default, this is set to
* <tt>false</tt>.</li> <li><tt>lockAcquistionTimeout</tt> - the length of time, in milliseconds, to wait for locks
* before timing out and throwing an exception. By default, this is set to <tt>60000</tt>.</li>
@@ -19,7 +19,7 @@
* @since 1.0
*/
public class BdbjeCacheStoreConfig extends AbstractCacheLoaderConfig {
- private String location = System.getProperty("java.io.tmpdir");
+ private String location = "Horizon-BdbjeCacheStore";
private boolean purgeSynchronously;
private long lockAcquistionTimeout = 60 * 1000;
private int maxTxRetries = 5;
Modified: core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java 2009-03-02 18:47:12 UTC (rev 7822)
+++ core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java 2009-03-02 18:52:30 UTC (rev 7823)
@@ -56,6 +56,11 @@
}
@Test
+ public void testGetLocationDefault() {
+ assert config.getLocation().equals("Horizon-BdbjeCacheStore");
+ }
+
+ @Test
public void testSetLocation() {
config.setLocation("foo");
assert config.getLocation().equals("foo");
15 years, 10 months
JBoss Cache SVN: r7822 - in core/branches/flat/src: test/java/org/horizon/loader/bdbje and 1 other directory.
by jbosscache-commits@lists.jboss.org
Author: adriancole
Date: 2009-03-02 13:47:12 -0500 (Mon, 02 Mar 2009)
New Revision: 7822
Modified:
core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java
core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java
Log:
switched lock duration from micro to nanoseconds
Modified: core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 12:32:06 UTC (rev 7821)
+++ core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 18:47:12 UTC (rev 7822)
@@ -41,7 +41,7 @@
* <p/>
* <p/>
* All data access is transactional. Any attempted reads to locked records will block. The maximum duration of this is
- * set in microseconds via the parameter {@link org.horizon.loader.bdbje.BdbjeCacheStoreConfig#getLockAcquistionTimeoutMicros()}.
+ * set in nanoseconds via the parameter {@link org.horizon.loader.bdbje.BdbjeCacheStoreConfig#getLockAcquistionTimeout()}.
* Calls to {@link BdbjeCacheStore#prepare(java.util.List, javax.transaction.Transaction, boolean) prepare} will attempt
* to resolve deadlocks, retrying up to {@link org.horizon.loader.bdbje.BdbjeCacheStoreConfig#getMaxTxRetries()}
* attempts.
@@ -149,7 +149,8 @@
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
envConfig.setTransactional(true);
- envConfig.setLockTimeout(cfg.getLockAcquistionTimeoutMicros());
+ /* lock timeout is in microseconds */
+ envConfig.setLockTimeout(cfg.getLockAcquistionTimeout() * 1000);
if (log.isDebugEnabled()) {
envConfig.setConfigParam("je.txn.deadlockStackTrace", "true");
envConfig.setConfigParam("je.txn.dumpLocks", "true");
Modified: core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java 2009-03-02 12:32:06 UTC (rev 7821)
+++ core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfig.java 2009-03-02 18:47:12 UTC (rev 7822)
@@ -9,8 +9,8 @@
* <ul> <li><tt>location</tt> - a location on disk where the store can write databases. This defaults to
* <tt>${java.io.tmpdir}</tt></li> <li><tt>purgeSynchronously</tt> - whether {@link
* org.horizon.loader.CacheStore#purgeExpired()} calls happen synchronously or not. By default, this is set to
- * <tt>false</tt>.</li> <li><tt>lockAcquistionTimeoutMicros</tt> - the length of time, in microseconds, to wait for
- * locks before timing out and throwing an exception. By default, this is set to <tt>60000000</tt>.</li>
+ * <tt>false</tt>.</li> <li><tt>lockAcquistionTimeout</tt> - the length of time, in milliseconds, to wait for locks
+ * before timing out and throwing an exception. By default, this is set to <tt>60000</tt>.</li>
* <li><tt>maxTxRetries</tt> - the number of times transaction prepares will attempt to resolve a deadlock before
* throwing an exception. By default, this is set to <tt>5</tt>.</li> </ul>
*
@@ -21,7 +21,7 @@
public class BdbjeCacheStoreConfig extends AbstractCacheLoaderConfig {
private String location = System.getProperty("java.io.tmpdir");
private boolean purgeSynchronously;
- private long lockAcquistionTimeoutMicros = 60 * 1000 * 1000;
+ private long lockAcquistionTimeout = 60 * 1000;
private int maxTxRetries = 5;
@@ -38,12 +38,12 @@
}
- public long getLockAcquistionTimeoutMicros() {
- return lockAcquistionTimeoutMicros;
+ public long getLockAcquistionTimeout() {
+ return lockAcquistionTimeout;
}
- public void setLockAcquistionTimeoutMicros(long lockAcquistionTimeoutMicros) {
- this.lockAcquistionTimeoutMicros = lockAcquistionTimeoutMicros;
+ public void setLockAcquistionTimeout(long lockAcquistionTimeout) {
+ this.lockAcquistionTimeout = lockAcquistionTimeout;
}
public String getLocation() {
Modified: core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java 2009-03-02 12:32:06 UTC (rev 7821)
+++ core/branches/flat/src/test/java/org/horizon/loader/bdbje/BdbjeCacheStoreConfigTest.java 2009-03-02 18:47:12 UTC (rev 7822)
@@ -45,14 +45,14 @@
}
@Test
- public void testGetLockAcquistionTimeoutMicros() {
- assert config.getLockAcquistionTimeoutMicros() == 60 * 1000 * 1000;
+ public void testGetLockAcquistionTimeout() {
+ assert config.getLockAcquistionTimeout() == 60 * 1000;
}
@Test
public void testSetLockAcquistionTimeoutMicros() {
- config.setLockAcquistionTimeoutMicros(1);
- assert config.getLockAcquistionTimeoutMicros() == 1;
+ config.setLockAcquistionTimeout(1);
+ assert config.getLockAcquistionTimeout() == 1;
}
@Test
15 years, 10 months
JBoss Cache SVN: r7821 - core/trunk/src/main/java/org/jboss/cache/statetransfer.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2009-03-02 07:32:06 -0500 (Mon, 02 Mar 2009)
New Revision: 7821
Modified:
core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java
Log:
Log guarding
Modified: core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java 2009-03-02 11:16:48 UTC (rev 7820)
+++ core/trunk/src/main/java/org/jboss/cache/statetransfer/DefaultStateTransferIntegrator.java 2009-03-02 12:32:06 UTC (rev 7821)
@@ -216,7 +216,7 @@
while (object instanceof LogEntry)
{
List<WriteCommand> mods = ((LogEntry)object).getModifications();
- log.trace("Mods = " + mods);
+ if (trace) log.trace("Mods = " + mods);
for (WriteCommand mod : mods)
{
InvocationContext ctx = container.get();
15 years, 10 months
JBoss Cache SVN: r7820 - core/branches/flat/src/main/java/org/horizon/loader/bdbje.
by jbosscache-commits@lists.jboss.org
Author: adriancole
Date: 2009-03-02 06:16:48 -0500 (Mon, 02 Mar 2009)
New Revision: 7820
Modified:
core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
Log:
refactored to use AbstractCacheStore
Modified: core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 10:47:32 UTC (rev 7819)
+++ core/branches/flat/src/main/java/org/horizon/loader/bdbje/BdbjeCacheStore.java 2009-03-02 11:16:48 UTC (rev 7820)
@@ -8,12 +8,11 @@
import com.sleepycat.je.*;
import com.sleepycat.util.ExceptionUnwrapper;
import org.horizon.Cache;
+import org.horizon.loader.AbstractCacheStore;
import org.horizon.loader.CacheLoaderConfig;
import org.horizon.loader.CacheLoaderException;
-import org.horizon.loader.CacheStore;
import org.horizon.loader.StoredEntry;
import org.horizon.loader.modifications.Modification;
-import org.horizon.loader.modifications.Remove;
import org.horizon.logging.Log;
import org.horizon.logging.LogFactory;
import org.horizon.marshall.Marshaller;
@@ -23,7 +22,6 @@
import java.io.File;
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -57,7 +55,7 @@
* @version $Id: $
* @since 1.0
*/
-public class BdbjeCacheStore implements CacheStore {
+public class BdbjeCacheStore extends AbstractCacheStore {
private static final Log log = LogFactory.getLog(BdbjeCacheStore.class);
@@ -261,12 +259,12 @@
}
/**
- * {@inheritDoc} delegates to {@link BdbjeCacheStore#onePhaseCommit(java.util.List)}, if <code>isOnePhase</code>.
+ * {@inheritDoc} delegates to {@link BdbjeCacheStore#applyModifications(java.util.List)}, if <code>isOnePhase</code>.
* Otherwise, delegates to {@link BdbjeCacheStore#prepare(java.util.List, javax.transaction.Transaction) prepare}.
*/
public void prepare(List<? extends Modification> mods, javax.transaction.Transaction tx, boolean isOnePhase) throws CacheLoaderException {
if (isOnePhase) {
- onePhaseCommit(mods);
+ applyModifications(mods);
} else {
prepare(mods, tx);
}
@@ -279,7 +277,8 @@
* @param mods actions to perform atomically
* @throws CacheLoaderException on problems during the transaction
*/
- protected void onePhaseCommit(List<? extends Modification> mods) throws CacheLoaderException {
+ @Override
+ protected void applyModifications(List<? extends Modification> mods) throws CacheLoaderException {
checkOpen();
checkNonNull(mods, "modifications");
log.debug("performing one phase transaction");
@@ -405,14 +404,6 @@
}
/**
- * {@inheritDoc} This implementation delegates to {@link BdbjeCacheStore#load(Object)}, to ensure that a response is
- * returned only if the entry is not expired.
- */
- public boolean containsKey(Object key) throws CacheLoaderException {
- return load(key) != null;
- }
-
- /**
* {@inheritDoc} This implementation delegates to {@link StoredMap#remove(Object)}
*/
public boolean remove(Object key) throws CacheLoaderException {
@@ -432,20 +423,6 @@
}
/**
- * {@inheritDoc} This implementation removes the <code>keys</code> atomically by creating a list of {@link Remove}
- * modifications and passing that to {@link BdbjeCacheStore#onePhaseCommit(java.util.List)}.
- */
- public void removeAll(Set<Object> keys) throws CacheLoaderException {
- checkOpen();
- checkNonNull(keys, "keys");
- List<Remove> toRemove = new ArrayList<Remove>();
- for (Object key : keys) {
- toRemove.add(new Remove(key));
- }
- onePhaseCommit(toRemove);
- }
-
- /**
* {@inheritDoc} This implementation delegates to {@link StoredMap#get(Object)}. If the object is expired, it will
* not be returned.
*/
15 years, 10 months
JBoss Cache SVN: r7819 - core/branches/flat/src/main/java/org/horizon/loader.
by jbosscache-commits@lists.jboss.org
Author: adriancole
Date: 2009-03-02 05:47:32 -0500 (Mon, 02 Mar 2009)
New Revision: 7819
Modified:
core/branches/flat/src/main/java/org/horizon/loader/AbstractCacheLoader.java
Log:
updated javadoc
Modified: core/branches/flat/src/main/java/org/horizon/loader/AbstractCacheLoader.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/AbstractCacheLoader.java 2009-03-02 10:33:55 UTC (rev 7818)
+++ core/branches/flat/src/main/java/org/horizon/loader/AbstractCacheLoader.java 2009-03-02 10:47:32 UTC (rev 7819)
@@ -8,6 +8,10 @@
*/
public abstract class AbstractCacheLoader implements CacheLoader {
+ /**
+ * {@inheritDoc} This implementation delegates to {@link CacheLoader#load(Object)}, to ensure that a response is
+ * returned only if the entry is not expired.
+ */
public boolean containsKey(Object key) throws CacheLoaderException {
return load(key) != null;
}
15 years, 10 months