[infinispan-commits] Infinispan SVN: r2504 - in trunk/core/src: test/java/org/infinispan/atomic and 1 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Tue Oct 12 05:56:31 EDT 2010
Author: galder.zamarreno at jboss.com
Date: 2010-10-12 05:56:31 -0400 (Tue, 12 Oct 2010)
New Revision: 2504
Added:
trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapPassivationTest.java
Modified:
trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java
trunk/core/src/test/java/org/infinispan/loaders/dummy/DummyInMemoryCacheStore.java
Log:
ISPN-662 - ClassCastException when accessing passivated atomic map - Merged fix from 4.2.x (rev 2503)
Modified: trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java 2010-10-12 09:54:20 UTC (rev 2503)
+++ trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java 2010-10-12 09:56:31 UTC (rev 2504)
@@ -28,6 +28,7 @@
import org.infinispan.context.Flag;
import org.infinispan.context.InvocationContext;
import org.infinispan.context.InvocationContextContainer;
+import org.infinispan.marshall.MarshalledValue;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
@@ -68,15 +69,20 @@
this.icc = icc;
}
+ private AtomicHashMap<K, V> toMap(Object object) {
+ Object map = (object instanceof MarshalledValue) ? ((MarshalledValue) object).get() : object;
+ return (AtomicHashMap<K, V>) map;
+ }
+
// internal helper, reduces lots of casts.
private AtomicHashMap<K, V> getDeltaMapForRead() {
- return (AtomicHashMap<K, V>) cache.get(deltaMapKey);
+ return toMap(cache.get(deltaMapKey));
}
private AtomicHashMap<K, V> getDeltaMapForWrite(InvocationContext ctx) {
CacheEntry lookedUpEntry = ctx.lookupEntry(deltaMapKey);
boolean lockedAndCopied = lookedUpEntry != null && lookedUpEntry.isChanged() &&
- ((AtomicHashMap) lookedUpEntry.getValue()).copied;
+ toMap(lookedUpEntry.getValue()).copied;
if (lockedAndCopied) {
return getDeltaMapForRead();
Copied: trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapPassivationTest.java (from rev 2503, branches/4.2.x/core/src/test/java/org/infinispan/atomic/AtomicHashMapPassivationTest.java)
===================================================================
--- trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapPassivationTest.java (rev 0)
+++ trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapPassivationTest.java 2010-10-12 09:56:31 UTC (rev 2504)
@@ -0,0 +1,83 @@
+package org.infinispan.atomic;
+
+import org.infinispan.config.CacheLoaderManagerConfig;
+import org.infinispan.config.Configuration;
+import org.infinispan.container.entries.InternalCacheEntry;
+import org.infinispan.loaders.CacheLoaderException;
+import org.infinispan.loaders.CacheLoaderManager;
+import org.infinispan.loaders.CacheStore;
+import org.infinispan.loaders.dummy.DummyInMemoryCacheStore;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.infinispan.test.SingleCacheManagerTest;
+import org.infinispan.test.TestingUtil;
+import org.infinispan.test.fwk.TestCacheManagerFactory;
+import org.testng.annotations.Test;
+
+import javax.transaction.TransactionManager;
+import java.lang.reflect.Method;
+
+/**
+ * Tests passivation of atomic hash map instances.
+ *
+ * @author Galder Zamarreño
+ * @since 4.2
+ */
+ at Test(groups = "functional", testName = "atomic.AtomicHashMapPassivationTest")
+public class AtomicHashMapPassivationTest extends SingleCacheManagerTest {
+
+ CacheStore store;
+
+ @Override
+ protected EmbeddedCacheManager createCacheManager() throws Exception {
+ Configuration c = getDefaultStandaloneConfig(true);
+ c.setInvocationBatchingEnabled(true);
+ c.setUseLazyDeserialization(true);
+ CacheLoaderManagerConfig clmc = new CacheLoaderManagerConfig();
+ clmc.setPassivation(true);
+ clmc.addCacheLoaderConfig(new DummyInMemoryCacheStore.Cfg());
+ c.setCacheLoaderManagerConfig(clmc);
+ EmbeddedCacheManager cm = TestCacheManagerFactory.createCacheManager(c, true);
+ cache = cm.getCache();
+ store = TestingUtil.extractComponent(cache, CacheLoaderManager.class).getCacheStore();
+ return cm;
+ }
+
+ public void testPassivateAndUpdate(Method m) throws Exception {
+ String key = "k-" + m.getName();
+ TransactionManager tm = TestingUtil.getTransactionManager(cache);
+ tm.begin();
+ AtomicMap<String, String> map = AtomicMapLookup.getAtomicMap(cache, key);
+ assert map.isEmpty();
+ map.put("a", "b");
+ assert map.get("a").equals("b");
+ tm.commit();
+ assertInCacheNotInStore(key);
+
+ cache.evict(key);
+ assertInStoreNotInCache(key);
+
+ tm.begin();
+ map = AtomicMapLookup.getAtomicMap(cache, key);
+ map.put("a", "c");
+ map.put("d", "e");
+ tm.commit();
+ }
+
+ private void assertInCacheNotInStore(Object key) throws CacheLoaderException {
+ InternalCacheEntry se = cache.getAdvancedCache().getDataContainer().get(key);
+ testStoredEntry(se, key, "Cache");
+ assert !store.containsKey(key) : "Key " + key + " should not be in store!";
+ }
+
+ private void testStoredEntry(InternalCacheEntry entry, Object key, String src) {
+ assert entry != null : src + " entry for key " + key + " should NOT be null";
+ }
+
+ private void assertInStoreNotInCache(Object key) throws CacheLoaderException {
+ InternalCacheEntry se = store.load(key);
+ testStoredEntry(se, key, "Store");
+ assert !cache.getAdvancedCache().getDataContainer().containsKey(key) : "Key " + key + " should not be in cache!";
+ }
+
+
+}
Modified: trunk/core/src/test/java/org/infinispan/loaders/dummy/DummyInMemoryCacheStore.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/loaders/dummy/DummyInMemoryCacheStore.java 2010-10-12 09:54:20 UTC (rev 2503)
+++ trunk/core/src/test/java/org/infinispan/loaders/dummy/DummyInMemoryCacheStore.java 2010-10-12 09:56:31 UTC (rev 2504)
@@ -65,8 +65,13 @@
}
public boolean remove(Object key) {
- if (trace) log.trace("Remove {0} from dummy store", key);
- return store.remove(key) != null;
+ if (store.remove(key) != null) {
+ if (trace) log.trace("Removed {0} from dummy store", key);
+ return true;
+ }
+
+ if (trace) log.trace("Key {0} not present in store, so don't remove", key);
+ return false;
}
protected void purgeInternal() throws CacheLoaderException {
@@ -152,6 +157,10 @@
}
}
+ public boolean isEmpty() {
+ return store.isEmpty();
+ }
+
public static class Cfg extends AbstractCacheStoreConfig {
private static final long serialVersionUID = 4258914047690999424L;
More information about the infinispan-commits
mailing list