MAPREDUCE-2631. Potential resource leaks in BinaryProtocol$TeeOutputStream.java. Contributed by Sunil G.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/28660f51 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/28660f51 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/28660f51 Branch: refs/heads/HDFS-9806 Commit: 28660f51af161a9fa301523d96a6f8ae4ebd6edd Parents: 5877f20 Author: Naganarasimha <naganarasimha...@apache.org> Authored: Fri Oct 28 05:50:13 2016 +0530 Committer: Naganarasimha <naganarasimha...@apache.org> Committed: Fri Oct 28 05:50:13 2016 +0530 ---------------------------------------------------------------------- .../apache/hadoop/mapred/IFileOutputStream.java | 8 ++++++-- .../hadoop/mapred/pipes/BinaryProtocol.java | 14 +++++++++----- .../apache/hadoop/mapred/TestIFileStreams.java | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/28660f51/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/IFileOutputStream.java ---------------------------------------------------------------------- diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/IFileOutputStream.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/IFileOutputStream.java index 8f25ba7..08bcd24 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/IFileOutputStream.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/IFileOutputStream.java @@ -24,6 +24,7 @@ import java.io.FilterOutputStream; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.DataChecksum; /** * A Checksum output stream. @@ -60,8 +61,11 @@ public class IFileOutputStream extends FilterOutputStream { return; } closed = true; - finish(); - out.close(); + try { + finish(); + } finally { + IOUtils.closeStream(out); + } } /** http://git-wip-us.apache.org/repos/asf/hadoop/blob/28660f51/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/BinaryProtocol.java ---------------------------------------------------------------------- diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/BinaryProtocol.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/BinaryProtocol.java index ebfb184..5a3ed5b 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/BinaryProtocol.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/BinaryProtocol.java @@ -36,6 +36,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.DataOutputBuffer; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writable; import org.apache.hadoop.io.WritableComparable; @@ -200,8 +201,8 @@ class BinaryProtocol<K1 extends WritableComparable, V1 extends Writable, file = new FileOutputStream(filename); } public void write(byte b[], int off, int len) throws IOException { - file.write(b,off,len); - out.write(b,off,len); + file.write(b, off, len); + out.write(b, off, len); } public void write(int b) throws IOException { @@ -215,9 +216,12 @@ class BinaryProtocol<K1 extends WritableComparable, V1 extends Writable, } public void close() throws IOException { - flush(); - file.close(); - out.close(); + try { + flush(); + } finally { + IOUtils.closeStream(file); + IOUtils.closeStream(out); + } } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/28660f51/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestIFileStreams.java ---------------------------------------------------------------------- diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestIFileStreams.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestIFileStreams.java index 2b97d3b..a815b28 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestIFileStreams.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestIFileStreams.java @@ -22,7 +22,13 @@ import org.apache.hadoop.fs.ChecksumException; import org.apache.hadoop.io.DataInputBuffer; import org.apache.hadoop.io.DataOutputBuffer; import org.junit.Test; +import org.mockito.Mockito; + import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.OutputStream; + import static org.junit.Assert.assertEquals; public class TestIFileStreams { @@ -99,4 +105,18 @@ public class TestIFileStreams { fail("Did not detect bad data in checksum"); } + @Test + public void testCloseStreamOnException() throws Exception { + OutputStream outputStream = Mockito.mock(OutputStream.class); + IFileOutputStream ifos = new IFileOutputStream(outputStream); + Mockito.doThrow(new IOException("Dummy Exception")).when(outputStream) + .flush(); + try { + ifos.close(); + fail("IOException is not thrown"); + } catch (IOException ioe) { + assertEquals("Dummy Exception", ioe.getMessage()); + } + Mockito.verify(outputStream).close(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org