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