From 9eb96b0fbfae5b7232556fa9a4235fb976ee6d47 Mon Sep 17 00:00:00 2001 From: Sunil G Date: Thu, 4 Jul 2019 11:05:54 +0530 Subject: [PATCH] YARN-9644. First RMContext object is always leaked during switch over. Contributed by Bibin A Chundatt. (cherry picked from commit d18986e4e89bd4bb3600e95b4690fd32f54a41e5) --- .../hadoop/yarn/server/resourcemanager/RMNMInfo.java | 11 ++++++++--- .../yarn/server/resourcemanager/ResourceManager.java | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java index 1b7ddd3b278..18cf6f035a0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMNMInfo.java @@ -25,6 +25,7 @@ import java.util.LinkedHashMap; import java.util.List; import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; import javax.management.StandardMBean; import org.apache.commons.logging.Log; @@ -42,6 +43,7 @@ public class RMNMInfo implements RMNMInfoBeans { private static final Log LOG = LogFactory.getLog(RMNMInfo.class); private RMContext rmContext; private ResourceScheduler scheduler; + private ObjectName mbeanObjectName; /** * Constructor for RMNMInfo registers the bean with JMX. @@ -55,14 +57,17 @@ public class RMNMInfo implements RMNMInfoBeans { StandardMBean bean; try { - bean = new StandardMBean(this,RMNMInfoBeans.class); - MBeans.register("ResourceManager", "RMNMInfo", bean); + bean = new StandardMBean(this, RMNMInfoBeans.class); + mbeanObjectName = MBeans.register("ResourceManager", "RMNMInfo", bean); } catch (NotCompliantMBeanException e) { - LOG.warn("Error registering RMNMInfo MBean", e); + LOG.warn("Error registering RMNMInfo MBean", e); } LOG.info("Registered RMNMInfo MBean"); } + public void unregister() { + MBeans.unregister(mbeanObjectName); + } static class InfoMap extends LinkedHashMap { private static final long serialVersionUID = 1L; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index d459f0e952b..d1a4e34fb71 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -616,6 +616,7 @@ public class ResourceManager extends CompositeService private ResourceManager rm; private boolean fromActive = false; private StandByTransitionRunnable standByTransitionRunnable; + private RMNMInfo rmnmInfo; RMActiveServices(ResourceManager rm) { super("RMActiveServices"); @@ -806,7 +807,7 @@ public class ResourceManager extends CompositeService LOG.info("Initialized Federation membership."); } - new RMNMInfo(rmContext, scheduler); + rmnmInfo = new RMNMInfo(rmContext, scheduler); if (conf.getBoolean(YarnConfiguration.YARN_API_SERVICES_ENABLE, false)) { @@ -875,6 +876,10 @@ public class ResourceManager extends CompositeService super.serviceStop(); DefaultMetricsSystem.shutdown(); + // unregister rmnmInfo bean + if (rmnmInfo != null) { + rmnmInfo.unregister(); + } if (rmContext != null) { RMStateStore store = rmContext.getStateStore(); try { @@ -1132,9 +1137,9 @@ public class ResourceManager extends CompositeService params.put("com.sun.jersey.config.property.packages", apiPackages); } - Builder builder = + Builder builder = WebApps - .$for("cluster", ApplicationMasterService.class, masterService, + .$for("cluster", ResourceManager.class, this, "ws") .with(conf) .withServlet("API-Service", "/app/*",