You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2013/03/04 15:31:27 UTC

svn commit: r1452326 - in /jackrabbit/oak/trunk/oak-mongomk/src: main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java

Author: thomasm
Date: Mon Mar  4 14:31:26 2013
New Revision: 1452326

URL: http://svn.apache.org/r1452326
Log:
OAK-619 Lock-free MongoMK implementation (bugfixes)

Modified:
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java?rev=1452326&r1=1452325&r2=1452326&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java Mon Mar  4 14:31:26 2013
@@ -156,6 +156,7 @@ public class Commit {
                     for (UpdateOp op : newNodes) {
                         op.unset(UpdateOp.ID);
                         op.addMapEntry(UpdateOp.DELETED + "." + revision.toString(), "false");
+                        op.increment(UpdateOp.WRITE_COUNT, 1);
                         createOrUpdateNode(store, op);
                     }
                 }

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java?rev=1452326&r1=1452325&r2=1452326&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java Mon Mar  4 14:31:26 2013
@@ -38,6 +38,8 @@ import org.apache.jackrabbit.mk.json.Jso
 import org.apache.jackrabbit.mongomk.impl.blob.MongoBlobStore;
 import org.apache.jackrabbit.mongomk.prototype.Node.Children;
 import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.mongodb.DB;
 
@@ -46,6 +48,8 @@ import com.mongodb.DB;
  */
 public class MongoMK implements MicroKernel {
     
+    private static final Logger LOG = LoggerFactory.getLogger(MongoMK.class);
+    
     /**
      * The delay for asynchronous operations (delayed commit propagation and
      * cache update).
@@ -637,19 +641,41 @@ public class MongoMK implements MicroKer
 
         private static final long serialVersionUID = 1L;
         private int size;
+        private TreeSet<K> keySet = new TreeSet<K>();
 
         Cache(int size) {
             super(size, (float) 0.75, true);
             this.size = size;
         }
+        
+        public synchronized V put(K key, V value) {
+            keySet.add(key);
+            return super.put(key, value);
+        }
+        
+        public synchronized V remove(Object key) {
+            keySet.remove(key);
+            return super.remove(key);
+        }
 
-        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
-            return size() > size;
+        protected synchronized boolean removeEldestEntry(Map.Entry<K, V> eldest) {
+            boolean remove = size() > size;
+            if (remove) {
+                Object k = eldest.getKey();
+                if (k != null) {
+                    keySet.remove(k);
+                }
+            }
+            return remove;
         }
         
         public String toString() {
             return super.toString().replace(',', '\n');
         }
+        
+        // public synchronized SortedSet<K> subSet(K fromElement, K toElement) {
+        //   return keySet.subSet(fromElement, toElement);
+        // }
 
     }
 
@@ -706,7 +732,11 @@ public class MongoMK implements MicroKer
             set.addAll(added);
             c2.children.addAll(set);
             if (nodeChildrenCache.get(id) != null) {
-                throw new AssertionError("New child list already cached");
+                // TODO should not happend, 
+                // probably a problem with add/delete/add
+                MicroKernelException e = new MicroKernelException(
+                        "New child list already cached for id " + id);
+                LOG.error("Error updating the cache", e);
             }
             nodeChildrenCache.put(id, c2);
         }

Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java?rev=1452326&r1=1452325&r2=1452326&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java Mon Mar  4 14:31:26 2013
@@ -98,7 +98,18 @@ public class SimpleTest {
         assertEquals("{\"name\":\"Hallo\",\":childNodeCount\":0}", test);
         mk.dispose();
     }
-    
+
+    @Test
+    public void reAddDeleted2() {
+        MongoMK mk = createMK();
+        String rev = mk.commit("/", "+\"test\":{\"child\": {}}", null, null);
+        rev = mk.commit("/", "-\"test\"", rev, null);
+        rev = mk.commit("/", "+\"test\":{}", null, null);
+        String test = mk.getNodes("/test", rev, 0, 0, Integer.MAX_VALUE, null);
+        assertEquals("{\":childNodeCount\":0}", test);
+        mk.dispose();
+    }
+
     @Test
     public void escapePropertyName() {
         MongoMK mk = createMK();