Author: frm
Date: Fri Feb  3 09:10:07 2017
New Revision: 1781515

URL: http://svn.apache.org/viewvc?rev=1781515&view=rev
Log:
OAK-5572 - Enable instrumentation of I/O operations

Added:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
   (with props)
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
   (with props)
Modified:
    
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/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/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java

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=1781515&r1=1781514&r2=1781515&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
 Fri Feb  3 09:10:07 2017
@@ -37,6 +37,7 @@ import java.util.regex.Pattern;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
+import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
 import org.apache.jackrabbit.oak.segment.CachingSegmentReader;
 import org.apache.jackrabbit.oak.segment.RecordType;
@@ -56,8 +57,6 @@ import org.apache.jackrabbit.oak.spi.blo
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Supplier;
-
 /**
  * The storage implementation for tar files.
  */
@@ -120,6 +119,8 @@ public abstract class AbstractFileStore
 
     };
 
+    protected final IOMonitor ioMonitor;
+
     AbstractFileStore(final FileStoreBuilder builder) {
         this.directory = builder.getDirectory();
         this.tracker = new SegmentTracker();
@@ -132,6 +133,7 @@ public abstract class AbstractFileStore
             }
         }, blobStore, builder.getStringCacheSize(), 
builder.getTemplateCacheSize());
         this.memoryMapping = builder.getMemoryMapping();
+        this.ioMonitor = builder.getIOMonitor();
     }
 
      File getManifestFile() {

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=1781515&r1=1781514&r2=1781515&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
 Fri Feb  3 09:10:07 2017
@@ -168,7 +168,7 @@ public class FileStore extends AbstractF
     private final FileStoreStats stats;
 
     @Nonnull
-    private final SegmentNotFoundExceptionListener snfeListener; 
+    private final SegmentNotFoundExceptionListener snfeListener;
 
     FileStore(final FileStoreBuilder builder) throws 
InvalidFileStoreVersionException, IOException {
         super(builder);
@@ -209,7 +209,7 @@ public class FileStore extends AbstractF
         Integer[] indices = map.keySet().toArray(new Integer[map.size()]);
         Arrays.sort(indices);
         for (int i = indices.length - 1; i >= 0; i--) {
-            readers.add(TarReader.open(map.get(indices[i]), memoryMapping, 
recovery));
+            readers.add(TarReader.open(map.get(indices[i]), memoryMapping, 
recovery, ioMonitor));
         }
         this.stats = new FileStoreStats(builder.getStatsProvider(), this, 
size());
 
@@ -684,7 +684,7 @@ public class FileStore extends AbstractF
             File writeFile = tarWriter.getFile();
             List<TarReader> list =
                     newArrayListWithCapacity(1 + readers.size());
-            list.add(TarReader.open(writeFile, memoryMapping));
+            list.add(TarReader.open(writeFile, memoryMapping, ioMonitor));
             list.addAll(readers);
             readers = list;
             tarWriter = newWriter;

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=1781515&r1=1781514&r2=1781515&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
 Fri Feb  3 09:10:07 2017
@@ -113,6 +113,8 @@ public class FileStoreBuilder {
 
     @Nonnull
     private SegmentNotFoundExceptionListener snfeListener = LOG_SNFE;
+
+    private IOMonitor ioMonitor = new IOMonitorAdapter();
     
     private boolean built;
 
@@ -283,6 +285,11 @@ public class FileStoreBuilder {
         this.snfeListener = checkNotNull(snfeListener);
         return this;
     }
+
+    public FileStoreBuilder withIOMonitor(IOMonitor ioMonitor) {
+        this.ioMonitor = checkNotNull(ioMonitor);
+        return this;
+    }
     
     /**
      * Create a new {@link FileStore} instance with the settings specified in 
this
@@ -421,6 +428,10 @@ public class FileStoreBuilder {
         return cacheManager;
     }
 
+    IOMonitor getIOMonitor() {
+        return ioMonitor;
+    }
+
     @Override
     public String toString() {
         return "FileStoreBuilder{" +

Added: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java?rev=1781515&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
 Fri Feb  3 09:10:07 2017
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment.file;
+
+import java.io.File;
+
+public interface IOMonitor {
+
+    void onSegmentRead(File file, long msb, long lsb, int length);
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java?rev=1781515&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
 Fri Feb  3 09:10:07 2017
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment.file;
+
+import java.io.File;
+
+public class IOMonitorAdapter implements IOMonitor {
+
+    @Override
+    public void onSegmentRead(File file, long msb, long lsb, int length) {
+        // Intentionally left blank
+    }
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
 Fri Feb  3 09:10:07 2017
@@ -86,7 +86,7 @@ public class ReadOnlyFileStore extends A
             // only try to read-only recover the latest file as that might
             // be the *only* one still being accessed by a writer
             boolean recover = i == indices.length - 1;
-            readers.add(TarReader.openRO(map.get(indices[i]), memoryMapping, 
recover, recovery));
+            readers.add(TarReader.openRO(map.get(indices[i]), memoryMapping, 
recover, recovery, ioMonitor));
         }
 
         writer = segmentWriterBuilder("read-only").withoutCache().build(this);

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
 Fri Feb  3 09:10:07 2017
@@ -86,9 +86,8 @@ class TarReader implements Closeable {
         return BLOCK_SIZE + size + TarWriter.getPaddingSize(size);
     }
 
-    static TarReader open(File file, boolean memoryMapping) throws IOException 
{
-        TarReader reader = openFirstFileWithValidIndex(
-                singletonList(file), memoryMapping);
+    static TarReader open(File file, boolean memoryMapping, IOMonitor 
ioMonitor) throws IOException {
+        TarReader reader = openFirstFileWithValidIndex(singletonList(file), 
memoryMapping, ioMonitor);
         if (reader != null) {
             return reader;
         } else {
@@ -111,14 +110,14 @@ class TarReader implements Closeable {
      * @return
      * @throws IOException
      */
-    static TarReader open(Map<Character, File> files, boolean memoryMapping, 
TarRecovery recovery) throws IOException {
+    static TarReader open(Map<Character, File> files, boolean memoryMapping, 
TarRecovery recovery, IOMonitor ioMonitor) throws IOException {
         SortedMap<Character, File> sorted = newTreeMap();
         sorted.putAll(files);
 
         List<File> list = newArrayList(sorted.values());
         Collections.reverse(list);
 
-        TarReader reader = openFirstFileWithValidIndex(list, memoryMapping);
+        TarReader reader = openFirstFileWithValidIndex(list, memoryMapping, 
ioMonitor);
         if (reader != null) {
             return reader;
         }
@@ -134,7 +133,7 @@ class TarReader implements Closeable {
         File file = sorted.values().iterator().next();
         generateTarFile(entries, file, recovery);
 
-        reader = openFirstFileWithValidIndex(singletonList(file), 
memoryMapping);
+        reader = openFirstFileWithValidIndex(singletonList(file), 
memoryMapping, ioMonitor);
         if (reader != null) {
             return reader;
         } else {
@@ -142,13 +141,12 @@ class TarReader implements Closeable {
         }
     }
 
-    static TarReader openRO(Map<Character, File> files, boolean memoryMapping, 
boolean recover, TarRecovery recovery) throws IOException {
+    static TarReader openRO(Map<Character, File> files, boolean memoryMapping, 
boolean recover, TarRecovery recovery, IOMonitor ioMonitor) throws IOException {
         // for readonly store only try the latest generation of a given
         // tar file to prevent any rollback or rewrite
         File file = files.get(Collections.max(files.keySet()));
 
-        TarReader reader = openFirstFileWithValidIndex(singletonList(file),
-                memoryMapping);
+        TarReader reader = openFirstFileWithValidIndex(singletonList(file), 
memoryMapping, ioMonitor);
         if (reader != null) {
             return reader;
         }
@@ -162,8 +160,7 @@ class TarReader implements Closeable {
             collectFileEntries(file, entries, false);
             file = findAvailGen(file, ".ro.bak");
             generateTarFile(entries, file, recovery);
-            reader = openFirstFileWithValidIndex(singletonList(file),
-                    memoryMapping);
+            reader = openFirstFileWithValidIndex(singletonList(file), 
memoryMapping, ioMonitor);
             if (reader != null) {
                 return reader;
             }
@@ -259,7 +256,7 @@ class TarReader implements Closeable {
         return backup;
     }
 
-    private static TarReader openFirstFileWithValidIndex(List<File> files, 
boolean memoryMapping) {
+    private static TarReader openFirstFileWithValidIndex(List<File> files, 
boolean memoryMapping, IOMonitor ioMonitor) {
         for (File file : files) {
             String name = file.getName();
             try {
@@ -285,7 +282,7 @@ class TarReader implements Closeable {
                                 index = mapped.read(
                                         mapped.length() - indexSize - 16 - 
1024,
                                         indexSize);
-                                return new TarReader(file, mapped, index);
+                                return new TarReader(file, mapped, index, 
ioMonitor);
                             } catch (IOException e) {
                                 log.warn("Failed to mmap tar file {}. Falling 
back to normal file " +
                                         "IO, which will negatively impact 
repository performance. " +
@@ -301,7 +298,7 @@ class TarReader implements Closeable {
                         // prevent the finally block from closing the file
                         // as the returned TarReader will take care of that
                         access = null;
-                        return new TarReader(file, random, index);
+                        return new TarReader(file, random, index, ioMonitor);
                     }
                 } finally {
                     if (access != null) {
@@ -504,10 +501,13 @@ class TarReader implements Closeable {
 
     private volatile boolean hasGraph;
 
-    private TarReader(File file, FileAccess access, ByteBuffer index) {
+    private final IOMonitor ioMonitor;
+
+    private TarReader(File file, FileAccess access, ByteBuffer index, 
IOMonitor ioMonitor) {
         this.file = file;
         this.access = access;
         this.index = index;
+        this.ioMonitor = ioMonitor;
     }
 
     long size() {
@@ -572,9 +572,10 @@ class TarReader implements Closeable {
     ByteBuffer readEntry(long msb, long lsb) throws IOException {
         int position = findEntry(msb, lsb);
         if (position != -1) {
-            return access.read(
-                    index.getInt(position + 16),
-                    index.getInt(position + 20));
+            int pos = index.getInt(position + 16);
+            int len = index.getInt(position + 20);
+            ioMonitor.onSegmentRead(file, msb, lsb, len);
+            return access.read(pos, len);
         } else {
             return null;
         }
@@ -845,9 +846,9 @@ class TarReader implements Closeable {
         for (TarEntry entry : entries) {
             if (entry != null) {
                 byte[] data = new byte[entry.size()];
+                ioMonitor.onSegmentRead(file, entry.msb(), entry.lsb(), 
entry.size());
                 access.read(entry.offset(), entry.size()).get(data);
-                writer.writeEntry(
-                        entry.msb(), entry.lsb(), data, 0, entry.size(), 
entry.generation());
+                writer.writeEntry(entry.msb(), entry.lsb(), data, 0, 
entry.size(), entry.generation());
             }
         }
 
@@ -893,8 +894,7 @@ class TarReader implements Closeable {
 
         writer.close();
 
-        TarReader reader = openFirstFileWithValidIndex(
-                singletonList(newFile), access.isMemoryMapped());
+        TarReader reader = openFirstFileWithValidIndex(singletonList(newFile), 
access.isMemoryMapped(), ioMonitor);
         if (reader != null) {
             reclaimed.addAll(cleaned);
             return reader;

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java?rev=1781515&r1=1781514&r2=1781515&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
 Fri Feb  3 09:10:07 2017
@@ -68,14 +68,14 @@ public class TarFileTest {
 
         assertEquals(5120, file.length());
 
-        TarReader reader = TarReader.open(file, false);
+        TarReader reader = TarReader.open(file, false, new IOMonitorAdapter());
         try {
             assertEquals(ByteBuffer.wrap(data), reader.readEntry(msb, lsb));
         } finally {
             reader.close();
         }
 
-        reader = TarReader.open(file, false);
+        reader = TarReader.open(file, false, new IOMonitorAdapter());
         try {
             assertEquals(ByteBuffer.wrap(data), reader.readEntry(msb, lsb));
         } finally {
@@ -125,7 +125,7 @@ public class TarFileTest {
         expected.put(2, two);
         expected.put(3, three);
 
-        try (TarReader reader = TarReader.open(file, false)) {
+        try (TarReader reader = TarReader.open(file, false, new 
IOMonitorAdapter())) {
             assertEquals(expected, reader.getBinaryReferences());
         }
     }
@@ -147,7 +147,7 @@ public class TarFileTest {
 
         Set<UUID> sweep = newSet(new UUID(1, 1), new UUID(2, 2));
 
-        try (TarReader reader = TarReader.open(file, false)) {
+        try (TarReader reader = TarReader.open(file, false, new 
IOMonitorAdapter())) {
             try (TarReader swept = reader.sweep(sweep, new HashSet<UUID>())) {
                 assertNotNull(swept);
 
@@ -184,7 +184,7 @@ public class TarFileTest {
 
         Set<UUID> sweep = newSet(new UUID(1, 2), new UUID(2, 3));
 
-        try (TarReader reader = TarReader.open(file, false)) {
+        try (TarReader reader = TarReader.open(file, false, new 
IOMonitorAdapter())) {
             try (TarReader swept = reader.sweep(sweep, new HashSet<UUID>())) {
                 assertNotNull(swept);
 


Reply via email to