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

(cherry picked from commit d3ce53e507)
This commit is contained in:
bibinchundatt 2019-08-26 23:21:33 +05:30
parent d2bb764ffa
commit eb618e4f22
1 changed files with 10 additions and 2 deletions

View File

@ -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();