YARN-11732. Fix potential NPE when calling SchedulerNode#reservedContainer for CapacityScheduler (#7065). Contributed by Tao Yang.
Reviewed-by: Syed Shameerur Rahman <syedthameem1@gmail.com> Signed-off-by: He Xiaoqiao <hexiaoqiao@apache.org>
This commit is contained in:
parent
78a08b3b78
commit
c63aafd7d1
@ -170,6 +170,9 @@ private NodeForPreemption getPreemptionCandidatesOnNode(
|
||||
Map<ApplicationAttemptId, Set<RMContainer>> selectedCandidates,
|
||||
Resource totalPreemptionAllowed, boolean readOnly) {
|
||||
RMContainer reservedContainer = node.getReservedContainer();
|
||||
if (reservedContainer == null) {
|
||||
return null;
|
||||
}
|
||||
Resource available = Resources.clone(node.getUnallocatedResource());
|
||||
Resource totalSelected = Resources.createResource(0);
|
||||
List<RMContainer> sortedRunningContainers =
|
||||
|
@ -876,10 +876,9 @@ private void completeOustandingUpdatesWhichAreReserved(
|
||||
RMContainer rmContainer, ContainerStatus containerStatus,
|
||||
RMContainerEventType event) {
|
||||
N schedulerNode = getSchedulerNode(rmContainer.getNodeId());
|
||||
if (schedulerNode != null &&
|
||||
schedulerNode.getReservedContainer() != null) {
|
||||
if (schedulerNode != null) {
|
||||
RMContainer resContainer = schedulerNode.getReservedContainer();
|
||||
if (resContainer.getReservedSchedulerKey() != null) {
|
||||
if (resContainer != null && resContainer.getReservedSchedulerKey() != null) {
|
||||
ContainerId containerToUpdate = resContainer
|
||||
.getReservedSchedulerKey().getContainerToUpdate();
|
||||
if (containerToUpdate != null &&
|
||||
|
@ -858,12 +858,13 @@ private ContainerAllocation allocate(Resource clusterResource,
|
||||
FiCaSchedulerNode node = iter.next();
|
||||
|
||||
// Do not schedule if there are any reservations to fulfill on the node
|
||||
RMContainer nodeReservedContainer = node.getReservedContainer();
|
||||
if (iter.hasNext() &&
|
||||
node.getReservedContainer() != null &&
|
||||
nodeReservedContainer != null &&
|
||||
isSkipAllocateOnNodesWithReservedContainer()) {
|
||||
LOG.debug("Skipping scheduling on node {} since it has already been"
|
||||
+ " reserved by {}", node.getNodeID(),
|
||||
node.getReservedContainer().getContainerId());
|
||||
nodeReservedContainer.getContainerId());
|
||||
ActivitiesLogger.APP.recordSkippedAppActivityWithoutAllocation(
|
||||
activitiesManager, node, application, schedulerKey,
|
||||
ActivityDiagnosticConstant.NODE_HAS_BEEN_RESERVED, ActivityLevel.NODE);
|
||||
|
@ -520,13 +520,13 @@ public boolean accept(Resource cluster,
|
||||
// When reserve a resource (state == NEW is for new container,
|
||||
// state == RUNNING is for increase container).
|
||||
// Just check if the node is not already reserved by someone
|
||||
if (schedulerContainer.getSchedulerNode().getReservedContainer()
|
||||
!= null) {
|
||||
RMContainer reservedContainer =
|
||||
schedulerContainer.getSchedulerNode().getReservedContainer();
|
||||
if (reservedContainer != null) {
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("Try to reserve a container, but the node is "
|
||||
+ "already reserved by another container="
|
||||
+ schedulerContainer.getSchedulerNode()
|
||||
.getReservedContainer().getContainerId());
|
||||
+ reservedContainer.getContainerId());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user