From 66c096731052fb187dc49f5bcaec8432c4b92d0c Mon Sep 17 00:00:00 2001 From: cnauroth Date: Thu, 5 Nov 2015 22:07:08 -0800 Subject: [PATCH] HDFS-9384. TestWebHdfsContentLength intermittently hangs and fails due to TCP conversation mismatch between client and server. Contributed by Chris Nauroth. --- .../hdfs/web/TestWebHdfsContentLength.java | 23 ++++++++++++++++--- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsContentLength.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsContentLength.java index ba99f7a091f..19f18b0a8da 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsContentLength.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsContentLength.java @@ -38,8 +38,9 @@ import org.apache.hadoop.net.NetUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; - +import org.junit.rules.Timeout; public class TestWebHdfsContentLength { private static ServerSocket listenSocket; @@ -58,6 +59,9 @@ public class TestWebHdfsContentLength { private static ExecutorService executor; + @Rule + public Timeout timeout = new Timeout(30000); + @BeforeClass public static void setup() throws IOException { listenSocket = new ServerSocket(); @@ -186,8 +190,21 @@ public class TestWebHdfsContentLength { client.getOutputStream().write(response.getBytes()); client.shutdownOutput(); byte[] buf = new byte[4*1024]; // much bigger than request - int n = client.getInputStream().read(buf); - return new String(buf, 0, n); + + // The second request can be sent with Transfer-Encoding: chunked. + // The Java HTTP client tends to split the headers and the chunked + // body into separate writes, so the first read likely only gets the + // headers. We must fully consume the input to prevent a hang on the + // client side. + StringBuilder sb = new StringBuilder(); + for (;;) { + int n = client.getInputStream().read(buf); + if (n <= 0) { + break; + } + sb.append(new String(buf, 0, n, "UTF-8")); + } + return sb.toString(); } finally { client.close(); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 93a7043e4e1..af6723f3dd1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -2250,6 +2250,9 @@ Release 2.8.0 - UNRELEASED HDFS-9378. hadoop-hdfs-client tests do not write logs. (cnauroth) + HDFS-9384. TestWebHdfsContentLength intermittently hangs and fails due to + TCP conversation mismatch between client and server. (cnauroth) + Release 2.7.3 - UNRELEASED INCOMPATIBLE CHANGES