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());
+ }
+
}