HADOOP-9692. Improving log message when SequenceFile reader throws EOFException on zero-length file. (Zhe Zhang and Chu Tong via ozawa)
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/513ec3de Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/513ec3de Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/513ec3de Branch: refs/heads/HADOOP-11890 Commit: 513ec3de194f705ca342de16829e1f85be227e7f Parents: 039a1f9 Author: Tsuyoshi Ozawa <oz...@apache.org> Authored: Thu Oct 22 11:55:25 2015 +0900 Committer: Tsuyoshi Ozawa <oz...@apache.org> Committed: Fri Oct 23 06:50:50 2015 +0900 ---------------------------------------------------------------------- hadoop-common-project/hadoop-common/CHANGES.txt | 3 +++ .../java/org/apache/hadoop/io/SequenceFile.java | 15 +++++++++++--- .../org/apache/hadoop/io/TestSequenceFile.java | 21 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/513ec3de/hadoop-common-project/hadoop-common/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 0d3daa2..a7a1d1b 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -902,6 +902,9 @@ Release 2.8.0 - UNRELEASED HADOOP-10406. TestIPC.testIpcWithReaderQueuing may fail. (Xiao Chen via wang) + HADOOP-9692. Improving log message when SequenceFile reader throws + EOFException on zero-length file. (Zhe Zhang and Chu Tong via ozawa) + OPTIMIZATIONS HADOOP-11785. Reduce the number of listStatus operation in distcp http://git-wip-us.apache.org/repos/asf/hadoop/blob/513ec3de/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/SequenceFile.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/SequenceFile.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/SequenceFile.java index e37e855..ed57eee 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/SequenceFile.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/SequenceFile.java @@ -1912,17 +1912,26 @@ public class SequenceFile { */ private void init(boolean tempReader) throws IOException { byte[] versionBlock = new byte[VERSION.length]; - in.readFully(versionBlock); + 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(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/513ec3de/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestSequenceFile.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestSequenceFile.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestSequenceFile.java index 7495c6e..99c97db 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestSequenceFile.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/TestSequenceFile.java @@ -522,6 +522,27 @@ public class TestSequenceFile extends TestCase { 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