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 md...@apache.org on 2016/09/12 16:03:43 UTC

svn commit: r1760400 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/ main/java/org/apache/jackrabbit/oak/segment/file/ test/java/org/apache/jackrabbit/oak/segment/file/

Author: mduerig
Date: Mon Sep 12 16:03:43 2016
New Revision: 1760400

URL: http://svn.apache.org/viewvc?rev=1760400&view=rev
Log:
OAK-4635: Improve cache eviction policy of the node deduplication cache
Pro-actively purge old generations from the node deduplication cache to help Java gc

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PriorityCache.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/PriorityCacheTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java?rev=1760400&r1=1760399&r2=1760400&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java Mon Sep 12 16:03:43 2016
@@ -366,7 +366,7 @@ public abstract class WriterCacheManager
         protected final void evictCaches(Predicate<Integer> generations) {
             stringCaches.evictGenerations(generations);
             templateCaches.evictGenerations(generations);
-            // FIXME OAK-4635: evict old generations from node cache
+            nodeCache.get().purgeGenerations(generations);
         }
     }
 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PriorityCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PriorityCache.java?rev=1760400&r1=1760399&r2=1760400&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PriorityCache.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PriorityCache.java Mon Sep 12 16:03:43 2016
@@ -27,6 +27,7 @@ import static java.util.Arrays.fill;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
+import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
 import com.google.common.cache.CacheStats;
 
@@ -224,6 +225,21 @@ public class PriorityCache<K, V> {
         return null;
     }
 
+    /**
+     * Purge all keys from this cache whose entry's generation matches the
+     * passed {@code purge} predicate.
+     * @param purge
+     */
+    public synchronized void purgeGenerations(@Nonnull Predicate<Integer> purge) {
+        for (int i = 0; i < entries.length; i++) {
+            Entry<?, ?> entry = entries[i];
+            if (entry != Entry.NULL && purge.apply(entry.generation)) {
+                entries[i] = Entry.NULL;
+                size--;
+            }
+        }
+    }
+
     @Override
     public synchronized String toString() {
         return "PriorityCache" +

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/PriorityCacheTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/PriorityCacheTest.java?rev=1760400&r1=1760399&r2=1760400&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/PriorityCacheTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/PriorityCacheTest.java Mon Sep 12 16:03:43 2016
@@ -24,7 +24,9 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
 
+import com.google.common.base.Predicate;
 import org.junit.Test;
 
 public class PriorityCacheTest {
@@ -125,4 +127,27 @@ public class PriorityCacheTest {
         assertTrue(cache.put("two", 2, 1, (byte) 0));
     }
 
+    @Test
+    public void generationPurge() {
+        PriorityCache<String, Integer> cache = new PriorityCache<String, Integer>(65536);
+
+        for (int gen = 4; gen >= 0; gen--) {
+            // Backward iteration avoids earlier generations are replaced with later ones
+            for (int k = 0; k < 100; k++) {
+                if (!cache.put("key-" + gen + "-" + k, 0, gen, (byte) 0)) {
+                    assumeTrue("All test keys are in the cache", false);
+                }
+            }
+        }
+
+        assertEquals(500, cache.size());
+        cache.purgeGenerations(new Predicate<Integer>() {
+            @Override
+            public boolean apply(Integer generation) {
+                return generation <= 2;
+            }
+        });
+        assertEquals(200, cache.size());
+    }
+
 }