Browse Source

HADOOP-9692. Improving log message when SequenceFile reader throws EOFException on zero-length file. (Zhe Zhang and Chu Tong via ozawa)

Tsuyoshi Ozawa 9 năm trước cách đây
mục cha
commit
513ec3de19

+ 3 - 0
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

+ 12 - 3
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();

+ 21 - 0
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