Browse Source

MAPREDUCE-5895. Close streams properly to avoid leakage in TaskLog. Contributed by Kousuke Saruta.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1598210 13f79535-47bb-0310-9956-ffa450edef68
Devarajulu K 11 years ago
parent
commit
99c0324937

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

@@ -102,6 +102,9 @@ Release 2.5.0 - UNRELEASED
     MAPREDUCE-5862. Line records longer than 2x split size aren't handled
     MAPREDUCE-5862. Line records longer than 2x split size aren't handled
     correctly (bc Wong via jlowe)
     correctly (bc Wong via jlowe)
 
 
+    MAPREDUCE-5895. Close streams properly to avoid leakage in TaskLog. 
+    (Kousuke Saruta via devaraj)
+
 Release 2.4.1 - UNRELEASED
 Release 2.4.1 - UNRELEASED
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 14 - 10
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/TaskLog.java

@@ -199,16 +199,18 @@ public class TaskLog {
     // file first and then rename.
     // file first and then rename.
     File tmpIndexFile = getTmpIndexFile(currentTaskid, isCleanup);
     File tmpIndexFile = getTmpIndexFile(currentTaskid, isCleanup);
 
 
-    BufferedOutputStream bos = 
-      new BufferedOutputStream(
-        SecureIOUtils.createForWrite(tmpIndexFile, 0644));
-    DataOutputStream dos = new DataOutputStream(bos);
-    //the format of the index file is
-    //LOG_DIR: <the dir where the task logs are really stored>
-    //STDOUT: <start-offset in the stdout file> <length>
-    //STDERR: <start-offset in the stderr file> <length>
-    //SYSLOG: <start-offset in the syslog file> <length>   
+    BufferedOutputStream bos = null;
+    DataOutputStream dos = null;
     try{
     try{
+      bos = new BufferedOutputStream(
+          SecureIOUtils.createForWrite(tmpIndexFile, 0644));
+      dos = new DataOutputStream(bos);
+      //the format of the index file is
+      //LOG_DIR: <the dir where the task logs are really stored>
+      //STDOUT: <start-offset in the stdout file> <length>
+      //STDERR: <start-offset in the stderr file> <length>
+      //SYSLOG: <start-offset in the syslog file> <length>   
+
       dos.writeBytes(LogFileDetail.LOCATION + logLocation + "\n"
       dos.writeBytes(LogFileDetail.LOCATION + logLocation + "\n"
           + LogName.STDOUT.toString() + ":");
           + LogName.STDOUT.toString() + ":");
       dos.writeBytes(Long.toString(prevOutLength) + " ");
       dos.writeBytes(Long.toString(prevOutLength) + " ");
@@ -225,8 +227,10 @@ public class TaskLog {
           + "\n");
           + "\n");
       dos.close();
       dos.close();
       dos = null;
       dos = null;
+      bos.close();
+      bos = null;
     } finally {
     } finally {
-      IOUtils.cleanup(LOG, dos);
+      IOUtils.cleanup(LOG, dos, bos);
     }
     }
 
 
     File indexFile = getIndexFile(currentTaskid, isCleanup);
     File indexFile = getIndexFile(currentTaskid, isCleanup);