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


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/b5ca649b
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/b5ca649b
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/b5ca649b

Branch: refs/heads/HADOOP-11890
Commit: b5ca649bff01c906033d71c9f983b4cdaa71a9d1
Parents: 3dadf36
Author: Tsuyoshi Ozawa <oz...@apache.org>
Authored: Thu Oct 22 11:55:25 2015 +0900
Committer: Tsuyoshi Ozawa <oz...@apache.org>
Committed: Thu Oct 22 11:55:25 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/b5ca649b/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 7edf5cd..5acf369 100644
--- a/hadoop-common-project/hadoop-common/CHANGES.txt
+++ b/hadoop-common-project/hadoop-common/CHANGES.txt
@@ -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()

http://git-wip-us.apache.org/repos/asf/hadoop/blob/b5ca649b/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/b5ca649b/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

Reply via email to