|
@@ -127,9 +127,10 @@ public class AppSchedulingInfo {
|
|
|
* by the application.
|
|
|
*
|
|
|
* @param requests resources to be acquired
|
|
|
+ * @param recoverPreemptedRequest recover Resource Request on preemption
|
|
|
*/
|
|
|
synchronized public void updateResourceRequests(
|
|
|
- List<ResourceRequest> requests) {
|
|
|
+ List<ResourceRequest> requests, boolean recoverPreemptedRequest) {
|
|
|
QueueMetrics metrics = queue.getMetrics();
|
|
|
|
|
|
// Update resource requests
|
|
@@ -163,8 +164,13 @@ public class AppSchedulingInfo {
|
|
|
asks = new HashMap<String, ResourceRequest>();
|
|
|
this.requests.put(priority, asks);
|
|
|
this.priorities.add(priority);
|
|
|
- } else if (updatePendingResources) {
|
|
|
- lastRequest = asks.get(resourceName);
|
|
|
+ }
|
|
|
+ lastRequest = asks.get(resourceName);
|
|
|
+
|
|
|
+ if (recoverPreemptedRequest && lastRequest != null) {
|
|
|
+ // Increment the number of containers to 1, as it is recovering a
|
|
|
+ // single container.
|
|
|
+ request.setNumContainers(lastRequest.getNumContainers() + 1);
|
|
|
}
|
|
|
|
|
|
asks.put(resourceName, request);
|
|
@@ -254,14 +260,16 @@ public class AppSchedulingInfo {
|
|
|
* @param container
|
|
|
* the containers allocated.
|
|
|
*/
|
|
|
- synchronized public void allocate(NodeType type, SchedulerNode node,
|
|
|
- Priority priority, ResourceRequest request, Container container) {
|
|
|
+ synchronized public List<ResourceRequest> allocate(NodeType type,
|
|
|
+ SchedulerNode node, Priority priority, ResourceRequest request,
|
|
|
+ Container container) {
|
|
|
+ List<ResourceRequest> resourceRequests = new ArrayList<ResourceRequest>();
|
|
|
if (type == NodeType.NODE_LOCAL) {
|
|
|
- allocateNodeLocal(node, priority, request, container);
|
|
|
+ allocateNodeLocal(node, priority, request, container, resourceRequests);
|
|
|
} else if (type == NodeType.RACK_LOCAL) {
|
|
|
- allocateRackLocal(node, priority, request, container);
|
|
|
+ allocateRackLocal(node, priority, request, container, resourceRequests);
|
|
|
} else {
|
|
|
- allocateOffSwitch(node, priority, request, container);
|
|
|
+ allocateOffSwitch(node, priority, request, container, resourceRequests);
|
|
|
}
|
|
|
QueueMetrics metrics = queue.getMetrics();
|
|
|
if (pending) {
|
|
@@ -279,6 +287,7 @@ public class AppSchedulingInfo {
|
|
|
+ " resource=" + request.getCapability());
|
|
|
}
|
|
|
metrics.allocateResources(user, 1, request.getCapability(), true);
|
|
|
+ return resourceRequests;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -288,9 +297,9 @@ public class AppSchedulingInfo {
|
|
|
* @param allocatedContainers
|
|
|
* resources allocated to the application
|
|
|
*/
|
|
|
- synchronized private void allocateNodeLocal(
|
|
|
- SchedulerNode node, Priority priority,
|
|
|
- ResourceRequest nodeLocalRequest, Container container) {
|
|
|
+ synchronized private void allocateNodeLocal(SchedulerNode node,
|
|
|
+ Priority priority, ResourceRequest nodeLocalRequest, Container container,
|
|
|
+ List<ResourceRequest> resourceRequests) {
|
|
|
// Update future requirements
|
|
|
nodeLocalRequest.setNumContainers(nodeLocalRequest.getNumContainers() - 1);
|
|
|
if (nodeLocalRequest.getNumContainers() == 0) {
|
|
@@ -304,7 +313,14 @@ public class AppSchedulingInfo {
|
|
|
this.requests.get(priority).remove(node.getRackName());
|
|
|
}
|
|
|
|
|
|
- decrementOutstanding(requests.get(priority).get(ResourceRequest.ANY));
|
|
|
+ ResourceRequest offRackRequest = requests.get(priority).get(
|
|
|
+ ResourceRequest.ANY);
|
|
|
+ decrementOutstanding(offRackRequest);
|
|
|
+
|
|
|
+ // Update cloned NodeLocal, RackLocal and OffRack requests for recovery
|
|
|
+ resourceRequests.add(cloneResourceRequest(nodeLocalRequest));
|
|
|
+ resourceRequests.add(cloneResourceRequest(rackLocalRequest));
|
|
|
+ resourceRequests.add(cloneResourceRequest(offRackRequest));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -314,16 +330,22 @@ public class AppSchedulingInfo {
|
|
|
* @param allocatedContainers
|
|
|
* resources allocated to the application
|
|
|
*/
|
|
|
- synchronized private void allocateRackLocal(
|
|
|
- SchedulerNode node, Priority priority,
|
|
|
- ResourceRequest rackLocalRequest, Container container) {
|
|
|
+ synchronized private void allocateRackLocal(SchedulerNode node,
|
|
|
+ Priority priority, ResourceRequest rackLocalRequest, Container container,
|
|
|
+ List<ResourceRequest> resourceRequests) {
|
|
|
// Update future requirements
|
|
|
rackLocalRequest.setNumContainers(rackLocalRequest.getNumContainers() - 1);
|
|
|
if (rackLocalRequest.getNumContainers() == 0) {
|
|
|
this.requests.get(priority).remove(node.getRackName());
|
|
|
}
|
|
|
|
|
|
- decrementOutstanding(requests.get(priority).get(ResourceRequest.ANY));
|
|
|
+ ResourceRequest offRackRequest = requests.get(priority).get(
|
|
|
+ ResourceRequest.ANY);
|
|
|
+ decrementOutstanding(offRackRequest);
|
|
|
+
|
|
|
+ // Update cloned RackLocal and OffRack requests for recovery
|
|
|
+ resourceRequests.add(cloneResourceRequest(rackLocalRequest));
|
|
|
+ resourceRequests.add(cloneResourceRequest(offRackRequest));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -333,11 +355,13 @@ public class AppSchedulingInfo {
|
|
|
* @param allocatedContainers
|
|
|
* resources allocated to the application
|
|
|
*/
|
|
|
- synchronized private void allocateOffSwitch(
|
|
|
- SchedulerNode node, Priority priority,
|
|
|
- ResourceRequest offSwitchRequest, Container container) {
|
|
|
+ synchronized private void allocateOffSwitch(SchedulerNode node,
|
|
|
+ Priority priority, ResourceRequest offSwitchRequest, Container container,
|
|
|
+ List<ResourceRequest> resourceRequests) {
|
|
|
// Update future requirements
|
|
|
decrementOutstanding(offSwitchRequest);
|
|
|
+ // Update cloned RackLocal and OffRack requests for recovery
|
|
|
+ resourceRequests.add(cloneResourceRequest(offSwitchRequest));
|
|
|
}
|
|
|
|
|
|
synchronized private void decrementOutstanding(
|
|
@@ -436,4 +460,11 @@ public class AppSchedulingInfo {
|
|
|
metrics.allocateResources(user, 1, rmContainer.getAllocatedResource(),
|
|
|
false);
|
|
|
}
|
|
|
+
|
|
|
+ public ResourceRequest cloneResourceRequest(ResourceRequest request) {
|
|
|
+ ResourceRequest newRequest = ResourceRequest.newInstance(
|
|
|
+ request.getPriority(), request.getResourceName(),
|
|
|
+ request.getCapability(), 1, request.getRelaxLocality());
|
|
|
+ return newRequest;
|
|
|
+ }
|
|
|
}
|