YARN-6246. Identifying starved apps does not need the scheduler writelock

(Contributed by Karthik Kambatla via Daniel Templeton)
This commit is contained in:
Daniel Templeton 2017-05-31 15:48:04 -07:00
parent 4369690ce6
commit d5b71e4175
4 changed files with 38 additions and 21 deletions

View File

@ -198,13 +198,10 @@ public void collectSchedulerApplications(
}
@Override
public void updateInternal(boolean checkStarvation) {
void updateInternal() {
readLock.lock();
try {
policy.computeShares(runnableApps, getFairShare());
if (checkStarvation) {
updateStarvedApps();
}
} finally {
readLock.unlock();
}
@ -283,8 +280,10 @@ private void updateStarvedAppsMinshare(
* If this queue is starving due to fairshare, there must be at least
* one application that is starved. And, even if the queue is not
* starved due to fairshare, there might still be starved applications.
*
* Caller does not need read/write lock on the leaf queue.
*/
private void updateStarvedApps() {
void updateStarvedApps() {
// Fetch apps with pending demand
TreeSet<FSAppAttempt> appsWithDemand = fetchAppsWithDemand(false);

View File

@ -79,13 +79,13 @@ void removeChildQueue(FSQueue child) {
}
@Override
public void updateInternal(boolean checkStarvation) {
void updateInternal() {
readLock.lock();
try {
policy.computeShares(childQueues, getFairShare());
for (FSQueue childQueue : childQueues) {
childQueue.getMetrics().setFairShare(childQueue.getFairShare());
childQueue.updateInternal(checkStarvation);
childQueue.updateInternal();
}
} finally {
readLock.unlock();

View File

@ -326,16 +326,23 @@ public boolean isPreemptable() {
/**
* Recomputes the shares for all child queues and applications based on this
* queue's current share, and checks for starvation.
* queue's current share.
*
* @param checkStarvation whether to check for fairshare or minshare
* starvation on update
* To be called holding the scheduler writelock.
*/
abstract void updateInternal(boolean checkStarvation);
abstract void updateInternal();
public void update(Resource fairShare, boolean checkStarvation) {
/**
* Set the queue's fairshare and update the demand/fairshare of child
* queues/applications.
*
* To be called holding the scheduler writelock.
*
* @param fairShare
*/
public void update(Resource fairShare) {
setFairShare(fairShare);
updateInternal(checkStarvation);
updateInternal();
}
/**

View File

@ -366,20 +366,31 @@ private void dumpSchedulerState() {
*/
@VisibleForTesting
public void update() {
try {
writeLock.lock();
FSQueue rootQueue = queueMgr.getRootQueue();
// Update demands and fairshares
writeLock.lock();
try {
// Recursively update demands for all queues
rootQueue.updateDemand();
Resource clusterResource = getClusterResource();
rootQueue.update(clusterResource, shouldAttemptPreemption());
rootQueue.update(getClusterResource());
// Update metrics
updateRootQueueMetrics();
} finally {
writeLock.unlock();
}
readLock.lock();
try {
// Update starvation stats and identify starved applications
if (shouldAttemptPreemption()) {
for (FSLeafQueue queue : queueMgr.getLeafQueues()) {
queue.updateStarvedApps();
}
}
// Log debug information
if (LOG.isDebugEnabled()) {
if (--updatesToSkipForDebug < 0) {
updatesToSkipForDebug = UPDATE_DEBUG_FREQUENCY;
@ -387,7 +398,7 @@ public void update() {
}
}
} finally {
writeLock.unlock();
readLock.unlock();
}
}