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