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


Reply via email to