You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2006/11/01 11:50:23 UTC

svn commit: r469853 - /jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java

Author: tripod
Date: Wed Nov  1 02:50:23 2006
New Revision: 469853

URL: http://svn.apache.org/viewvc?view=rev&rev=469853
Log:
[JCR-614] Weird locking behaviour in CachingHierarchyManager

Modified:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java?view=diff&rev=469853&r1=469852&r2=469853
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java Wed Nov  1 02:50:23 2006
@@ -30,14 +30,15 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.ItemNotFoundException;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+
 /**
  * Implementation of a <code>HierarchyManager</code> that caches paths of
  * items.
@@ -465,7 +466,19 @@
                 return;
             }
             if (idCache.size() >= upperLimit) {
-                removeLRU();
+                /**
+                 * Remove least recently used item. Scans the LRU list from head to tail
+                 * and removes the first item that has no children.
+                 */
+                LRUEntry entry = head;
+                while (entry != null) {
+                    PathMap.Element element = entry.getElement();
+                    if (element.getChildrenCount() == 0) {
+                        evict(entry, true);
+                        return;
+                    }
+                    entry = entry.getNext();
+                }
             }
 
             PathMap.Element element = pathCache.put(path);
@@ -481,24 +494,6 @@
     }
 
     /**
-     * Remove least recently used item. Scans the LRU list from head to tail
-     * and removes the first item that has no children.
-     */
-    private void removeLRU() {
-        synchronized (cacheMonitor) {
-            LRUEntry entry = head;
-            while (entry != null) {
-                PathMap.Element element = entry.getElement();
-                if (element.getChildrenCount() == 0) {
-                    evict(entry, true);
-                    return;
-                }
-                entry = entry.getNext();
-            }
-        }
-    }
-
-    /**
      * Return a flag indicating whether a certain element is cached.
      *
      * @param id item id
@@ -534,15 +529,14 @@
      * @param removeFromPathCache whether to remove from path cache
      */
     private void remove(LRUEntry entry, boolean removeFromPathCache) {
-        synchronized (cacheMonitor) {
-            if (removeFromPathCache) {
-                PathMap.Element element = entry.getElement();
-                remove(element);
-                element.remove();
-            } else {
-                idCache.remove(entry.getId());
-                entry.remove();
-            }
+        // assert: synchronized (cacheMonitor)
+        if (removeFromPathCache) {
+            PathMap.Element element = entry.getElement();
+            remove(element);
+            element.remove();
+        } else {
+            idCache.remove(entry.getId());
+            entry.remove();
         }
     }
 
@@ -554,19 +548,18 @@
      * @param removeFromPathCache whether to remove from path cache
      */
     private void evict(LRUEntry entry, boolean removeFromPathCache) {
-        synchronized (cacheMonitor) {
-            if (removeFromPathCache) {
-                PathMap.Element element = entry.getElement();
-                element.traverse(new PathMap.ElementVisitor() {
-                    public void elementVisited(PathMap.Element element) {
-                        evict((LRUEntry) element.get(), false);
-                    }
-                }, false);
-                element.remove(false);
-            } else {
-                idCache.remove(entry.getId());
-                entry.remove();
-            }
+        // assert: synchronized (cacheMonitor)
+        if (removeFromPathCache) {
+            PathMap.Element element = entry.getElement();
+            element.traverse(new PathMap.ElementVisitor() {
+                public void elementVisited(PathMap.Element element) {
+                    evict((LRUEntry) element.get(), false);
+                }
+            }, false);
+            element.remove(false);
+        } else {
+            idCache.remove(entry.getId());
+            entry.remove();
         }
     }
 
@@ -594,13 +587,12 @@
      * @param element path map element
      */
     private void remove(PathMap.Element element) {
-        synchronized (cacheMonitor) {
-            element.traverse(new PathMap.ElementVisitor() {
-                public void elementVisited(PathMap.Element element) {
-                    remove((LRUEntry) element.get(), false);
-                }
-            }, false);
-        }
+        // assert: synchronized (cacheMonitor)
+        element.traverse(new PathMap.ElementVisitor() {
+            public void elementVisited(PathMap.Element element) {
+                remove((LRUEntry) element.get(), false);
+            }
+        }, false);
     }
 
     /**