diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 327b5f2a118..9f331d9a37d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -319,6 +319,9 @@ Release 2.7.0 - UNRELEASED HDFS-7280. Use netty 4 in WebImageViewer. (wheat9) + HDFS-3342. SocketTimeoutException in BlockSender.sendChunks could + have a better error message. (Yongjun Zhang via wang) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java index ce0e1d5732c..27d3e5ce2a1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java @@ -574,12 +574,9 @@ class BlockSender implements java.io.Closeable { * writing to client timed out. This happens if the client reads * part of a block and then decides not to read the rest (but leaves * the socket open). + * + * Reporting of this case is done in DataXceiver#run */ - if (LOG.isTraceEnabled()) { - LOG.trace("Failed to send data:", e); - } else { - LOG.info("Failed to send data: " + e); - } } else { /* Exception while writing to the client. Connection closure from * the other end is mostly the case and we do not care much about diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataXceiver.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataXceiver.java index 6fc819de681..9dfd33bc25a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataXceiver.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataXceiver.java @@ -39,6 +39,7 @@ import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketException; +import java.net.SocketTimeoutException; import java.nio.channels.ClosedChannelException; import java.security.MessageDigest; import java.util.Arrays; @@ -240,6 +241,15 @@ class DataXceiver extends Receiver implements Runnable { } else { LOG.info(s + "; " + t); } + } else if (op == Op.READ_BLOCK && t instanceof SocketTimeoutException) { + String s1 = + "Likely the client has stopped reading, disconnecting it"; + s1 += " (" + s + ")"; + if (LOG.isTraceEnabled()) { + LOG.trace(s1, t); + } else { + LOG.info(s1 + "; " + t); + } } else { LOG.error(s, t); } @@ -520,9 +530,11 @@ class DataXceiver extends Receiver implements Runnable { /* What exactly should we do here? * Earlier version shutdown() datanode if there is disk error. */ - LOG.warn(dnR + ":Got exception while serving " + block + " to " + if (!(ioe instanceof SocketTimeoutException)) { + LOG.warn(dnR + ":Got exception while serving " + block + " to " + remoteAddress, ioe); - datanode.metrics.incrDatanodeNetworkErrors(); + datanode.metrics.incrDatanodeNetworkErrors(); + } throw ioe; } finally { IOUtils.closeStream(blockSender);