Bladeren bron

Merge -c 1497922 from trunk to branch-2 to fix HADOOP-9665. Fixed BlockDecompressorStream#decompress to return -1 rather than throw EOF at end of file. Contributed by Zhijie Shen.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1497923 13f79535-47bb-0310-9956-ffa450edef68
Arun Murthy 12 jaren geleden
bovenliggende
commit
448d56ad31

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -509,6 +509,9 @@ Release 2.1.0-beta - 2013-07-02
     HADOOP-9264. Port change to use Java untar API on Windows from 
     branch-1-win to trunk. (Chris Nauroth via suresh)
 
+    HADOOP-9665. Fixed BlockDecompressorStream#decompress to return -1 rather
+    than throw EOF at end of file. (Zhijie Shen via acmurthy)
+
 Release 2.0.5-alpha - 06/06/2013
 
   INCOMPATIBLE CHANGES

+ 7 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockDecompressorStream.java

@@ -93,7 +93,13 @@ public class BlockDecompressorStream extends DecompressorStream {
         }
       }
       if (decompressor.needsInput()) {
-        int m = getCompressedData();
+        int m;
+        try {
+          m = getCompressedData();
+        } catch (EOFException e) {
+          eof = true;
+          return -1;
+        }
         // Send the read data to the decompressor
         decompressor.setInput(buffer, 0, m);
       }

+ 23 - 4
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/compress/TestBlockDecompressorStream.java

@@ -17,14 +17,16 @@
  */
 package org.apache.hadoop.io.compress;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.nio.ByteBuffer;
 
 import org.apache.hadoop.conf.Configuration;
-
 import org.junit.Test;
-import static org.junit.Assert.*;
 
 public class TestBlockDecompressorStream {
   
@@ -33,9 +35,23 @@ public class TestBlockDecompressorStream {
   private ByteArrayOutputStream bytesOut;
 
   @Test
-  public void testRead() throws IOException {
+  public void testRead1() throws IOException {
+    testRead(0);
+  }
+
+  @Test
+  public void testRead2() throws IOException {
+    // Test eof after getting non-zero block size info
+    testRead(4);
+  }
+
+  private void testRead(int bufLen) throws IOException {
     // compress empty stream
     bytesOut = new ByteArrayOutputStream();
+    if (bufLen > 0) {
+      bytesOut.write(ByteBuffer.allocate(bufLen).putInt(1024).array(), 0,
+          bufLen);
+    }
     BlockCompressorStream blockCompressorStream = 
       new BlockCompressorStream(bytesOut, 
           new FakeCompressor(), 1024, 0);
@@ -44,7 +60,8 @@ public class TestBlockDecompressorStream {
     
     // check compressed output 
     buf = bytesOut.toByteArray();
-    assertEquals("empty file compressed output size is not 4", 4, buf.length);
+    assertEquals("empty file compressed output size is not " + (bufLen + 4),
+        bufLen + 4, buf.length);
     
     // use compressed output as input for decompression
     bytesIn = new ByteArrayInputStream(buf);
@@ -57,6 +74,8 @@ public class TestBlockDecompressorStream {
           -1 , blockDecompressorStream.read());
     } catch (IOException e) {
       fail("unexpected IOException : " + e);
+    } finally {
+      blockDecompressorStream.close();
     }
   }
 }