Browse Source

YARN-9642. Fix Memory Leak in AbstractYarnScheduler caused by timer. Contributed by Bibin A Chundatt.

(cherry picked from commit d3ce53e5073e35e162f1725836282e4268cd26a5)
bibinchundatt 5 years ago
parent
commit
eb618e4f22

+ 10 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java

@@ -141,6 +141,7 @@ public abstract class AbstractYarnScheduler
   @VisibleForTesting
   Thread updateThread;
   private final Object updateThreadMonitor = new Object();
+  private Timer releaseCache;
 
   /*
    * All schedulers which are inheriting AbstractYarnScheduler should use
@@ -201,7 +202,7 @@ public abstract class AbstractYarnScheduler
     nodeTracker.setConfiguredMaxAllocationWaitTime(
         configuredMaximumAllocationWaitTime);
     maxClusterLevelAppPriority = getMaxPriorityFromConf(conf);
-    createReleaseCache();
+    this.releaseCache = new Timer("Pending Container Clear Timer");
     autoUpdateContainers =
         conf.getBoolean(YarnConfiguration.RM_AUTO_UPDATE_CONTAINERS,
             YarnConfiguration.DEFAULT_RM_AUTO_UPDATE_CONTAINERS);
@@ -223,6 +224,7 @@ public abstract class AbstractYarnScheduler
       updateThread.start();
     }
     schedulingMonitorManager.startAll();
+    createReleaseCache();
     super.serviceStart();
   }
 
@@ -232,6 +234,12 @@ public abstract class AbstractYarnScheduler
       updateThread.interrupt();
       updateThread.join(THREAD_JOIN_TIMEOUT_MS);
     }
+
+    //Stop Timer
+    if (releaseCache != null) {
+      releaseCache.cancel();
+      releaseCache = null;
+    }
     schedulingMonitorManager.stop();
     super.serviceStop();
   }
@@ -632,7 +640,7 @@ public abstract class AbstractYarnScheduler
 
   protected void createReleaseCache() {
     // Cleanup the cache after nm expire interval.
-    new Timer().schedule(new TimerTask() {
+    releaseCache.schedule(new TimerTask() {
       @Override
       public void run() {
         clearPendingContainerCache();