Ver Fonte

HDFS-1118. Fix socketleak on DFSClient.
(Zheng Shao via dhruba)



git-svn-id: https://svn.apache.org/repos/asf/hadoop/hdfs/trunk@956328 13f79535-47bb-0310-9956-ffa450edef68

Dhruba Borthakur há 15 anos atrás
pai
commit
9c123a5e13
2 ficheiros alterados com 13 adições e 3 exclusões
  1. 3 1
      CHANGES.txt
  2. 10 2
      src/java/org/apache/hadoop/hdfs/DFSOutputStream.java

+ 3 - 1
CHANGES.txt

@@ -87,7 +87,9 @@ Trunk (unreleased changes)
     HDFS-1080. SecondaryNameNode image transfer should use the defined http 
     address rather than local ip address. (jghoman)
 
-    HDSF-1198. Resolving cross-realm principals. (Jitendra Pandey via jghoman)
+    HDFS-1198. Resolving cross-realm principals. (Jitendra Pandey via jghoman)
+
+    HDFS-1118. Fix socketleak on DFSClient. (Zheng Shao via dhruba)
 
 Release 0.21.0 - Unreleased
 

+ 10 - 2
src/java/org/apache/hadoop/hdfs/DFSOutputStream.java

@@ -60,6 +60,7 @@ import org.apache.hadoop.hdfs.server.namenode.NotReplicatedYetException;
 import org.apache.hadoop.hdfs.server.namenode.SafeModeException;
 import org.apache.hadoop.io.EnumSetWritable;
 import org.apache.hadoop.io.Text;
+import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.ipc.RemoteException;
 import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.security.AccessControlException;
@@ -853,6 +854,7 @@ class DFSOutputStream extends FSOutputSummer implements Syncable {
       // persist blocks on namenode on next flush
       persistBlocks.set(true);
 
+      boolean result = false;
       try {
         DFSClient.LOG.debug("Connecting to " + nodes[0].getName());
         InetSocketAddress target = NetUtils.createSocketAddr(nodes[0].getName());
@@ -895,7 +897,7 @@ class DFSOutputStream extends FSOutputSummer implements Syncable {
         }
 
         blockStream = out;
-        return true; // success
+        result =  true; // success
 
       } catch (IOException ie) {
 
@@ -915,8 +917,14 @@ class DFSOutputStream extends FSOutputSummer implements Syncable {
         hasError = true;
         setLastException(ie);
         blockReplyStream = null;
-        return false;  // error
+        result =  false;  // error
+      } finally {
+        if (!result) {
+          IOUtils.closeSocket(s);
+          s = null;
+        }
       }
+      return result;
     }
 
     private LocatedBlock locateFollowingBlock(long start,