| /** |
| * 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.scheduler; |
| |
| import org.apache.hadoop.yarn.api.records.Resource; |
| import org.apache.hadoop.yarn.util.resource.Resources; |
| |
| /** |
| * Resource limits for queues/applications, this means max overall (please note |
| * that, it's not "extra") resource you can get. |
| */ |
| public class ResourceLimits { |
| private volatile Resource limit; |
| |
| // This is special limit that goes with the RESERVE_CONT_LOOK_ALL_NODES |
| // config. This limit indicates how much we need to unreserve to allocate |
| // another container. |
| private volatile Resource amountNeededUnreserve; |
| |
| // How much resource you can use for next allocation, if this isn't enough for |
| // next container allocation, you may need to consider unreserve some |
| // containers. |
| private volatile Resource headroom; |
| |
| // How much resource should be reserved for high-priority blocked queues |
| private Resource blockedHeadroom; |
| |
| private boolean allowPreempt = false; |
| |
| public ResourceLimits(Resource limit) { |
| this(limit, Resources.none()); |
| } |
| |
| public ResourceLimits(Resource limit, Resource amountNeededUnreserve) { |
| this.amountNeededUnreserve = amountNeededUnreserve; |
| this.headroom = limit; |
| this.limit = limit; |
| } |
| |
| public Resource getLimit() { |
| return limit; |
| } |
| |
| public Resource getHeadroom() { |
| return headroom; |
| } |
| |
| public void setHeadroom(Resource headroom) { |
| this.headroom = headroom; |
| } |
| |
| public Resource getAmountNeededUnreserve() { |
| return amountNeededUnreserve; |
| } |
| |
| public void setLimit(Resource limit) { |
| this.limit = limit; |
| } |
| |
| public void setAmountNeededUnreserve(Resource amountNeededUnreserve) { |
| this.amountNeededUnreserve = amountNeededUnreserve; |
| } |
| |
| public boolean isAllowPreemption() { |
| return allowPreempt; |
| } |
| |
| public void setIsAllowPreemption(boolean allowPreempt) { |
| this.allowPreempt = allowPreempt; |
| } |
| |
| public void addBlockedHeadroom(Resource resource) { |
| if (blockedHeadroom == null) { |
| blockedHeadroom = Resource.newInstance(0, 0); |
| } |
| Resources.addTo(blockedHeadroom, resource); |
| } |
| |
| public Resource getBlockedHeadroom() { |
| if (blockedHeadroom == null) { |
| return Resources.none(); |
| } |
| return blockedHeadroom; |
| } |
| |
| public Resource getNetLimit() { |
| if (blockedHeadroom != null) { |
| return Resources.subtract(limit, blockedHeadroom); |
| } |
| return limit; |
| } |
| } |