[infinispan-commits] Infinispan SVN: r282 - in trunk/core/src: main/java/org/infinispan/container/entries and 1 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Wed May 13 10:18:00 EDT 2009


Author: manik.surtani at jboss.com
Date: 2009-05-13 10:18:00 -0400 (Wed, 13 May 2009)
New Revision: 282

Modified:
   trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java
   trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java
   trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java
   trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java
Log:
More accurate atomic hash maps

Modified: trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java	2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMap.java	2009-05-13 14:18:00 UTC (rev 282)
@@ -46,6 +46,7 @@
    FastCopyHashMap<K, V> delegate;
    private AtomicHashMapDelta delta = null;
    private volatile AtomicHashMapProxy proxy;
+   volatile boolean copied = false;
 
    /**
     * Construction only allowed through this factory method.  This factory is intended for use internally by the
@@ -62,8 +63,14 @@
       delegate = new FastCopyHashMap<K, V>();
    }
 
+   public AtomicHashMap(boolean isCopy) {
+      this();
+      copied = isCopy;
+   }
+
    public void commit() {
-      if (delta != null) delta = null;
+      copied = false;
+      delta = null;
    }
 
    public int size() {
@@ -107,7 +114,7 @@
 
    public V remove(Object key) {
       V oldValue = delegate.remove(key);
-      RemoveOperation<K, V> op = new RemoveOperation<K, V>((K)key, oldValue);
+      RemoveOperation<K, V> op = new RemoveOperation<K, V>((K) key, oldValue);
       getDelta().addOperation(op);
       return oldValue;
    }
@@ -120,7 +127,7 @@
    public void clear() {
       FastCopyHashMap<K, V> originalEntries = (FastCopyHashMap<K, V>) delegate.clone();
       ClearOperation<K, V> op = new ClearOperation<K, V>(originalEntries);
-      if (delta!= null ) delta.addOperation(op);
+      if (delta != null) delta.addOperation(op);
       delegate.clear();
    }
 
@@ -148,6 +155,7 @@
          AtomicHashMap clone = (AtomicHashMap) super.clone();
          clone.delegate = (FastCopyHashMap) delegate.clone();
          clone.proxy = proxy;
+         clone.copied = true;
          return clone;
       }
       catch (CloneNotSupportedException e) {

Modified: trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java	2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/main/java/org/infinispan/atomic/AtomicHashMapProxy.java	2009-05-13 14:18:00 UTC (rev 282)
@@ -22,9 +22,9 @@
 package org.infinispan.atomic;
 
 import org.infinispan.Cache;
-import org.infinispan.atomic.AtomicMap;
 import org.infinispan.batch.AutoBatchSupport;
 import org.infinispan.batch.BatchContainer;
+import org.infinispan.container.entries.CacheEntry;
 import org.infinispan.context.Flag;
 import org.infinispan.context.InvocationContext;
 import org.infinispan.context.InvocationContextContainer;
@@ -61,8 +61,12 @@
    }
 
    private AtomicHashMap<K, V> getDeltaMapForWrite(InvocationContext ctx) {
-      if (ctx.hasLockedKey(deltaMapKey)) {
-         return (AtomicHashMap<K, V>) cache.get(deltaMapKey);
+      CacheEntry lookedUpEntry = ctx.lookupEntry(deltaMapKey);
+      boolean lockedAndCopied = lookedUpEntry != null && lookedUpEntry.isChanged() &&
+            ((AtomicHashMap) lookedUpEntry.getValue()).copied;
+
+      if (lockedAndCopied) {
+         return getDeltaMapForRead();
       } else {
          // acquire WL
          boolean suppressLocks = ctx.hasFlag(Flag.SKIP_LOCKING);
@@ -77,7 +81,7 @@
 
          AtomicHashMap map = getDeltaMapForRead();
          // copy for write
-         AtomicHashMap copy = map == null ? new AtomicHashMap() : map.copyForWrite();
+         AtomicHashMap copy = map == null ? new AtomicHashMap(true) : map.copyForWrite();
          copy.initForWriting();
          // reinstate the flag
          if (suppressLocks) ctx.setFlags(Flag.SKIP_LOCKING);

Modified: trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java	2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java	2009-05-13 14:18:00 UTC (rev 282)
@@ -21,6 +21,7 @@
  */
 package org.infinispan.container.entries;
 
+import org.infinispan.atomic.AtomicHashMap;
 import org.infinispan.container.DataContainer;
 import static org.infinispan.container.entries.ReadCommittedEntry.Flags.*;
 import org.infinispan.util.logging.Log;
@@ -150,6 +151,10 @@
          if (trace)
             log.trace("Updating entry (key={0} removed={1} valid={2} changed={3} created={4} value={5}]", getKey(),
                       isRemoved(), isValid(), isChanged(), isCreated(), value);
+
+         // Ugh!
+         if (value instanceof AtomicHashMap) ((AtomicHashMap) value).commit();
+
          if (isRemoved()) {
             container.remove(key);
          } else {

Modified: trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java	2009-05-13 13:58:20 UTC (rev 281)
+++ trunk/core/src/test/java/org/infinispan/atomic/AtomicHashMapTest.java	2009-05-13 14:18:00 UTC (rev 282)
@@ -25,8 +25,6 @@
 
 import org.easymock.EasyMock;
 import org.testng.annotations.Test;
-import org.infinispan.atomic.AtomicHashMap;
-import org.infinispan.atomic.AtomicHashMapDelta;
 
 import java.io.IOException;
 import java.io.ObjectOutput;




More information about the infinispan-commits mailing list