Browse Source

HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than DFSOutputStream#writeChunk (cmccabe)

(cherry picked from commit c94d594a57806dec515e2a2053a1221f8ce48cc4)
Colin Patrick Mccabe 10 years ago
parent
commit
4b74aa7182

+ 16 - 4
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FSOutputSummer.java

@@ -21,6 +21,8 @@ package org.apache.hadoop.fs;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.util.DataChecksum;
+import org.apache.htrace.NullScope;
+import org.apache.htrace.TraceScope;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -194,16 +196,26 @@ abstract public class FSOutputSummer extends OutputStream {
     return sum.getChecksumSize();
   }
 
+  protected TraceScope createWriteTraceScope() {
+    return NullScope.INSTANCE;
+  }
+
   /** Generate checksums for the given data chunks and output chunks & checksums
    * to the underlying output stream.
    */
   private void writeChecksumChunks(byte b[], int off, int len)
   throws IOException {
     sum.calculateChunkedSums(b, off, len, checksum, 0);
-    for (int i = 0; i < len; i += sum.getBytesPerChecksum()) {
-      int chunkLen = Math.min(sum.getBytesPerChecksum(), len - i);
-      int ckOffset = i / sum.getBytesPerChecksum() * getChecksumSize();
-      writeChunk(b, off + i, chunkLen, checksum, ckOffset, getChecksumSize());
+    TraceScope scope = createWriteTraceScope();
+    try {
+      for (int i = 0; i < len; i += sum.getBytesPerChecksum()) {
+        int chunkLen = Math.min(sum.getBytesPerChecksum(), len - i);
+        int ckOffset = i / sum.getBytesPerChecksum() * getChecksumSize();
+        writeChunk(b, off + i, chunkLen, checksum, ckOffset,
+            getChecksumSize());
+      }
+    } finally {
+      scope.close();
     }
   }
 

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -63,6 +63,9 @@ Release 2.8.0 - UNRELEASED
 
   OPTIMIZATIONS
 
+    HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than
+    DFSOutputStream#writeChunk (cmccabe)
+
   BUG FIXES
 
     HDFS-7501. TransactionsSinceLastCheckpoint can be negative on SBNs.

+ 4 - 11
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java

@@ -372,21 +372,14 @@ public class DFSOutputStream extends FSOutputSummer
     }
   }
 
+  protected TraceScope createWriteTraceScope() {
+    return dfsClient.getPathTraceScope("DFSOutputStream#write", src);
+  }
+
   // @see FSOutputSummer#writeChunk()
   @Override
   protected synchronized void writeChunk(byte[] b, int offset, int len,
       byte[] checksum, int ckoff, int cklen) throws IOException {
-    TraceScope scope =
-        dfsClient.getPathTraceScope("DFSOutputStream#writeChunk", src);
-    try {
-      writeChunkImpl(b, offset, len, checksum, ckoff, cklen);
-    } finally {
-      scope.close();
-    }
-  }
-
-  private synchronized void writeChunkImpl(byte[] b, int offset, int len,
-          byte[] checksum, int ckoff, int cklen) throws IOException {
     dfsClient.checkOpen();
     checkClosed();
 

+ 2 - 2
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/tracing/TestTracing.java

@@ -89,7 +89,7 @@ public class TestTracing {
       "org.apache.hadoop.hdfs.protocol.ClientProtocol.complete",
       "ClientNamenodeProtocol#complete",
       "newStreamForCreate",
-      "DFSOutputStream#writeChunk",
+      "DFSOutputStream#write",
       "DFSOutputStream#close",
       "dataStreamer",
       "OpWriteBlockProto",
@@ -117,7 +117,7 @@ public class TestTracing {
       "org.apache.hadoop.hdfs.protocol.ClientProtocol.complete",
       "ClientNamenodeProtocol#complete",
       "newStreamForCreate",
-      "DFSOutputStream#writeChunk",
+      "DFSOutputStream#write",
       "DFSOutputStream#close",
     };
     for (String desc : spansInTopTrace) {