Bläddra i källkod

YARN-8336. Fix potential connection leak in SchedConfCLI and YarnWebServiceUtils. Contributed by Giovanni Matteo Fumarola.

Inigo Goiri 7 år sedan
förälder
incheckning
e30938af12

+ 26 - 16
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/SchedConfCLI.java

@@ -132,25 +132,35 @@ public class SchedConfCLI extends Configured implements Tool {
     }
     }
 
 
     Client webServiceClient = Client.create();
     Client webServiceClient = Client.create();
-    WebResource webResource = webServiceClient.resource(WebAppUtils.
-        getRMWebAppURLWithScheme(getConf()));
-    ClientResponse response = webResource.path("ws").path("v1").path("cluster")
-        .path("scheduler-conf").accept(MediaType.APPLICATION_JSON)
-        .entity(YarnWebServiceUtils.toJson(updateInfo,
-            SchedConfUpdateInfo.class), MediaType.APPLICATION_JSON)
-        .put(ClientResponse.class);
-    if (response != null) {
-      if (response.getStatus() == Status.OK.getStatusCode()) {
-        System.out.println("Configuration changed successfully.");
-        return 0;
+    WebResource webResource = webServiceClient
+        .resource(WebAppUtils.getRMWebAppURLWithScheme(getConf()));
+    ClientResponse response = null;
+
+    try {
+      response =
+          webResource.path("ws").path("v1").path("cluster")
+              .path("scheduler-conf").accept(MediaType.APPLICATION_JSON)
+              .entity(YarnWebServiceUtils.toJson(updateInfo,
+                  SchedConfUpdateInfo.class), MediaType.APPLICATION_JSON)
+              .put(ClientResponse.class);
+      if (response != null) {
+        if (response.getStatus() == Status.OK.getStatusCode()) {
+          System.out.println("Configuration changed successfully.");
+          return 0;
+        } else {
+          System.err.println("Configuration change unsuccessful: "
+              + response.getEntity(String.class));
+        }
       } else {
       } else {
-        System.err.println("Configuration change unsuccessful: "
-            + response.getEntity(String.class));
+        System.err.println("Configuration change unsuccessful: null response");
       }
       }
-    } else {
-      System.err.println("Configuration change unsuccessful: null response");
+      return -1;
+    } finally {
+      if (response != null) {
+        response.close();
+      }
+      webServiceClient.destroy();
     }
     }
-    return -1;
   }
   }
 
 
   @VisibleForTesting
   @VisibleForTesting

+ 12 - 5
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/YarnWebServiceUtils.java

@@ -58,11 +58,18 @@ public final class YarnWebServiceUtils {
 
 
     WebResource webResource = webServiceClient.resource(webAppAddress);
     WebResource webResource = webServiceClient.resource(webAppAddress);
 
 
-    ClientResponse response = webResource.path("ws").path("v1")
-        .path("cluster").path("nodes")
-        .path(nodeId).accept(MediaType.APPLICATION_JSON)
-        .get(ClientResponse.class);
-    return response.getEntity(JSONObject.class);
+    ClientResponse response = null;
+    try {
+      response = webResource.path("ws").path("v1").path("cluster")
+          .path("nodes").path(nodeId).accept(MediaType.APPLICATION_JSON)
+          .get(ClientResponse.class);
+      return response.getEntity(JSONObject.class);
+    } finally {
+      if (response != null) {
+        response.close();
+      }
+      webServiceClient.destroy();
+    }
   }
   }
 
 
   @SuppressWarnings("rawtypes")
   @SuppressWarnings("rawtypes")