Author: tomekr
Date: Thu Apr 21 12:05:55 2016
New Revision: 1740287

URL: http://svn.apache.org/viewvc?rev=1740287&view=rev
Log:
OAK-4266: NodeDocumentCache#get method should be synchronized

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java?rev=1740287&r1=1740286&r2=1740287&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
 Thu Apr 21 12:05:55 2016
@@ -134,6 +134,10 @@ public class NodeDocumentCache implement
     /**
      * Return the document matching given key, optionally loading it from an
      * external source.
+     * <p>
+     * This method can modify the cache, so it's synchronized. The {@link 
#getIfPresent(String)}
+     * is not synchronized and will be faster if you need to get the cached 
value
+     * outside the critical section.
      *
      * @see Cache#get(Object, Callable)
      * @param key document key
@@ -143,10 +147,15 @@ public class NodeDocumentCache implement
     @Nonnull
     public NodeDocument get(@Nonnull String key, @Nonnull 
Callable<NodeDocument> valueLoader)
             throws ExecutionException {
-        if (isLeafPreviousDocId(key)) {
-            return prevDocumentsCache.get(new StringValue(key), valueLoader);
-        } else {
-            return nodeDocumentsCache.get(new StringValue(key), valueLoader);
+        Lock lock = locks.acquire(key);
+        try {
+            if (isLeafPreviousDocId(key)) {
+                return prevDocumentsCache.get(new StringValue(key), 
valueLoader);
+            } else {
+                return nodeDocumentsCache.get(new StringValue(key), 
valueLoader);
+            }
+        } finally {
+            lock.unlock();
         }
     }
 


Reply via email to