From c97f8b6d95979cb61b3d564adf3c3c1e3fc7675e Mon Sep 17 00:00:00 2001 From: Surendra Singh Lilhore Date: Tue, 13 Nov 2018 20:22:58 +0530 Subject: [PATCH] HADOOP-15869. BlockDecompressorStream#decompress should not return -1 in case of IOException. Contributed by Surendra Singh Lilhore (cherry picked from commit 75291e6d53c13debf45493a870a898b63779914b) --- .../io/compress/BlockDecompressorStream.java | 4 +-- .../compress/TestBlockDecompressorStream.java | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockDecompressorStream.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockDecompressorStream.java index 72509c72c7d..de457d19240 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockDecompressorStream.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/compress/BlockDecompressorStream.java @@ -71,8 +71,8 @@ protected int decompress(byte[] b, int off, int len) throws IOException { if (noUncompressedBytes == originalBlockSize) { // Get original data size try { - originalBlockSize = rawReadInt(); - } catch (IOException ioe) { + originalBlockSize = rawReadInt(); + } catch (EOFException e) { return -1; } noUncompressedBytes = 0; diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/compress/TestBlockDecompressorStream.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/compress/TestBlockDecompressorStream.java index c976572877b..cdab772e2fc 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/compress/TestBlockDecompressorStream.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/compress/TestBlockDecompressorStream.java @@ -18,11 +18,15 @@ package org.apache.hadoop.io.compress; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.nio.ByteBuffer; import org.junit.Test; @@ -74,4 +78,29 @@ private void testRead(int bufLen) throws IOException { fail("unexpected IOException : " + e); } } + + @Test + public void testReadWhenIoExceptionOccure() throws IOException { + File file = new File("testReadWhenIOException"); + try { + file.createNewFile(); + InputStream io = new FileInputStream(file) { + @Override + public int read() throws IOException { + throw new IOException("File blocks missing"); + } + }; + + try (BlockDecompressorStream blockDecompressorStream = + new BlockDecompressorStream(io, new FakeDecompressor(), 1024)) { + int byteRead = blockDecompressorStream.read(); + fail("Should not return -1 in case of IOException. Byte read " + + byteRead); + } catch (IOException e) { + assertTrue(e.getMessage().contains("File blocks missing")); + } + } finally { + file.delete(); + } + } } \ No newline at end of file