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/trunk@1497922 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Arun Murthy 2013-06-28 21:05:43 +00:00
parent c221204cca
commit 1773893c9a
3 changed files with 33 additions and 5 deletions

View File

@ -775,6 +775,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

View File

@ -93,7 +93,13 @@ protected int decompress(byte[] b, int off, int len) throws IOException {
}
}
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);
}

View File

@ -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 void testRead() throws IOException {
// 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 void testRead() throws IOException {
-1 , blockDecompressorStream.read());
} catch (IOException e) {
fail("unexpected IOException : " + e);
} finally {
blockDecompressorStream.close();
}
}
}