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/07/20 20:48:51 UTC

svn commit: r1753607 - 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/ test/java/org/apache/jackrabbit/oak/segment...

Author: mduerig
Date: Wed Jul 20 20:48:51 2016
New Revision: 1753607

URL: http://svn.apache.org/viewvc?rev=1753607&view=rev
Log:
OAK-4451: Implement a proper template cache
OAK-4474: Finalise SegmentCache
Refactor cache size configurations

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.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/SegmentNodeStoreService.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/JournalEntryTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfPropertiesTestIT.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/SegmentReferenceLimitTestIT.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java Wed Jul 20 20:48:51 2016
@@ -20,7 +20,6 @@
 package org.apache.jackrabbit.oak.segment;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static java.lang.Long.getLong;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -38,10 +37,7 @@ import org.apache.jackrabbit.oak.spi.sta
  */
 public class CachingSegmentReader implements SegmentReader {
     public static final int DEFAULT_STRING_CACHE_MB = 256;
-    public static final String STRING_CACHE_MB = "oak.segment.stringCacheMB";
-
     public static final int DEFAULT_TEMPLATE_CACHE_MB = 64;
-    public static final String TEMPLATE_CACHE_MB = "oak.segment.templateCacheMB";
 
     @Nonnull
     private final Supplier<SegmentWriter> writer;
@@ -78,8 +74,8 @@ public class CachingSegmentReader implem
             long templateCacheMB) {
         this.writer = checkNotNull(writer);
         this.blobStore = blobStore;
-        stringCache = new StringCache(getLong(STRING_CACHE_MB, stringCacheMB) * 1024 * 1024);
-        templateCache = new TemplateCache(getLong(TEMPLATE_CACHE_MB, templateCacheMB * 1024 * 1024));
+        stringCache = new StringCache(stringCacheMB * 1024 * 1024);
+        templateCache = new TemplateCache(templateCacheMB * 1024 * 1024);
     }
 
     /**

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=1753607&r1=1753606&r2=1753607&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 20:48:51 2016
@@ -24,6 +24,7 @@ import java.util.concurrent.ExecutionExc
 
 import javax.annotation.Nonnull;
 
+import com.google.common.cache.RemovalCause;
 import com.google.common.cache.Weigher;
 import org.apache.jackrabbit.oak.cache.CacheLIRS;
 import org.apache.jackrabbit.oak.cache.CacheLIRS.EvictionCallback;
@@ -31,8 +32,6 @@ import org.apache.jackrabbit.oak.cache.C
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.cache.RemovalCause;
-
 // FIXME OAK-4474: Finalise SegmentCache: document, add monitoring, management, tests, logging
 /**
  * A cache for {@link Segment} instances by their {@link SegmentId}.
@@ -50,6 +49,8 @@ import com.google.common.cache.RemovalCa
 public class SegmentCache {
     private static final Logger LOG = LoggerFactory.getLogger(SegmentCache.class);
 
+    public static final int DEFAULT_SEGMENT_CACHE_MB = 256;
+
     private final Weigher<SegmentId, Segment> weigher = new Weigher<SegmentId, Segment>() {
         @Override
         public int weigh(SegmentId id, Segment segment) {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java Wed Jul 20 20:48:51 2016
@@ -135,10 +135,24 @@ public class SegmentNodeStoreService ext
 
     @Property(
             intValue = 256,
-            label = "Cache size (MB)",
-            description = "Cache size for storing most recently used Segments"
+            label = "Segment cache size (MB)",
+            description = "Cache size for storing most recently used segments"
     )
-    public static final String CACHE = "cache";
+    public static final String SEGMENT_CACHE_SIZE = "segmentCache.size";
+
+    @Property(
+            intValue = 256,
+            label = "String cache size (MB)",
+            description = "Cache size for storing most recently used strings"
+    )
+    public static final String STRING_CACHE_SIZE = "stringCache.size";
+
+    @Property(
+            intValue = 64,
+            label = "Template cache size (MB)",
+            description = "Cache size for storing most recently used templates"
+    )
+    public static final String TEMPLATE_CACHE_SIZE = "templateCache.size";
 
     @Property(
             byteValue = MEMORY_THRESHOLD_DEFAULT,
@@ -335,7 +349,9 @@ public class SegmentNodeStoreService ext
 
         // Build the FileStore
         FileStoreBuilder builder = fileStoreBuilder(getDirectory())
-                .withCacheSize(getCacheSize())
+                .withSegmentCacheSize(getSegmentCacheSize())
+                .withStringCacheSize(getStringCacheSize())
+                .withTemplateCacheSize(getTemplateCacheSize())
                 .withMaxFileSize(getMaxFileSize())
                 .withMemoryMapping(getMode().equals("64"))
                 .withGCMonitor(gcMonitor)
@@ -608,18 +624,26 @@ public class SegmentNodeStoreService ext
         return System.getProperty(MODE, System.getProperty("sun.arch.data.model", "32"));
     }
 
-    private String getCacheSizeProperty() {
-        String cache = property(CACHE);
+    private String getCacheSize(String propertyName) {
+        String cacheSize = property(propertyName);
 
-        if (cache != null) {
-            return cache;
+        if (cacheSize != null) {
+            return cacheSize;
         }
 
-        return System.getProperty(CACHE);
+        return System.getProperty(propertyName);
+    }
+
+    private int getSegmentCacheSize() {
+        return Integer.parseInt(getCacheSize(SEGMENT_CACHE_SIZE));
+    }
+
+    private int getStringCacheSize() {
+        return Integer.parseInt(getCacheSize(STRING_CACHE_SIZE));
     }
 
-    private int getCacheSize() {
-        return Integer.parseInt(getCacheSizeProperty());
+    private int getTemplateCacheSize() {
+        return Integer.parseInt(getCacheSize(TEMPLATE_CACHE_SIZE));
     }
 
     private String getMaxFileSizeProperty() {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java Wed Jul 20 20:48:51 2016
@@ -36,8 +36,6 @@ import static java.util.concurrent.TimeU
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
 import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
-import static org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_STRING_CACHE_MB;
-import static org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_TEMPLATE_CACHE_MB;
 import static org.apache.jackrabbit.oak.segment.SegmentId.isDataSegmentId;
 import static org.apache.jackrabbit.oak.segment.SegmentWriterBuilder.segmentWriterBuilder;
 import static org.apache.jackrabbit.oak.segment.file.GCListener.Status.FAILURE;
@@ -238,16 +236,9 @@ public class FileStore implements Segmen
         this.revisions = builder.getRevisions();
         this.blobStore = builder.getBlobStore();
 
-        // FIXME OAK-4451 refactor cache size configurations
         // FIXME OAK-4277: Finalise de-duplication caches: inject caches
         // from the outside so we can get rid of the cache stat accessors
-        if (builder.getCacheSize() < 0) {
-            this.segmentCache = new SegmentCache(0);
-        } else if (builder.getCacheSize() > 0) {
-            this.segmentCache = new SegmentCache(builder.getCacheSize());
-        } else {
-            this.segmentCache = new SegmentCache(DEFAULT_STRING_CACHE_MB);
-        }
+        this.segmentCache = new SegmentCache(builder.getSegmentCacheSize());
         Supplier<SegmentWriter> getWriter = new Supplier<SegmentWriter>() {
             @Override
             public SegmentWriter get() {
@@ -255,18 +246,10 @@ public class FileStore implements Segmen
             }
         };
 
-        // FIXME OAK-4451 refactor cache size configurations
         // FIXME OAK-4451: Implement a proper template cache: inject caches
         // from the outside so we can get rid of the cache stat accessors
-        if (builder.getCacheSize() < 0) {
-            this.segmentReader = new CachingSegmentReader(getWriter, blobStore, 0, 0);
-        } else if (builder.getCacheSize() > 0) {
-            this.segmentReader = new CachingSegmentReader(getWriter, blobStore,
-                    (long) builder.getCacheSize(), (long) builder.getCacheSize());
-        } else {
-            this.segmentReader = new CachingSegmentReader(getWriter, blobStore,
-                    (long) DEFAULT_STRING_CACHE_MB, (long) DEFAULT_TEMPLATE_CACHE_MB);
-        }
+        this.segmentReader = new CachingSegmentReader(getWriter, blobStore,
+                builder.getStringCacheSize(), builder.getTemplateCacheSize());
 
         Supplier<Integer> getGeneration = new Supplier<Integer>() {
             @Override

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java Wed Jul 20 20:48:51 2016
@@ -21,7 +21,9 @@ package org.apache.jackrabbit.oak.segmen
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
-import static java.util.Collections.singleton;
+import static org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_STRING_CACHE_MB;
+import static org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_TEMPLATE_CACHE_MB;
+import static org.apache.jackrabbit.oak.segment.SegmentCache.DEFAULT_SEGMENT_CACHE_MB;
 import static org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.defaultGCOptions;
 
 import java.io.File;
@@ -56,7 +58,11 @@ public class FileStoreBuilder {
 
     private int maxFileSize = 256;
 
-    private int cacheSize;   // 0 -> DEFAULT_MEMORY_CACHE_SIZE
+    private int segmentCacheSize = DEFAULT_SEGMENT_CACHE_MB;
+
+    private int stringCacheSize = DEFAULT_STRING_CACHE_MB;
+
+    private int templateCacheSize = DEFAULT_TEMPLATE_CACHE_MB;
 
     private boolean memoryMapping;
 
@@ -176,23 +182,35 @@ public class FileStoreBuilder {
     }
 
     /**
-     * Size of the cache in MB.
-     * @param cacheSize
+     * Size of the segment cache in MB.
+     * @param segmentCacheSize  None negative cache size
      * @return this instance
      */
     @Nonnull
-    public FileStoreBuilder withCacheSize(int cacheSize) {
-        this.cacheSize = cacheSize;
+    public FileStoreBuilder withSegmentCacheSize(int segmentCacheSize) {
+        this.segmentCacheSize = segmentCacheSize;
         return this;
     }
 
     /**
-     * Turn caching off
+     * Size of the string cache in MB.
+     * @param stringCacheSize  None negative cache size
      * @return this instance
      */
     @Nonnull
-    public FileStoreBuilder withNoCache() {
-        this.cacheSize = -1;
+    public FileStoreBuilder withStringCacheSize(int stringCacheSize) {
+        this.stringCacheSize = stringCacheSize;
+        return this;
+    }
+
+    /**
+     * Size of the template cache in MB.
+     * @param templateCacheSize  None negative cache size
+     * @return this instance
+     */
+    @Nonnull
+    public FileStoreBuilder withTemplateCacheSize(int templateCacheSize) {
+        this.templateCacheSize = templateCacheSize;
         return this;
     }
 
@@ -314,8 +332,16 @@ public class FileStoreBuilder {
         return maxFileSize;
     }
 
-    int getCacheSize() {
-        return cacheSize;
+    int getSegmentCacheSize() {
+        return segmentCacheSize;
+    }
+
+    int getStringCacheSize() {
+        return stringCacheSize;
+    }
+
+    int getTemplateCacheSize() {
+        return templateCacheSize;
     }
 
     boolean getMemoryMapping() {
@@ -354,7 +380,9 @@ public class FileStoreBuilder {
                 "directory=" + directory +
                 ", blobStore=" + blobStore +
                 ", maxFileSize=" + maxFileSize +
-                ", cacheSize=" + cacheSize +
+                ", segmentCacheSize=" + segmentCacheSize +
+                ", stringCacheSize=" + stringCacheSize +
+                ", templateCacheSize=" + templateCacheSize +
                 ", memoryMapping=" + memoryMapping +
                 ", gcOptions=" + gcOptions +
                 '}';

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java Wed Jul 20 20:48:51 2016
@@ -102,7 +102,6 @@ public class SegmentDataStoreBlobGCIT {
             FileStoreBuilder builder = fileStoreBuilder(getWorkDir())
                     .withBlobStore(blobStore)
                     .withMaxFileSize(256)
-                    .withCacheSize(64)
                     .withMemoryMapping(false)
                     .withGCOptions(gcOptions);
             store = builder.build();

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/JournalEntryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/JournalEntryTest.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/JournalEntryTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/JournalEntryTest.java Wed Jul 20 20:48:51 2016
@@ -46,8 +46,13 @@ public class JournalEntryTest {
 
     @Test
     public void timestampInJournalEntry() throws Exception{
-        FileStore fileStore = fileStoreBuilder(tempFolder.getRoot()).withMaxFileSize(5)
-                .withNoCache().withMemoryMapping(true).build();
+        FileStore fileStore = fileStoreBuilder(tempFolder.getRoot())
+                .withMaxFileSize(5)
+                .withSegmentCacheSize(0)
+                .withStringCacheSize(0)
+                .withTemplateCacheSize(0)
+                .withMemoryMapping(true)
+                .build();
 
         SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build();
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfPropertiesTestIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfPropertiesTestIT.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfPropertiesTestIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfPropertiesTestIT.java Wed Jul 20 20:48:51 2016
@@ -69,8 +69,13 @@ public class LargeNumberOfPropertiesTest
 
     @Test
     public void corruption() throws Exception {
-        FileStore fileStore = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(5)
-                .withNoCache().withMemoryMapping(true).build();
+        FileStore fileStore = fileStoreBuilder(getFileStoreFolder())
+                .withMaxFileSize(5)
+                .withSegmentCacheSize(0)
+                .withStringCacheSize(0)
+                .withTemplateCacheSize(0)
+                .withMemoryMapping(true)
+                .build();
         SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build();
 
         NodeBuilder root = nodeStore.getRoot().builder();

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/SegmentReferenceLimitTestIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/SegmentReferenceLimitTestIT.java?rev=1753607&r1=1753606&r2=1753607&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/SegmentReferenceLimitTestIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/SegmentReferenceLimitTestIT.java Wed Jul 20 20:48:51 2016
@@ -76,8 +76,13 @@ public class SegmentReferenceLimitTestIT
 
     @Test
     public void corruption() throws IOException, CommitFailedException, ExecutionException, InterruptedException {
-        FileStore fileStore = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1)
-                .withNoCache().withMemoryMapping(true).build();
+        FileStore fileStore = fileStoreBuilder(getFileStoreFolder())
+                .withMaxFileSize(1)
+                .withSegmentCacheSize(0)
+                .withStringCacheSize(0)
+                .withTemplateCacheSize(0)
+                .withMemoryMapping(true)
+                .build();
         SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build();
 
         NodeBuilder root = nodeStore.getRoot().builder();