[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