HDFS-7881. TestHftpFileSystem#testSeek fails in branch-2. Contributed by Brahma Reddy Battula.
This commit is contained in:
parent
4e0c48703e
commit
fad8c78173
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue