Author: frm
Date: Tue Oct  2 09:39:22 2018
New Revision: 1842607

URL: http://svn.apache.org/viewvc?rev=1842607&view=rev
Log:
OAK-7788 - Measure read rate for the Segment Store

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/SegmentNodeBuilder.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.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=1842607&r1=1842606&r2=1842607&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
 Tue Oct  2 09:39:22 2018
@@ -26,6 +26,7 @@ import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -55,6 +56,8 @@ public class CachingSegmentReader implem
     @NotNull
     private final TemplateCache templateCache;
 
+    private final MeterStats readStats;
+
     /**
      * Create a new instance based on the supplied arguments.
      * @param writer          A {@code Supplier} for a the {@code 
SegmentWriter} used by the segment
@@ -66,14 +69,17 @@ public class CachingSegmentReader implem
      * @param templateCacheMB the size of the template cache in MBs or {@code 
0} for no cache.
      */
     public CachingSegmentReader(
-            @NotNull Supplier<SegmentWriter> writer,
-            @Nullable BlobStore blobStore,
-            long stringCacheMB,
-            long templateCacheMB) {
+        @NotNull Supplier<SegmentWriter> writer,
+        @Nullable BlobStore blobStore,
+        long stringCacheMB,
+        long templateCacheMB,
+        MeterStats readStats
+    ) {
         this.writer = checkNotNull(writer);
         this.blobStore = blobStore;
         stringCache = new StringCache(stringCacheMB * 1024 * 1024);
         templateCache = new TemplateCache(templateCacheMB * 1024 * 1024);
+        this.readStats = readStats;
     }
 
     /**
@@ -121,7 +127,7 @@ public class CachingSegmentReader implem
     @NotNull
     @Override
     public SegmentNodeState readNode(@NotNull RecordId id) {
-        return new SegmentNodeState(this, writer, blobStore, id);
+        return new SegmentNodeState(this, writer, blobStore, id, readStats);
     }
 
     @NotNull

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java?rev=1842607&r1=1842606&r2=1842607&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java
 Tue Oct  2 09:39:22 2018
@@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.api.Blo
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
@@ -57,6 +58,8 @@ public class SegmentNodeBuilder extends
     @NotNull
     private final SegmentWriter writer;
 
+    private final MeterStats readStats;
+
     /**
      * Local update counter for the root builder.
      * 
@@ -72,28 +75,34 @@ public class SegmentNodeBuilder extends
     private long updateCount;
 
     SegmentNodeBuilder(
-            @NotNull SegmentNodeState base,
-            @Nullable BlobStore blobStore,
-            @NotNull SegmentReader reader,
-            @NotNull SegmentWriter writer) {
+        @NotNull SegmentNodeState base,
+        @Nullable BlobStore blobStore,
+        @NotNull SegmentReader reader,
+        @NotNull SegmentWriter writer,
+        MeterStats readStats
+    ) {
         super(base);
         this.blobStore = blobStore;
         this.reader = reader;
         this.writer = checkNotNull(writer);
         this.updateCount = 0;
+        this.readStats = readStats;
     }
 
     private SegmentNodeBuilder(
-            @NotNull SegmentNodeBuilder parent,
-            @NotNull String name,
-            @Nullable BlobStore blobStore,
-            @NotNull SegmentReader reader,
-            @NotNull SegmentWriter writer) {
+        @NotNull SegmentNodeBuilder parent,
+        @NotNull String name,
+        @Nullable BlobStore blobStore,
+        @NotNull SegmentReader reader,
+        @NotNull SegmentWriter writer,
+        MeterStats readStats
+    ) {
         super(parent, name);
         this.blobStore = blobStore;
         this.reader = reader;
         this.writer = checkNotNull(writer);
         this.updateCount = -1;
+        this.readStats = readStats;
     }
 
     /**
@@ -128,7 +137,7 @@ public class SegmentNodeBuilder extends
     public SegmentNodeState getNodeState() {
         try {
             NodeState state = super.getNodeState();
-            SegmentNodeState sState = new SegmentNodeState(reader, writer, 
blobStore, writer.writeNode(state));
+            SegmentNodeState sState = new SegmentNodeState(reader, writer, 
blobStore, writer.writeNode(state), readStats);
             if (state != sState) {
                 set(sState);
                 if(!isChildBuilder()) {
@@ -144,7 +153,7 @@ public class SegmentNodeBuilder extends
 
     @Override
     protected MemoryNodeBuilder createChildBuilder(String name) {
-        return new SegmentNodeBuilder(this, name, blobStore, reader, writer);
+        return new SegmentNodeBuilder(this, name, blobStore, reader, writer, 
readStats);
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java?rev=1842607&r1=1842606&r2=1842607&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
 Tue Oct  2 09:39:22 2018
@@ -52,6 +52,8 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
+import org.apache.jackrabbit.oak.stats.MeterStats;
+import org.apache.jackrabbit.oak.stats.NoopStats;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -69,27 +71,43 @@ public class SegmentNodeState extends Re
     @NotNull
     private final Supplier<SegmentWriter> writer;
 
+    private final MeterStats readStats;
+
     private volatile RecordId templateId = null;
 
     private volatile Template template = null;
 
     SegmentNodeState(
-            @NotNull SegmentReader reader,
-            @NotNull Supplier<SegmentWriter> writer,
-            @Nullable BlobStore blobStore,
-            @NotNull RecordId id) {
+        @NotNull SegmentReader reader,
+        @NotNull Supplier<SegmentWriter> writer,
+        @Nullable BlobStore blobStore,
+        @NotNull RecordId id,
+        MeterStats readStats
+    ) {
         super(id);
         this.reader = checkNotNull(reader);
         this.writer = checkNotNull(memoize(writer));
         this.blobStore = blobStore;
+        this.readStats = readStats;
+    }
+
+    public SegmentNodeState(
+        @NotNull SegmentReader reader,
+        @NotNull SegmentWriter writer,
+        @Nullable BlobStore blobStore,
+        @NotNull RecordId id
+    ) {
+        this(reader, Suppliers.ofInstance(writer), blobStore, id, 
NoopStats.INSTANCE);
     }
 
     public SegmentNodeState(
-            @NotNull SegmentReader reader,
-            @NotNull SegmentWriter writer,
-            @Nullable BlobStore blobStore,
-            @NotNull RecordId id) {
-        this(reader, Suppliers.ofInstance(writer), blobStore, id);
+        @NotNull SegmentReader reader,
+        @NotNull SegmentWriter writer,
+        @Nullable BlobStore blobStore,
+        @NotNull RecordId id,
+        MeterStats readStats
+    ) {
+        this(reader, Suppliers.ofInstance(writer), blobStore, id, readStats);
     }
 
     RecordId getTemplateId() {
@@ -166,6 +184,7 @@ public class SegmentNodeState extends Re
 
     @Override
     public long getPropertyCount() {
+        readStats.mark();
         Template template = getTemplate();
         long count = template.getPropertyTemplates().length;
         if (template.getPrimaryType() != null) {
@@ -179,6 +198,7 @@ public class SegmentNodeState extends Re
 
     @Override
     public boolean hasProperty(@NotNull String name) {
+        readStats.mark();
         checkNotNull(name);
         Template template = getTemplate();
         switch (name) {
@@ -193,6 +213,7 @@ public class SegmentNodeState extends Re
 
     @Override @Nullable
     public PropertyState getProperty(@NotNull String name) {
+        readStats.mark();
         checkNotNull(name);
         Template template = getTemplate();
         PropertyState property = null;
@@ -229,6 +250,7 @@ public class SegmentNodeState extends Re
 
     @Override @NotNull
     public Iterable<PropertyState> getProperties() {
+        readStats.mark();
         Template template = getTemplate();
         PropertyTemplate[] propertyTemplates = template.getPropertyTemplates();
         List<PropertyState> list =
@@ -263,11 +285,13 @@ public class SegmentNodeState extends Re
 
     @Override
     public boolean getBoolean(@NotNull String name) {
+        readStats.mark();
         return Boolean.TRUE.toString().equals(getValueAsString(name, BOOLEAN));
     }
 
     @Override
     public long getLong(String name) {
+        readStats.mark();
         String value = getValueAsString(name, LONG);
         if (value != null) {
             return Long.parseLong(value);
@@ -278,21 +302,25 @@ public class SegmentNodeState extends Re
 
     @Override @Nullable
     public String getString(String name) {
+        readStats.mark();
         return getValueAsString(name, STRING);
     }
 
     @Override @NotNull
     public Iterable<String> getStrings(@NotNull String name) {
+        readStats.mark();
         return getValuesAsStrings(name, STRINGS);
     }
 
     @Override @Nullable
     public String getName(@NotNull String name) {
+        readStats.mark();
         return getValueAsString(name, NAME);
     }
 
     @Override @NotNull
     public Iterable<String> getNames(@NotNull String name) {
+        readStats.mark();
         return getValuesAsStrings(name, NAMES);
     }
 
@@ -392,6 +420,7 @@ public class SegmentNodeState extends Re
 
     @Override
     public long getChildNodeCount(long max) {
+        readStats.mark();
         String childName = getTemplate().getChildName();
         if (childName == Template.ZERO_CHILD_NODES) {
             return 0;
@@ -404,6 +433,7 @@ public class SegmentNodeState extends Re
 
     @Override
     public boolean hasChildNode(@NotNull String name) {
+        readStats.mark();
         String childName = getTemplate().getChildName();
         if (childName == Template.ZERO_CHILD_NODES) {
             return false;
@@ -416,6 +446,7 @@ public class SegmentNodeState extends Re
 
     @Override @NotNull
     public NodeState getChildNode(@NotNull String name) {
+        readStats.mark();
         String childName = getTemplate().getChildName();
         if (childName == Template.MANY_CHILD_NODES) {
             MapEntry child = getChildNodeMap().getEntry(name);
@@ -433,6 +464,7 @@ public class SegmentNodeState extends Re
 
     @Override @NotNull
     public Iterable<String> getChildNodeNames() {
+        readStats.mark();
         String childName = getTemplate().getChildName();
         if (childName == Template.ZERO_CHILD_NODES) {
             return Collections.emptyList();
@@ -445,6 +477,7 @@ public class SegmentNodeState extends Re
 
     @Override @NotNull
     public Iterable<? extends ChildNodeEntry> getChildNodeEntries() {
+        readStats.mark();
         String childName = getTemplate().getChildName();
         if (childName == Template.ZERO_CHILD_NODES) {
             return Collections.emptyList();
@@ -459,11 +492,12 @@ public class SegmentNodeState extends Re
 
     @Override @NotNull
     public SegmentNodeBuilder builder() {
-        return new SegmentNodeBuilder(this, blobStore, reader, writer.get());
+        return new SegmentNodeBuilder(this, blobStore, reader, writer.get(), 
readStats);
     }
 
     @Override
     public boolean compareAgainstBaseState(NodeState base, NodeStateDiff diff) 
{
+        readStats.mark();
         if (this == base || fastEquals(this, base)) {
              return true; // no changes
         } else if (base == EMPTY_NODE || !base.exists()) { // special case

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java?rev=1842607&r1=1842606&r2=1842607&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
 Tue Oct  2 09:39:22 2018
@@ -37,13 +37,12 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.Segment.RecordConsumer;
 import org.apache.jackrabbit.oak.segment.SegmentBlob;
+import org.apache.jackrabbit.oak.segment.SegmentBufferMonitor;
 import org.apache.jackrabbit.oak.segment.SegmentCache;
 import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentIdFactory;
 import org.apache.jackrabbit.oak.segment.SegmentIdProvider;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
-import org.apache.jackrabbit.oak.segment.SegmentBufferMonitor;
-import 
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundException;
 import org.apache.jackrabbit.oak.segment.SegmentReader;
 import org.apache.jackrabbit.oak.segment.SegmentStore;
@@ -51,10 +50,12 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.file.tar.EntryRecovery;
 import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
-import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.apache.jackrabbit.oak.segment.file.tar.TarRecovery;
+import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
+import 
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.stats.StatsOptions;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
@@ -135,7 +136,13 @@ public abstract class AbstractFileStore
         });
         this.blobStore = builder.getBlobStore();
         this.segmentCache = newSegmentCache(builder.getSegmentCacheSize());
-        this.segmentReader = new CachingSegmentReader(this::getWriter, 
blobStore, builder.getStringCacheSize(), builder.getTemplateCacheSize());
+        this.segmentReader = new CachingSegmentReader(
+            this::getWriter,
+            blobStore,
+            builder.getStringCacheSize(),
+            builder.getTemplateCacheSize(),
+            builder.getStatsProvider().getMeter("oak.segment.reads", 
StatsOptions.DEFAULT)
+        );
         this.memoryMapping = builder.getMemoryMapping();
         this.ioMonitor = builder.getIOMonitor();
         this.segmentBufferMonitor = new 
SegmentBufferMonitor(builder.getStatsProvider());

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java?rev=1842607&r1=1842606&r2=1842607&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
 Tue Oct  2 09:39:22 2018
@@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentTracker;
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.stats.NoopStats;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -69,7 +70,7 @@ public class MemoryStore implements Segm
             }
         });
         this.revisions = new MemoryStoreRevisions();
-        this.segmentReader = new CachingSegmentReader(this::getWriter, null, 
16, 2);
+        this.segmentReader = new CachingSegmentReader(this::getWriter, null, 
16, 2, NoopStats.INSTANCE);
         this.segmentWriter = 
defaultSegmentWriterBuilder("sys").withWriterPool().build(this);
         revisions.bind(this);
         segmentWriter.flush();


Reply via email to