[infinispan-commits] Infinispan SVN: r2223 - in trunk/core/src: test/java/org/infinispan/loaders and 1 other directory.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Mon Aug 16 07:52:28 EDT 2010


Author: galder.zamarreno at jboss.com
Date: 2010-08-16 07:52:27 -0400 (Mon, 16 Aug 2010)
New Revision: 2223

Modified:
   trunk/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java
   trunk/core/src/test/java/org/infinispan/loaders/CacheLoaderFunctionalTest.java
Log:
[ISPN-601] (Second transactional read on a key with FORCE_WRITE_LOCK and cache store leads to NullPointerException) Added check for FORCE_WRITE_LOCK and whether lock was already held.

Modified: trunk/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java	2010-08-16 09:14:07 UTC (rev 2222)
+++ trunk/core/src/main/java/org/infinispan/container/EntryFactoryImpl.java	2010-08-16 11:52:27 UTC (rev 2223)
@@ -117,7 +117,7 @@
       if (cacheEntry != null) // exists in context!  Just acquire lock if needed, and wrap.
       {
          if (trace) log.trace("Exists in context.");
-         // acquire lock if needed
+         // Acquire lock if needed. Add necessary check for skip locking in advance in order to avoid marshalled value issues
          if (alreadyLocked || ctx.hasFlag(Flag.SKIP_LOCKING) || acquireLock(ctx, key)) {
 
             if (cacheEntry instanceof MVCCEntry && (!forRemoval || !(cacheEntry instanceof NullMarkerEntry))) {
@@ -131,6 +131,11 @@
 
             // create a copy of the underlying entry
             mvccEntry.copyForUpdate(container, writeSkewCheck);
+         } else if (ctx.hasFlag(Flag.FORCE_WRITE_LOCK)) {
+            // If lock was already held and force write lock is on, just wrap
+            if (cacheEntry instanceof MVCCEntry && (!forRemoval || !(cacheEntry instanceof NullMarkerEntry))) {
+               mvccEntry = (MVCCEntry) cacheEntry;
+            }
          }
 
          if (cacheEntry.isRemoved() && createIfAbsent && undeleteIfNeeded) {

Modified: trunk/core/src/test/java/org/infinispan/loaders/CacheLoaderFunctionalTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/loaders/CacheLoaderFunctionalTest.java	2010-08-16 09:14:07 UTC (rev 2222)
+++ trunk/core/src/test/java/org/infinispan/loaders/CacheLoaderFunctionalTest.java	2010-08-16 11:52:27 UTC (rev 2223)
@@ -432,4 +432,19 @@
       advancedCache.put("k-" + name, "v-" + name);
       advancedCache.withFlags(Flag.SKIP_LOCKING).put("k-" + name, "v2-" + name);
    }
+
+   public void testDuplicatePersistence(Method m) throws Exception {
+      String key = "k-" + m.getName();
+      String value = "v-" + m.getName();
+      cache.put(key, value);
+      assert value.equals(cache.get(key));
+      cache.stop();
+      cache.start();
+      tm.begin();
+      cache.containsKey(key); // Necessary call to force locks being acquired in advance
+      cache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK).get(key);
+      cache.put(key, value);
+      tm.commit();
+      assert value.equals(cache.get(key));
+   }
 }



More information about the infinispan-commits mailing list