HADOOP-9692. SequenceFile reader throws EOFException on zero-length file. Contributed by Zhe Zhang and Chu Tong.

This commit is contained in:
Tsuyoshi Ozawa 2015-10-22 11:55:25 +09:00
parent 3dadf369d5
commit b5ca649bff
3 changed files with 36 additions and 3 deletions

View File

@ -1251,6 +1251,9 @@ Release 2.8.0 - UNRELEASED
HADOOP-12483. Maintain wrapped SASL ordering for postponed IPC responses.
(Daryn Sharp via yliu)
HADOOP-9692. SequenceFile reader throws EOFException on zero-length file.
(Zhe Zhang and Chu Tong via ozawa)
OPTIMIZATIONS
HADOOP-12051. ProtobufRpcEngine.invoke() should use Exception.toString()

View File

@ -1912,17 +1912,26 @@ protected FSDataInputStream openFile(FileSystem fs, Path file,
*/
private void init(boolean tempReader) throws IOException {
byte[] versionBlock = new byte[VERSION.length];
String exceptionMsg = this + " not a SequenceFile";
// Try to read sequence file header.
try {
in.readFully(versionBlock);
} catch (EOFException e) {
throw new EOFException(exceptionMsg);
}
if ((versionBlock[0] != VERSION[0]) ||
(versionBlock[1] != VERSION[1]) ||
(versionBlock[2] != VERSION[2]))
(versionBlock[2] != VERSION[2])) {
throw new IOException(this + " not a SequenceFile");
}
// Set 'version'
version = versionBlock[3];
if (version > VERSION[3])
if (version > VERSION[3]) {
throw new VersionMismatchException(VERSION[3], version);
}
if (version < BLOCK_COMPRESS_VERSION) {
UTF8 className = new UTF8();

View File

@ -522,6 +522,27 @@ protected FSDataInputStream openFile(FileSystem fs, Path file, int bufferSize, l
assertTrue("InputStream for " + path + " should have been closed.", openedFile[0].isClosed());
}
/**
* Test to makes sure zero length sequence file is handled properly while
* initializing.
*/
public void testInitZeroLengthSequenceFile() throws IOException {
Configuration conf = new Configuration();
LocalFileSystem fs = FileSystem.getLocal(conf);
// create an empty file (which is not a valid sequence file)
Path path = new Path(System.getProperty("test.build.data", ".") +
"/zerolength.seq");
fs.create(path).close();
try {
new SequenceFile.Reader(conf, SequenceFile.Reader.file(path));
fail("IOException expected.");
} catch (IOException expected) {
assertTrue(expected instanceof EOFException);
}
}
/**
* Test that makes sure createWriter succeeds on a file that was
* already created