diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 8a53524d90..5dd6716f5a 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -80,6 +80,9 @@ Trunk (unreleased changes) kerberos. (jitendra) BUGS + HADOOP-8006 TestFSInputChecker is failing in trunk. + (Daryn Sharp via bobby) + HADOOP-7998. CheckFileSystem does not correctly honor setVerifyChecksum (Daryn Sharp via bobby) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java index de1178930f..040f59dbb8 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/ChecksumFileSystem.java @@ -119,7 +119,6 @@ private static class ChecksumFSInputChecker extends FSInputChecker { private static final int HEADER_LENGTH = 8; private int bytesPerSum = 1; - private long fileLen = -1L; public ChecksumFSInputChecker(ChecksumFileSystem fs, Path file) throws IOException { @@ -244,6 +243,24 @@ protected int readChunk(long pos, byte[] buf, int offset, int len, } return nread; } + } + + private static class FSDataBoundedInputStream extends FSDataInputStream { + private FileSystem fs; + private Path file; + private long fileLen = -1L; + + FSDataBoundedInputStream(FileSystem fs, Path file, InputStream in) + throws IOException { + super(in); + this.fs = fs; + this.file = file; + } + + @Override + public boolean markSupported() { + return false; + } /* Return the file length */ private long getFileLength() throws IOException { @@ -304,9 +321,16 @@ public synchronized void seek(long pos) throws IOException { */ @Override public FSDataInputStream open(Path f, int bufferSize) throws IOException { - return verifyChecksum - ? new FSDataInputStream(new ChecksumFSInputChecker(this, f, bufferSize)) - : getRawFileSystem().open(f, bufferSize); + FileSystem fs; + InputStream in; + if (verifyChecksum) { + fs = this; + in = new ChecksumFSInputChecker(this, f, bufferSize); + } else { + fs = getRawFileSystem(); + in = fs.open(f, bufferSize); + } + return new FSDataBoundedInputStream(fs, f, in); } /** {@inheritDoc} */