HDFS-7881. TestHftpFileSystem#testSeek fails in branch-2. Contributed by Brahma Reddy Battula.

(cherry picked from commit fad8c78173)
This commit is contained in:
Akira Ajisaka 2015-03-24 06:21:14 +09:00
parent 57e297208d
commit 2742f12b58
2 changed files with 35 additions and 6 deletions

View File

@ -906,6 +906,9 @@ Release 2.7.0 - UNRELEASED
HDFS-7942. NFS: support regexp grouping in nfs.exports.allowed.hosts (brandonli)
HDFS-7881. TestHftpFileSystem#testSeek fails in branch-2.
(Brahma Reddy Battula via aajisaka)
BREAKDOWN OF HDFS-7584 SUBTASKS AND RELATED JIRAS
HDFS-7720. Quota by Storage Type API, tools and ClientNameNode

View File

@ -28,6 +28,7 @@ import java.util.StringTokenizer;
import org.apache.commons.io.input.BoundedInputStream;
import org.apache.hadoop.fs.FSInputStream;
import org.apache.http.HttpStatus;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.net.HttpHeaders;
@ -127,12 +128,7 @@ public abstract class ByteRangeInputStream extends FSInputStream {
fileLength = null;
} else {
// for non-chunked transfer-encoding, get content-length
final String cl = connection.getHeaderField(HttpHeaders.CONTENT_LENGTH);
if (cl == null) {
throw new IOException(HttpHeaders.CONTENT_LENGTH + " is missing: "
+ headers);
}
final long streamlength = Long.parseLong(cl);
long streamlength = getStreamLength(connection, headers);
fileLength = startPos + streamlength;
// Java has a bug with >2GB request streams. It won't bounds check
@ -143,6 +139,36 @@ public abstract class ByteRangeInputStream extends FSInputStream {
return in;
}
private static long getStreamLength(HttpURLConnection connection,
Map<String, List<String>> headers) throws IOException {
String cl = connection.getHeaderField(HttpHeaders.CONTENT_LENGTH);
if (cl == null) {
// Try to get the content length by parsing the content range
// because HftpFileSystem does not return the content length
// if the content is partial.
if (connection.getResponseCode() == HttpStatus.SC_PARTIAL_CONTENT) {
cl = connection.getHeaderField(HttpHeaders.CONTENT_RANGE);
return getLengthFromRange(cl);
} else {
throw new IOException(HttpHeaders.CONTENT_LENGTH + " is missing: "
+ headers);
}
}
return Long.parseLong(cl);
}
private static long getLengthFromRange(String cl) throws IOException {
try {
String[] str = cl.substring(6).split("[-/]");
return Long.parseLong(str[1]) - Long.parseLong(str[0]) + 1;
} catch (Exception e) {
throw new IOException(
"failed to get content length by parsing the content range: " + cl
+ " " + e.getMessage());
}
}
private static boolean isChunkedTransferEncoding(
final Map<String, List<String>> headers) {
return contains(headers, HttpHeaders.TRANSFER_ENCODING, "chunked")