diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 22c6c5e86bb..f13deb10e23 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -287,6 +287,9 @@ Branch-2 ( Unreleased changes ) HDFS-3067. NPE in DFSInputStream.readBuffer if read is repeated on corrupted block. (Henry Robinson via atm) + HDFS-3555. idle client socket triggers DN ERROR log + (should be INFO or DEBUG). (Andy Isaacson via harsh) + OPTIMIZATIONS HDFS-2982. Startup performance suffers when there are many edit log 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 62b97dca237..f6bab31c69e 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 @@ -28,6 +28,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; +import java.net.SocketTimeoutException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Arrays; @@ -493,18 +494,27 @@ private int sendPacket(ByteBuffer pkt, int maxChunks, OutputStream out, out.write(buf, 0, dataOff + dataLen); } } catch (IOException e) { - /* Exception while writing to the client. Connection closure from - * the other end is mostly the case and we do not care much about - * it. But other things can go wrong, especially in transferTo(), - * which we do not want to ignore. - * - * The message parsing below should not be considered as a good - * coding example. NEVER do it to drive a program logic. NEVER. - * It was done here because the NIO throws an IOException for EPIPE. - */ - String ioem = e.getMessage(); - if (!ioem.startsWith("Broken pipe") && !ioem.startsWith("Connection reset")) { - LOG.error("BlockSender.sendChunks() exception: ", e); + if (e instanceof SocketTimeoutException) { + /* + * 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). + */ + LOG.info("BlockSender.sendChunks() exception: ", 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 + * it. But other things can go wrong, especially in transferTo(), + * which we do not want to ignore. + * + * The message parsing below should not be considered as a good + * coding example. NEVER do it to drive a program logic. NEVER. + * It was done here because the NIO throws an IOException for EPIPE. + */ + String ioem = e.getMessage(); + if (!ioem.startsWith("Broken pipe") && !ioem.startsWith("Connection reset")) { + LOG.error("BlockSender.sendChunks() exception: ", e); + } } throw ioeToSocketException(e); }