[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