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

This commit is contained in:
Akira Ajisaka 2015-03-24 06:21:14 +09:00
parent 4e0c48703e
commit fad8c78173
2 changed files with 35 additions and 6 deletions

View File

@ -931,6 +931,9 @@ Release 2.7.0 - UNRELEASED
HDFS-7942. NFS: support regexp grouping in nfs.exports.allowed.hosts (brandonli) 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 BREAKDOWN OF HDFS-7584 SUBTASKS AND RELATED JIRAS
HDFS-7720. Quota by Storage Type API, tools and ClientNameNode 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.commons.io.input.BoundedInputStream;
import org.apache.hadoop.fs.FSInputStream; import org.apache.hadoop.fs.FSInputStream;
import org.apache.http.HttpStatus;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.net.HttpHeaders; import com.google.common.net.HttpHeaders;
@ -127,12 +128,7 @@ public abstract class ByteRangeInputStream extends FSInputStream {
fileLength = null; fileLength = null;
} else { } else {
// for non-chunked transfer-encoding, get content-length // for non-chunked transfer-encoding, get content-length
final String cl = connection.getHeaderField(HttpHeaders.CONTENT_LENGTH); long streamlength = getStreamLength(connection, headers);
if (cl == null) {
throw new IOException(HttpHeaders.CONTENT_LENGTH + " is missing: "
+ headers);
}
final long streamlength = Long.parseLong(cl);
fileLength = startPos + streamlength; fileLength = startPos + streamlength;
// Java has a bug with >2GB request streams. It won't bounds check // 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; 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( private static boolean isChunkedTransferEncoding(
final Map<String, List<String>> headers) { final Map<String, List<String>> headers) {
return contains(headers, HttpHeaders.TRANSFER_ENCODING, "chunked") return contains(headers, HttpHeaders.TRANSFER_ENCODING, "chunked")