Author: frm
Date: Mon Feb 13 14:26:12 2017
New Revision: 1782777

URL: http://svn.apache.org/viewvc?rev=1782777&view=rev
Log:
OAK-5632 - Expose segment write statistics from IOMonitor

Modified:
    
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/IOMonitor.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.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/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java

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=1782777&r1=1782776&r2=1782777&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
 Mon Feb 13 14:26:12 2017
@@ -217,7 +217,7 @@ public class FileStore extends AbstractF
         if (indices.length > 0) {
             writeNumber = indices[indices.length - 1] + 1;
         }
-        this.tarWriter = new TarWriter(directory, stats, writeNumber);
+        this.tarWriter = new TarWriter(directory, stats, writeNumber, 
ioMonitor);
         
         this.snfeListener = builder.getSnfeListener();
 

Modified: 
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=1782777&r1=1782776&r2=1782777&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
 Mon Feb 13 14:26:12 2017
@@ -25,4 +25,8 @@ public interface IOMonitor {
 
     void afterSegmentRead(File file, long msb, long lsb, int length, long 
elapsed);
 
+    void beforeSegmentWrite(File file, long msb, long lsb, int length);
+
+    void afterSegmentWrite(File file, long msb, long lsb, int length, long 
elapsed);
+
 }

Modified: 
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=1782777&r1=1782776&r2=1782777&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
 Mon Feb 13 14:26:12 2017
@@ -31,4 +31,14 @@ public class IOMonitorAdapter implements
         // Intentionally left blank
     }
 
+    @Override
+    public void beforeSegmentWrite(File file, long msb, long lsb, int length) {
+        // Intentionally left blank
+    }
+
+    @Override
+    public void afterSegmentWrite(File file, long msb, long lsb, int length, 
long elapsed) {
+        // Intentionally left blank
+    }
+
 }

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=1782777&r1=1782776&r2=1782777&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
 Mon Feb 13 14:26:12 2017
@@ -133,7 +133,7 @@ class TarReader implements Closeable {
 
         // regenerate the first generation based on the recovered data
         File file = sorted.values().iterator().next();
-        generateTarFile(entries, file, recovery);
+        generateTarFile(entries, file, recovery, ioMonitor);
 
         reader = openFirstFileWithValidIndex(singletonList(file), 
memoryMapping, ioMonitor);
         if (reader != null) {
@@ -161,7 +161,7 @@ class TarReader implements Closeable {
             LinkedHashMap<UUID, byte[]> entries = newLinkedHashMap();
             collectFileEntries(file, entries, false);
             file = findAvailGen(file, ".ro.bak");
-            generateTarFile(entries, file, recovery);
+            generateTarFile(entries, file, recovery, ioMonitor);
             reader = openFirstFileWithValidIndex(singletonList(file), 
memoryMapping, ioMonitor);
             if (reader != null) {
                 return reader;
@@ -207,10 +207,10 @@ class TarReader implements Closeable {
      * @param file
      * @throws IOException
      */
-    private static void generateTarFile(LinkedHashMap<UUID, byte[]> entries, 
File file, TarRecovery recovery) throws IOException {
+    private static void generateTarFile(LinkedHashMap<UUID, byte[]> entries, 
File file, TarRecovery recovery, IOMonitor ioMonitor) throws IOException {
         log.info("Regenerating tar file {}", file);
 
-        try (TarWriter writer = new TarWriter(file)) {
+        try (TarWriter writer = new TarWriter(file, ioMonitor)) {
             for (Entry<UUID, byte[]> entry : entries.entrySet()) {
                 try {
                     recovery.recoverEntry(entry.getKey(), entry.getValue(), 
writer);
@@ -843,7 +843,7 @@ class TarReader implements Closeable {
                 name.substring(0, pos) + (char) (generation + 1) + ".tar");
 
         log.debug("Writing new generation {}", newFile.getName());
-        TarWriter writer = new TarWriter(newFile);
+        TarWriter writer = new TarWriter(newFile, ioMonitor);
         for (TarEntry entry : entries) {
             if (entry != null) {
                 long msb = entry.msb();

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java?rev=1782777&r1=1782776&r2=1782777&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java
 Mon Feb 13 14:26:12 2017
@@ -42,9 +42,11 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 import java.util.zip.CRC32;
 
 import com.google.common.base.Charsets;
+import com.google.common.base.Stopwatch;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -161,20 +163,23 @@ class TarWriter implements Closeable {
      */
     private final Map<UUID, Set<UUID>> graph = newHashMap();
 
+    private final IOMonitor ioMonitor;
+
     /**
      * Used for maintenance operations (GC or recovery) via the TarReader and 
tests
      */
-    TarWriter(File file) {
+    TarWriter(File file, IOMonitor ioMonitor) {
         this.file = file;
         this.monitor = FileStoreMonitor.DEFAULT;
         this.writeIndex = -1;
+        this.ioMonitor = ioMonitor;
     }
 
-    TarWriter(File directory, FileStoreMonitor monitor, int writeIndex) {
-        this.file = new File(directory, format(FILE_NAME_FORMAT, writeIndex,
-                "a"));
+    TarWriter(File directory, FileStoreMonitor monitor, int writeIndex, 
IOMonitor ioMonitor) {
+        this.file = new File(directory, format(FILE_NAME_FORMAT, writeIndex, 
"a"));
         this.monitor = monitor;
         this.writeIndex = writeIndex;
+        this.ioMonitor = ioMonitor;
     }
 
     /**
@@ -237,31 +242,39 @@ class TarWriter implements Closeable {
         return writeEntry(uuid, header, data, offset, size, generation);
     }
 
-    private synchronized long writeEntry(
-            UUID uuid, byte[] header, byte[] data, int offset, int size, int 
generation)
-            throws IOException {
+    private synchronized long writeEntry(UUID uuid, byte[] header, byte[] 
data, int offset, int size, int generation) throws IOException {
         checkState(!closed);
+
         if (access == null) {
             access = new RandomAccessFile(file, "rw");
             channel = access.getChannel();
         }
 
+        long msb = uuid.getMostSignificantBits();
+        long lsb = uuid.getLeastSignificantBits();
+
+        int padding = getPaddingSize(size);
+
         long initialLength = access.getFilePointer();
+
         access.write(header);
+
+        ioMonitor.beforeSegmentWrite(file, msb, lsb, size);
+        Stopwatch stopwatch = Stopwatch.createStarted();
         access.write(data, offset, size);
-        int padding = getPaddingSize(size);
+        ioMonitor.afterSegmentWrite(file, msb, lsb, size, 
stopwatch.elapsed(TimeUnit.MILLISECONDS));
+
         if (padding > 0) {
             access.write(ZERO_BYTES, 0, padding);
         }
 
         long currentLength = access.getFilePointer();
+        monitor.written(currentLength - initialLength);
+
         checkState(currentLength <= Integer.MAX_VALUE);
-        TarEntry entry = new TarEntry(
-                uuid.getMostSignificantBits(), uuid.getLeastSignificantBits(),
-                (int) (currentLength - size - padding), size, generation);
+        TarEntry entry = new TarEntry(msb, lsb, (int) (currentLength - size - 
padding), size, generation);
         index.put(uuid, entry);
 
-        monitor.written(currentLength - initialLength);
         return currentLength;
     }
 
@@ -375,7 +388,7 @@ class TarWriter implements Closeable {
         }
         close();
         int newIndex = writeIndex + 1;
-        return new TarWriter(file.getParentFile(), monitor, newIndex);
+        return new TarWriter(file.getParentFile(), monitor, newIndex, 
ioMonitor);
     }
 
     private void writeBinaryReferences() throws IOException {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java?rev=1782777&r1=1782776&r2=1782777&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java
 Mon Feb 13 14:26:12 2017
@@ -85,15 +85,10 @@ public class FileStoreStatsTest {
             long lsb = id.getLeastSignificantBits() & (-1 >>> 4); // OAK-1672
             byte[] data = "Hello, World!".getBytes(UTF_8);
 
-            TarWriter writer = null;
-            try {
-                writer = new TarWriter(directory, stats, 0);
+            try (TarWriter writer = new TarWriter(directory, stats, 0, new 
IOMonitorAdapter())) {
                 writer.writeEntry(msb, lsb, data, 0, data.length, 0);
-            } finally {
-                writer.close();
+                assertEquals(stats.getApproximateSize() - initialSize, 
writer.fileLength());
             }
-            assertEquals(stats.getApproximateSize() - initialSize,
-                    writer.fileLength());
         } finally {
             store.close();
         }

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=1782777&r1=1782776&r2=1782777&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
 Mon Feb 13 14:26:12 2017
@@ -58,34 +58,21 @@ public class TarFileTest {
         long lsb = id.getLeastSignificantBits() & (-1 >>> 4); // OAK-1672
         byte[] data = "Hello, World!".getBytes(UTF_8);
 
-        TarWriter writer = new TarWriter(file);
-        try {
+        try (TarWriter writer = new TarWriter(file, new IOMonitorAdapter())) {
             writer.writeEntry(msb, lsb, data, 0, data.length, 0);
             assertEquals(ByteBuffer.wrap(data), writer.readEntry(msb, lsb));
-        } finally {
-            writer.close();
         }
 
         assertEquals(5120, file.length());
 
-        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, new IOMonitorAdapter());
-        try {
+        try (TarReader reader = TarReader.open(file, false, new 
IOMonitorAdapter())) {
             assertEquals(ByteBuffer.wrap(data), reader.readEntry(msb, lsb));
-        } finally {
-            reader.close();
         }
     }
 
     @Test
     public void testWriteAndReadBinaryReferences() throws Exception {
-        try (TarWriter writer = new TarWriter(file)) {
+        try (TarWriter writer = new TarWriter(file, new IOMonitorAdapter())) {
             writer.writeEntry(0x00, 0x00, new byte[] {0x01, 0x02, 0x3}, 0, 3, 
0);
 
             writer.addBinaryReference(1, new UUID(1, 0), "r0");
@@ -132,7 +119,7 @@ public class TarFileTest {
 
     @Test
     public void binaryReferencesIndexShouldBeTrimmedDownOnSweep() throws 
Exception {
-        try (TarWriter writer = new TarWriter(file)) {
+        try (TarWriter writer = new TarWriter(file, new IOMonitorAdapter())) {
             writer.writeEntry(1, 1, new byte[] {1}, 0, 1, 1);
             writer.writeEntry(1, 2, new byte[] {1}, 0, 1, 1);
             writer.writeEntry(2, 1, new byte[] {1}, 0, 1, 2);
@@ -168,7 +155,7 @@ public class TarFileTest {
 
     @Test
     public void graphShouldBeTrimmedDownOnSweep() throws Exception {
-        try (TarWriter writer = new TarWriter(file)) {
+        try (TarWriter writer = new TarWriter(file, new IOMonitorAdapter())) {
             writer.writeEntry(1, 1, new byte[] {1}, 0, 1, 1);
             writer.writeEntry(1, 2, new byte[] {1}, 0, 1, 1);
             writer.writeEntry(1, 3, new byte[] {1}, 0, 1, 1);

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java?rev=1782777&r1=1782776&r2=1782777&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java
 Mon Feb 13 14:26:12 2017
@@ -36,7 +36,6 @@ import java.util.Set;
 import java.util.UUID;
 
 import com.google.common.collect.ImmutableList;
-
 import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentId;
@@ -78,7 +77,7 @@ public class TarWriterTest {
         assertTrue(z.getReferences().isEmpty());
 
         File tar = folder.newFile(getClass().getName() + ".tar");
-        try (TarWriter tarWriter = new TarWriter(tar)) {
+        try (TarWriter tarWriter = new TarWriter(tar, new IOMonitorAdapter())) 
{
             y.write(tarWriter);
             b.write(tarWriter);
             a.write(tarWriter);
@@ -239,8 +238,7 @@ public class TarWriterTest {
     @Test
     public void createNextGenerationTest() throws IOException {
         int counter = 2222;
-        TarWriter t0 = new TarWriter(folder.newFolder(),
-                FileStoreMonitor.DEFAULT, counter);
+        TarWriter t0 = new TarWriter(folder.newFolder(), 
FileStoreMonitor.DEFAULT, counter, new IOMonitorAdapter());
 
         // not dirty, will not create a new writer
         TarWriter t1 = t0.createNextGeneration();


Reply via email to