From e30938af1270e079587e7bc06b755f9e93e660a5 Mon Sep 17 00:00:00 2001 From: Inigo Goiri Date: Wed, 23 May 2018 11:55:31 -0700 Subject: [PATCH] YARN-8336. Fix potential connection leak in SchedConfCLI and YarnWebServiceUtils. Contributed by Giovanni Matteo Fumarola. --- .../hadoop/yarn/client/cli/SchedConfCLI.java | 42 ++++++++++++------- .../yarn/webapp/util/YarnWebServiceUtils.java | 17 +++++--- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/SchedConfCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/SchedConfCLI.java index 11bfdd7ba14..a5f3b80c50b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/SchedConfCLI.java +++ b/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(); - 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 { - 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 diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/YarnWebServiceUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/YarnWebServiceUtils.java index 1cf1e9717e4..e7bca2ca0f2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/YarnWebServiceUtils.java +++ b/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); - 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")