@Override public Integer getValue() { return app.getResourceUsage().getVirtualCores(); } }
/** * Get the current app's unsatisfied demand. */ Resource getPendingDemand() { return Resources.subtract(demand, getResourceUsage()); }
@Override public Integer getValue() { return app.getResourceUsage().getMemory(); } }
@Override public Resource getResourceUsage() { Resource usage = Resources.createResource(0); readLock.lock(); try { for (FSAppAttempt app : runnableApps) { Resources.addTo(usage, app.getResourceUsage()); } for (FSAppAttempt app : nonRunnableApps) { Resources.addTo(usage, app.getResourceUsage()); } } finally { readLock.unlock(); } return usage; }
void addApp(FSAppAttempt app, boolean runnable) { writeLock.lock(); try { if (runnable) { runnableApps.add(app); } else { nonRunnableApps.add(app); } // when an appAttempt is created for an application, we'd like to move // it over from assignedApps to either runnableApps or nonRunnableApps assignedApps.remove(app.getApplicationId()); incUsedResource(app.getResourceUsage()); } finally { writeLock.unlock(); } }
@Override public Resource getResourceUsage() { Resource usage = Resources.createResource(0); readLock.lock(); try { for (FSAppAttempt app : runnableApps) { Resources.addTo(usage, app.getResourceUsage()); } for (FSAppAttempt app : nonRunnableApps) { Resources.addTo(usage, app.getResourceUsage()); } } finally { readLock.unlock(); } return usage; }
/** * Helper method that captures if this app is identified to be starved. * @return true if the app is starved for fairshare, false otherwise */ boolean isStarvedForFairShare() { return isUsageBelowShare(getResourceUsage(), getFairShare()); }
/** * Removes the given app from this queue. * @return whether or not the app was runnable */ boolean removeApp(FSAppAttempt app) { boolean runnable = false; // Remove app from runnable/nonRunnable list while holding the write lock writeLock.lock(); try { runnable = runnableApps.remove(app); if (!runnable) { // removeNonRunnableApp acquires the write lock again, which is fine if (!removeNonRunnableApp(app)) { throw new IllegalStateException("Given app to remove " + app + " does not exist in queue " + this); } } } finally { writeLock.unlock(); } // Update AM resource usage if needed. If isAMRunning is true, we're not // running an unmanaged AM. if (runnable && app.isAmRunning()) { Resources.subtractFrom(amResourceUsage, app.getAMResource()); getMetrics().setAMResourceUsage(amResourceUsage); } decUsedResource(app.getResourceUsage()); return runnable; }
private Resource getUsageAfterPreemptingContainer(Resource containerResources, Resource alreadyConsideringForPreemption) { Resource usageAfterPreemption = Resources.clone(getResourceUsage()); // Subtract resources of containers already queued for preemption synchronized (preemptionVariablesLock) { Resources.subtractFrom(usageAfterPreemption, resourcesToBePreempted); } // Subtract resources of this container and other containers of this app // that the FSPreemptionThread is already considering for preemption. Resources.subtractFrom(usageAfterPreemption, containerResources); Resources.subtractFrom(usageAfterPreemption, alreadyConsideringForPreemption); return usageAfterPreemption; }
/** * Helper method that computes the extent of fairshare starvation. * @return freshly computed fairshare starvation */ Resource fairShareStarvation() { long now = scheduler.getClock().getTime(); Resource threshold = Resources.multiply( getFairShare(), getQueue().getFairSharePreemptionThreshold()); Resource fairDemand = Resources.componentwiseMin(threshold, demand); // Check if the queue is starved for fairshare boolean starved = isUsageBelowShare(getResourceUsage(), fairDemand); if (!starved) { lastTimeAtFairShare = now; } if (!starved || now - lastTimeAtFairShare < getQueue().getFairSharePreemptionTimeout()) { fairshareStarvation = Resources.none(); } else { // The app has been starved for longer than preemption-timeout. fairshareStarvation = Resources.subtractFromNonNegative(fairDemand, getResourceUsage()); } return fairshareStarvation; }
FSAppAttempt app = mock(FSAppAttempt.class); Mockito.when(app.getDemand()).thenReturn(resource); Mockito.when(app.getResourceUsage()).thenReturn(resource); child1.addApp(app, true); child1.updateDemand();
SchedulerUtils.COMPLETED_APPLICATION), RMContainerEventType.FINISHED); assertEquals(Resources.none(), app1.getResourceUsage());
Mockito.when(app1.getResourceUsage()).thenReturn(Resources.none()); FSAppAttempt app2 = mock(FSAppAttempt.class); Mockito.when(app2.getDemand()).thenReturn(maxResource); Mockito.when(app2.getResourceUsage()).thenReturn(Resources.none());
@Test public void testUpdateDemand() { conf.set(FairSchedulerConfiguration.ASSIGN_MULTIPLE, "false"); resourceManager = new MockRM(conf); resourceManager.start(); scheduler = (FairScheduler) resourceManager.getResourceScheduler(); String queueName = "root.queue1"; FSLeafQueue schedulable = new FSLeafQueue(queueName, scheduler, null); schedulable.setMaxShare(new ConfigurableResource(maxResource)); assertEquals(schedulable.getMetrics().getMaxApps(), Integer.MAX_VALUE); assertEquals(schedulable.getMetrics().getSchedulingPolicy(), SchedulingPolicy.DEFAULT_POLICY.getName()); FSAppAttempt app = mock(FSAppAttempt.class); Mockito.when(app.getDemand()).thenReturn(maxResource); Mockito.when(app.getResourceUsage()).thenReturn(Resources.none()); schedulable.addApp(app, true); schedulable.addApp(app, true); schedulable.updateDemand(); assertTrue("Demand is greater than max allowed ", Resources.equals(schedulable.getDemand(), maxResource)); }
0, app1.getLiveContainers().size()); assertEquals("Finished application usage should be none", Resources.none(), app1.getResourceUsage()); assertEquals("Application3's AM should be running", 1, app3.getLiveContainers().size()); 0, app4.getLiveContainers().size()); assertEquals("Finished application usage should be none", Resources.none(), app4.getResourceUsage()); assertEquals("Queue1's AM resource usage should be 2048 MB memory", 2048, queue1.getAmResourceUsage().getMemorySize()); 0, app5.getLiveContainers().size()); assertEquals("Finished application usage should be none", Resources.none(), app5.getResourceUsage()); assertEquals("Queue1's AM resource usage should be 2048 MB memory", 2048, queue1.getAmResourceUsage().getMemorySize()); 0, app5.getLiveContainers().size()); assertEquals("Finished application usage should be none", Resources.none(), app5.getResourceUsage()); assertEquals("Queue1's AM resource usage should be 2048 MB memory", 2048, queue1.getAmResourceUsage().getMemorySize()); 0, app2.getLiveContainers().size()); assertEquals("Finished application usage should be none", Resources.none(), app2.getResourceUsage()); assertEquals("Application3's AM should be finished", 0, app3.getLiveContainers().size());