Author: mduerig
Date: Wed Jul 20 12:38:02 2016
New Revision: 1753495

URL: http://svn.apache.org/viewvc?rev=1753495&view=rev
Log:
OAK-4451: Implement a proper template cache
OAK-4474: Finalise SegmentCache
Consistently use a weigher for elements in the LIRS caches backing the 
SegmentCache and the ReaderCache

Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ReaderCache.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/StringCache.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/TemplateCache.java

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ReaderCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ReaderCache.java?rev=1753495&r1=1753494&r2=1753495&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ReaderCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ReaderCache.java
 Wed Jul 20 12:38:02 2016
@@ -37,6 +37,15 @@ import org.apache.jackrabbit.oak.cache.E
  * on an array, and a slow one uses a LIRS cache.
  */
 public abstract class ReaderCache<T> {
+
+    @Nonnull
+    private final Weigher<CacheKey<T>, T> weigher = new Weigher<CacheKey<T>, 
T>() {
+        @Override
+        public int weigh(CacheKey<T> key, T value) {
+            return getEntryWeight(value);
+        }
+    };
+
     @Nonnull
     private final String name;
 
@@ -55,35 +64,34 @@ public abstract class ReaderCache<T> {
     /**
      * Create a new string cache.
      *
-     * @param maxSize the maximum memory in bytes.
+     * @param maxWeight the maximum memory in bytes.
+     * @param averageWeight  an estimate for the average weight of the 
elements in the
+     *                       cache. See {@link 
CacheLIRS#setAverageMemory(int)}.
      */
-    protected ReaderCache(long maxSize, @Nonnull String name) {
+    protected ReaderCache(long maxWeight, int averageWeight, @Nonnull String 
name) {
         this.name = checkNotNull(name);
-        if (maxSize >= 0) {
+        if (maxWeight >= 0) {
             fastCache = new FastCache<>();
             cache = CacheLIRS.<CacheKey<T>, T>newBuilder()
                     .module(name)
-                    .maximumWeight(maxSize)
-                    .averageWeight(250)
+                    .maximumWeight(maxWeight)
+                    .averageWeight(averageWeight)
+                    .weigher(weigher)
                     .build();
         } else {
             fastCache = null;
             // dummy cache to prevent NPE on the getStats() call
             cache = CacheLIRS.<CacheKey<T>, T> newBuilder()
                     .module(name)
-                    .maximumSize(1)
+                    .maximumWeight(1)
+                    .averageWeight(averageWeight)
+                    .weigher(weigher)
                     .build();
         }
     }
 
     @Nonnull
     public CacheStats getStats() {
-        Weigher<?, ?> weigher = new Weigher<CacheKey<T>, T>() {
-            @Override
-            public int weigh(CacheKey<T> key, T value) {
-                return getEntryWeight(value);
-            }
-        };
         return new CacheStats(cache, name, weigher, cache.getMaxMemory());
     }
 
@@ -121,7 +129,7 @@ public abstract class ReaderCache<T> {
         if (value == null) {
             value = loader.apply(offset);
             assert value != null;
-            cache.put(key, value, getEntryWeight(value));
+            cache.put(key, value);
         }
         if (isSmall(value)) {
             fastCache.put(hash, new FastCacheEntry<>(hash, msb, lsb, offset, 
value));

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java?rev=1753495&r1=1753494&r2=1753495&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java
 Wed Jul 20 12:38:02 2016
@@ -39,6 +39,13 @@ import com.google.common.cache.RemovalCa
 public class SegmentCache {
     private static final Logger LOG = 
LoggerFactory.getLogger(SegmentCache.class);
 
+    private final Weigher<SegmentId, Segment> weigher = new Weigher<SegmentId, 
Segment>() {
+        @Override
+        public int weigh(SegmentId id, Segment segment) {
+            return 224 + segment.size();
+        }
+    };
+
     /**
      * Cache of recently accessed segments
      */
@@ -49,7 +56,8 @@ public class SegmentCache {
         this.cache = CacheLIRS.<SegmentId, Segment>newBuilder()
             .module("SegmentCache")
             .maximumWeight(cacheSizeMB * 1024 * 1024)
-            .averageWeight(Segment.MAX_SEGMENT_SIZE/2)
+            .averageWeight(Segment.MAX_SEGMENT_SIZE / 2)
+            .weigher(weigher)
             .evictionCallback(new EvictionCallback<SegmentId, Segment>() {
                 @Override
                 public void evicted(SegmentId id, Segment segment, 
RemovalCause cause) {
@@ -67,7 +75,7 @@ public class SegmentCache {
     }
 
     public void putSegment(@Nonnull Segment segment) {
-        cache.put(segment.getSegmentId(), segment, segment.size());
+        cache.put(segment.getSegmentId(), segment);
         segment.getSegmentId().loaded(segment);
     }
 
@@ -77,12 +85,6 @@ public class SegmentCache {
 
     @Nonnull
     public CacheStats getCacheStats() {
-        Weigher<?, ?> weigher = new Weigher<SegmentId, Segment>() {
-            @Override
-            public int weigh(SegmentId key, Segment segment) {
-                return segment.size();
-            }
-        };
         return new CacheStats(cache, "Segment Cache", weigher, 
cache.getMaxMemory());
     }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/StringCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/StringCache.java?rev=1753495&r1=1753494&r2=1753495&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/StringCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/StringCache.java
 Wed Jul 20 12:38:02 2016
@@ -33,7 +33,7 @@ public class StringCache extends ReaderC
      * @param maxSize the maximum memory in bytes.
      */
     StringCache(long maxSize) {
-        super(maxSize, "String Cache");
+        super(maxSize, 250, "String Cache");
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/TemplateCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/TemplateCache.java?rev=1753495&r1=1753494&r2=1753495&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/TemplateCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/TemplateCache.java
 Wed Jul 20 12:38:02 2016
@@ -32,7 +32,7 @@ public class TemplateCache extends Reade
      * @param maxSize the maximum memory in bytes.
      */
     TemplateCache(long maxSize) {
-        super(maxSize, "Template Cache");
+        super(maxSize, 250, "Template Cache");
     }
 
     @Override


Reply via email to