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 2017/03/21 09:50:02 UTC

svn commit: r1787922 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/file/PriorityCache.java test/java/org/apache/jackrabbit/oak/segment/file/PriorityCacheTest.java

Author: mduerig
Date: Tue Mar 21 09:50:02 2017
New Revision: 1787922

URL: http://svn.apache.org/viewvc?rev=1787922&view=rev
Log:
OAK-5952: Wrong eviction count reported by PriorityCache statistics
Test case and clarified implementation

Modified:
    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/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=1787922&r1=1787921&r2=1787922&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 Tue Mar 21 09:50:02 2017
@@ -208,6 +208,7 @@ public class PriorityCache<K, V> {
             if (entry == Entry.NULL) {
                 // Empty slot -> use this index
                 index = i;
+                eviction = false;
                 break;
             } else if (entry.generation <= generation && key.equals(entry.key)) {
                 // Key exists and generation is greater or equal -> use this index and boost the cost
@@ -216,10 +217,12 @@ public class PriorityCache<K, V> {
                 if (initialCost < Byte.MAX_VALUE) {
                     initialCost++;
                 }
+                eviction = false;
                 break;
             } else if (entry.generation < generation) {
                 // Old generation -> use this index
                 index = i;
+                eviction = false;
                 break;
             } else if (entry.cost < cheapest) {
                 // Candidate slot, keep on searching for even cheaper slots

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=1787922&r1=1787921&r2=1787922&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 Tue Mar 21 09:50:02 2017
@@ -26,7 +26,11 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
+import java.util.Random;
+
 import com.google.common.base.Predicate;
+import com.google.common.cache.Weigher;
+import org.apache.jackrabbit.oak.segment.CacheWeights;
 import org.junit.Test;
 
 public class PriorityCacheTest {
@@ -163,4 +167,19 @@ public class PriorityCacheTest {
         assertEquals(2147483648L, PriorityCache.nextPowerOfTwo(Integer.MAX_VALUE));
     }
 
+    @Test
+    public void evictionCount() {
+        Random rnd = new Random();
+        Weigher<String, Integer> weigher = CacheWeights.noopWeigher();
+        PriorityCache<String, Integer> cache = new PriorityCache<>(128, 2, weigher);
+        int count = 0;
+        for (int b = Byte.MIN_VALUE; b <= Byte.MAX_VALUE; b++) {
+            if (cache.put("k-" + b + "-" + rnd.nextInt(1000), b, 0, (byte) b)) {
+                count++;
+            }
+        }
+
+        assertEquals(count, cache.size() + cache.getStats().evictionCount());
+    }
+
 }