Author: todd
Date: Tue Jul 3 20:46:42 2012
New Revision: 1356930
URL: http://svn.apache.org/viewvc?rev=1356930&view=rev
Log:
HDFS-3343. Improve metrics for DN read latency. Contributed by Andrew Wang.
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/SocketOutputStream.java
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/SocketOutputStream.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/SocketOutputStream.java?rev=1356930&r1=1356929&r2=1356930&view=diff
==============================================================================
---
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/SocketOutputStream.java
(original)
+++
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/SocketOutputStream.java
Tue Jul 3 20:46:42 2012
@@ -31,6 +31,8 @@ import java.nio.channels.WritableByteCha
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.metrics2.lib.MutableRate;
+import org.apache.hadoop.util.Progressable;
/**
* This implements an output stream that can have a timeout while writing.
@@ -166,7 +168,10 @@ public class SocketOutputStream extends
/**
* Transfers data from FileChannel using
- * {@link FileChannel#transferTo(long, long, WritableByteChannel)}.
+ * {@link FileChannel#transferTo(long, long, WritableByteChannel)}.
+ * Updates <code>waitForWritableTime</code> and <code>transferToTime</code>
+ * with the time spent blocked on the network and the time spent transferring
+ * data from disk to network respectively.
*
* Similar to readFully(), this waits till requested amount of
* data is transfered.
@@ -174,6 +179,9 @@ public class SocketOutputStream extends
* @param fileCh FileChannel to transfer data from.
* @param position position within the channel where the transfer begins
* @param count number of bytes to transfer.
+ * @param waitForWritableTime updated by the nanoseconds spent waiting for
+ * the socket to become writable
+ * @param transferTime updated by the nanoseconds spent transferring data
*
* @throws EOFException
* If end of input file is reached before requested number of
@@ -186,9 +194,11 @@ public class SocketOutputStream extends
* @throws IOException Includes any exception thrown by
* {@link FileChannel#transferTo(long, long, WritableByteChannel)}.
*/
- public void transferToFully(FileChannel fileCh, long position, int count)
- throws IOException {
-
+ public void transferToFully(FileChannel fileCh, long position, int count,
+ MutableRate waitForWritableTime,
+ MutableRate transferToTime) throws IOException {
+ long waitTime = 0;
+ long transferTime = 0;
while (count > 0) {
/*
* Ideally we should wait after transferTo returns 0. But because of
@@ -200,7 +210,10 @@ public class SocketOutputStream extends
*
* Once we move to JAVA SE 7, wait should be moved to correct place.
*/
+ long start = System.nanoTime();
waitForWritable();
+ long wait = System.nanoTime();
+
int nTransfered = (int) fileCh.transferTo(position, count, getChannel());
if (nTransfered == 0) {
@@ -219,6 +232,26 @@ public class SocketOutputStream extends
position += nTransfered;
count -= nTransfered;
}
+ long transfer = System.nanoTime();
+ waitTime += wait - start;
+ transferTime += transfer - wait;
+ }
+
+ if (waitForWritableTime != null) {
+ waitForWritableTime.add(waitTime);
+ }
+ if (transferToTime != null) {
+ transferToTime.add(transferTime);
}
- }
+ }
+
+ /**
+ * Call
+ * {@link #transferToFully(FileChannel, long, int, MutableRate, MutableRate)}
+ * with null <code>waitForWritableTime</code> and <code>transferToTime</code>
+ */
+ public void transferToFully(FileChannel fileCh, long position, int count)
+ throws IOException {
+ transferToFully(fileCh, position, count, null, null);
+ }
}