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

Reply via email to