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 2017/03/21 20:42:18 UTC

svn commit: r1788026 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/ test/java/org/apache/jackrabbit/oak/segment/

Author: mduerig
Date: Tue Mar 21 20:42:17 2017
New Revision: 1788026

URL: http://svn.apache.org/viewvc?rev=1788026&view=rev
Log:
OAK-5954: Unify and simplify the deduplication caches
Separate statistics for regular writes and compaction writes

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/WriteCacheManagerTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1788026&r1=1788025&r2=1788026&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java Tue Mar 21 20:42:17 2017
@@ -45,6 +45,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.segment.MapEntry.newModifiedMapEntry;
 import static org.apache.jackrabbit.oak.segment.MapRecord.BUCKETS_PER_LEVEL;
 import static org.apache.jackrabbit.oak.segment.RecordWriters.newNodeStateWriter;
+import static org.apache.jackrabbit.oak.segment.WriterCacheManager.Operation.COMPACT;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -319,7 +320,7 @@ public class SegmentWriter {
                 @Nonnull
                 @Override
                 public RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException {
-                    return with(writer).writeNode(state);
+                    return with(writer, true).writeNode(state);
                 }
             });
             return new SegmentNodeState(reader, this, nodeId);
@@ -367,16 +368,21 @@ public class SegmentWriter {
         public abstract RecordId execute(@Nonnull SegmentBufferWriter writer) throws IOException;
 
         @Nonnull
-        SegmentWriteOperation with(@Nonnull SegmentBufferWriter writer) {
+        SegmentWriteOperation with(@Nonnull SegmentBufferWriter writer, boolean compacting) {
             checkState(this.writer == null);
             this.writer = writer;
             int generation = writer.getGeneration();
-            this.stringCache = cacheManager.getStringCache(generation);
-            this.templateCache = cacheManager.getTemplateCache(generation);
-            this.nodeCache = cacheManager.getNodeCache(generation);
+            this.stringCache = cacheManager.getStringCache(generation, COMPACT);
+            this.templateCache = cacheManager.getTemplateCache(generation, COMPACT);
+            this.nodeCache = cacheManager.getNodeCache(generation, COMPACT);
             return this;
         }
 
+        @Nonnull
+        SegmentWriteOperation with(@Nonnull SegmentBufferWriter writer) {
+            return with(writer, false);
+        }
+
         private RecordId writeMap(@Nullable MapRecord base,
                                   @Nonnull Map<String, RecordId> changes)
         throws IOException {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java?rev=1788026&r1=1788025&r2=1788026&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java Tue Mar 21 20:42:17 2017
@@ -51,6 +51,16 @@ import org.apache.jackrabbit.oak.stats.S
  * generations being reused.
  */
 public abstract class WriterCacheManager {
+    /**
+     * The type of operation a cache acquired through this manager is used for.
+     * This type is used to determine against which monitoring endpoint to report
+     * access statistics.
+     *
+     * @see #getStringCache(int, Operation)
+     * @see #getTemplateCache(int, Operation)
+     * @see #getNodeCache(int, Operation)
+     */
+    public enum Operation {WRITE, COMPACT}
 
     /**
      * Default size of the string cache, used as default for OSGi config.
@@ -59,7 +69,7 @@ public abstract class WriterCacheManager
 
     /**
      * Default size of the string cache.
-     * @see #getStringCache(int)
+     * @see #getStringCache(int, Operation)
      */
     public static final int DEFAULT_STRING_CACHE_SIZE = getInteger(
             "oak.tar.stringsCacheSize", DEFAULT_STRING_CACHE_SIZE_OSGi);
@@ -71,7 +81,7 @@ public abstract class WriterCacheManager
 
     /**
      * Default size of the template cache.
-     * @see #getTemplateCache(int)
+     * @see #getTemplateCache(int, Operation)
      */
     public static final int DEFAULT_TEMPLATE_CACHE_SIZE = getInteger(
             "oak.tar.templatesCacheSize", DEFAULT_TEMPLATE_CACHE_SIZE_OSGi);
@@ -84,31 +94,29 @@ public abstract class WriterCacheManager
 
     /**
      * Default size of the node deduplication cache.
-     * @see #getNodeCache(int)
+     * @see #getNodeCache(int, Operation)
      */
     public static final int DEFAULT_NODE_CACHE_SIZE = getInteger(
             "oak.tar.nodeCacheSize", DEFAULT_NODE_CACHE_SIZE_OSGi);
 
     /**
-     * @param generation
-     * @return  cache for string records of the given {@code generation}.
+     * @return  cache for string records of the given {@code generation} and {@code operation}.
      */
     @Nonnull
-    public abstract Cache<String, RecordId> getStringCache(int generation);
+    public abstract Cache<String, RecordId> getStringCache(int generation, Operation operation);
 
     /**
      * @param generation
-     * @return  cache for template records of the given {@code generation}.
+     * @return  cache for template records of the given {@code generation} and {@code operation}.
      */
     @Nonnull
-    public abstract Cache<Template, RecordId> getTemplateCache(int generation);
+    public abstract Cache<Template, RecordId> getTemplateCache(int generation, Operation operation);
 
     /**
-     * @param generation
-     * @return  cache for node records of the given {@code generation}.
+     * @return  cache for node records of the given {@code generation} and {@code operation}.
      */
     @Nonnull
-    public abstract Cache<String, RecordId> getNodeCache(int generation);
+    public abstract Cache<String, RecordId> getNodeCache(int generation, Operation operation);
 
     /**
      * @return  statistics for the string cache or {@code null} if not available.
@@ -164,7 +172,7 @@ public abstract class WriterCacheManager
          */
         @Nonnull
         @Override
-        public RecordCache<String> getStringCache(int generation) {
+        public RecordCache<String> getStringCache(int generation, Operation operation) {
             return stringCache;
         }
 
@@ -173,7 +181,7 @@ public abstract class WriterCacheManager
          */
         @Nonnull
         @Override
-        public RecordCache<Template> getTemplateCache(int generation) {
+        public RecordCache<Template> getTemplateCache(int generation, Operation operation) {
             return templateCache;
         }
 
@@ -182,7 +190,7 @@ public abstract class WriterCacheManager
          */
         @Nonnull
         @Override
-        public Cache<String, RecordId> getNodeCache(int generation) {
+        public Cache<String, RecordId> getNodeCache(int generation, Operation operation) {
             return new Cache<String, RecordId>() {
                 @Override
                 public void put(@Nonnull String stableId, @Nonnull RecordId recordId, byte cost) { }
@@ -304,15 +312,15 @@ public abstract class WriterCacheManager
 
         @Nonnull
         @Override
-        public Cache<String, RecordId> getStringCache(int generation) {
-            return new AccessTrackingCache<>("oak.segment.string-deduplication-cache",
+        public Cache<String, RecordId> getStringCache(int generation, Operation operation) {
+            return new AccessTrackingCache<>("oak.segment.string-deduplication-cache-" + operation,
                     stringCaches.getGeneration(generation));
         }
 
         @Nonnull
         @Override
-        public Cache<Template, RecordId> getTemplateCache(int generation) {
-            return new AccessTrackingCache<>("oak.segment.template-deduplication-cache",
+        public Cache<Template, RecordId> getTemplateCache(int generation, Operation operation) {
+            return new AccessTrackingCache<>("oak.segment.template-deduplication-cache-" + operation,
                     templateCaches.getGeneration(generation));
         }
 
@@ -322,8 +330,8 @@ public abstract class WriterCacheManager
 
         @Override
         @Nonnull
-        public Cache<String, RecordId> getNodeCache(final int generation) {
-            return new AccessTrackingCache<>("oak.segment.node-deduplication-cache",
+        public Cache<String, RecordId> getNodeCache(final int generation, Operation operation) {
+            return new AccessTrackingCache<>("oak.segment.node-deduplication-cache-" + operation,
                     new Cache<String, RecordId>() {
                 @Override
                 public void put(@Nonnull String stableId, @Nonnull RecordId recordId, byte cost) {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java?rev=1788026&r1=1788025&r2=1788026&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java Tue Mar 21 20:42:17 2017
@@ -169,20 +169,20 @@ public class NodeRecordTest {
 
             @Nonnull
             @Override
-            public Cache<String, RecordId> getStringCache(int generation) {
-                return Empty.INSTANCE.getStringCache(generation);
+            public Cache<String, RecordId> getStringCache(int generation, Operation operation) {
+                return Empty.INSTANCE.getStringCache(generation, operation);
             }
 
             @Nonnull
             @Override
-            public Cache<Template, RecordId> getTemplateCache(int generation) {
-                return Empty.INSTANCE.getTemplateCache(generation);
+            public Cache<Template, RecordId> getTemplateCache(int generation, Operation operation) {
+                return Empty.INSTANCE.getTemplateCache(generation, operation);
             }
 
             @Nonnull
             @Override
-            public Cache<String, RecordId> getNodeCache(int generation) {
-                return defaultCache.getNodeCache(generation);
+            public Cache<String, RecordId> getNodeCache(int generation, Operation operation) {
+                return defaultCache.getNodeCache(generation, operation);
             }
         };
     }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/WriteCacheManagerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/WriteCacheManagerTest.java?rev=1788026&r1=1788025&r2=1788026&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/WriteCacheManagerTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/WriteCacheManagerTest.java Tue Mar 21 20:42:17 2017
@@ -19,6 +19,7 @@
 
 package org.apache.jackrabbit.oak.segment;
 
+import static org.apache.jackrabbit.oak.segment.WriterCacheManager.Operation.WRITE;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 
@@ -31,15 +32,23 @@ public class WriteCacheManagerTest {
     @Test
     public void emptyGenerations() {
         WriterCacheManager cache = Empty.INSTANCE;
-        assertEquals(cache.getTemplateCache(0), cache.getTemplateCache(1));
-        assertEquals(cache.getStringCache(0), cache.getStringCache(1));
+        assertEquals(
+                cache.getTemplateCache(0, WRITE),
+                cache.getTemplateCache(1, WRITE));
+        assertEquals(
+                cache.getStringCache(0, WRITE),
+                cache.getStringCache(1, WRITE));
     }
 
     @Test
     public void nonEmptyGenerations() {
         WriterCacheManager cache = new Default();
-        assertNotEquals(cache.getTemplateCache(0), cache.getTemplateCache(1));
-        assertNotEquals(cache.getStringCache(0), cache.getStringCache(1));
+        assertNotEquals(
+                cache.getTemplateCache(0, WRITE),
+                cache.getTemplateCache(1, WRITE));
+        assertNotEquals(
+                cache.getStringCache(0, WRITE),
+                cache.getStringCache(1, WRITE));
     }
 
 }