/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity; import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode; import org.apache.hadoop.yarn.util.resource.Resources; import java.util.List; /** * This class will save necessary information which copied from * FiCaSchedulerNode. This is added majorly for performance consideration, this * can be cached to avoid hitting scheduler again and again. In addition, * we can add some preemption-required fields to the class. */ public class TempSchedulerNode { private List<RMContainer> runningContainers; private RMContainer reservedContainer; private Resource totalResource; // excluded reserved resource private Resource allocatedResource; // total - allocated private Resource availableResource; // just a shortcut of reservedContainer.getResource. private Resource reservedResource; private NodeId nodeId; public static TempSchedulerNode fromSchedulerNode( FiCaSchedulerNode schedulerNode) { TempSchedulerNode n = new TempSchedulerNode(); n.totalResource = Resources.clone(schedulerNode.getTotalResource()); n.allocatedResource = Resources.clone(schedulerNode.getUsedResource()); n.runningContainers = schedulerNode.getCopiedListOfRunningContainers(); n.reservedContainer = schedulerNode.getReservedContainer(); if (n.reservedContainer != null) { n.reservedResource = n.reservedContainer.getReservedResource(); } else { n.reservedResource = Resources.none(); } n.availableResource = Resources.subtract(n.totalResource, n.allocatedResource); n.nodeId = schedulerNode.getNodeID(); return n; } public NodeId getNodeId() { return nodeId; } public List<RMContainer> getRunningContainers() { return runningContainers; } public void setRunningContainers(List<RMContainer> runningContainers) { this.runningContainers = runningContainers; } public RMContainer getReservedContainer() { return reservedContainer; } public void setReservedContainer(RMContainer reservedContainer) { this.reservedContainer = reservedContainer; } public Resource getTotalResource() { return totalResource; } public void setTotalResource(Resource totalResource) { this.totalResource = totalResource; } public Resource getAllocatedResource() { return allocatedResource; } public void setAllocatedResource(Resource allocatedResource) { this.allocatedResource = allocatedResource; } public Resource getAvailableResource() { return availableResource; } public void setAvailableResource(Resource availableResource) { this.availableResource = availableResource; } public Resource getReservedResource() { return reservedResource; } public void setReservedResource(Resource reservedResource) { this.reservedResource = reservedResource; } }