diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractReservationSystem.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractReservationSystem.java index 5ef4912..1fb744e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractReservationSystem.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractReservationSystem.java @@ -409,12 +409,12 @@ protected Plan initializePlan(String planQueueName) throws YarnException { Resource maxAllocation = getMaxAllocation(); ResourceCalculator rescCalc = getResourceCalculator(); Resource totCap = getPlanQueueCapacity(planQueueName); - Plan plan = - new InMemoryPlan(getRootQueueMetrics(), adPolicy, - getAgent(planQueuePath), totCap, planStepSize, rescCalc, - minAllocation, maxAllocation, planQueueName, - getReplanner(planQueuePath), getReservationSchedulerConfiguration() - .getMoveOnExpiry(planQueuePath), rmContext); + Plan plan = new InMemoryPlan(getRootQueueMetrics(), + getRootQueueReservationMetrics(), adPolicy, getAgent(planQueuePath), + totCap, planStepSize, rescCalc, minAllocation, maxAllocation, + planQueueName, getReplanner(planQueuePath), + getReservationSchedulerConfiguration().getMoveOnExpiry(planQueuePath), + rmContext); LOG.info("Initialized plan {} based on reservable queue {}", plan.toString(), planQueueName); return plan; @@ -507,4 +507,6 @@ public ReservationsACLsManager getReservationsACLsManager() { protected abstract ResourceCalculator getResourceCalculator(); protected abstract QueueMetrics getRootQueueMetrics(); + + protected abstract ReservationQueueMetrics getRootQueueReservationMetrics(); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractSchedulerPlanFollower.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractSchedulerPlanFollower.java index 90357e3..f3e9089 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractSchedulerPlanFollower.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/AbstractSchedulerPlanFollower.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.reservation; +import org.apache.hadoop.util.StopWatch; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ReservationId; import org.apache.hadoop.yarn.api.records.Resource; @@ -75,6 +76,8 @@ public synchronized void synchronizePlan(Plan plan, boolean shouldReplan) { if (LOG.isDebugEnabled()) { LOG.debug("Running plan follower edit policy for plan: " + planQueueName); } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); // align with plan step long step = plan.getStep(); long now = clock.getTime(); @@ -83,7 +86,6 @@ public synchronized void synchronizePlan(Plan plan, boolean shouldReplan) { } Queue planQueue = getPlanQueue(planQueueName); if (planQueue == null) return; - // first we publish to the plan the current availability of resources Resource clusterResources = scheduler.getClusterResource(); Resource planResources = getPlanResources(plan, planQueue, @@ -214,10 +216,11 @@ public synchronized void synchronizePlan(Plan plan, boolean shouldReplan) { } catch (PlanningException e) { LOG.error("Exception in archiving completed reservations: ", e); } + planQueue.getReservationMetrics() + .setPlanFollowerSynchronizeMetrics(stopWatch.now()); LOG.info("Finished iteration of plan follower edit policy for plan: " + planQueueName); - // Extension: update plan with app states, - // useful to support smart replanning + // Extension: update plan with app states, to support smart replanning. } protected String getReservationIdFromQueueName(String resQueueName) { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/CapacityReservationSystem.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/CapacityReservationSystem.java index be0a708..a3832de 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/CapacityReservationSystem.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/CapacityReservationSystem.java @@ -86,6 +86,11 @@ protected QueueMetrics getRootQueueMetrics() { } @Override + protected ReservationQueueMetrics getRootQueueReservationMetrics() { + return capScheduler.getRootQueueReservationMetrics(); + } + + @Override protected String getPlanQueuePath(String planQueueName) { return capScheduler.getQueue(planQueueName).getQueuePath(); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/FairReservationSystem.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/FairReservationSystem.java index 9bf92c2..c75c4d8 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/FairReservationSystem.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/FairReservationSystem.java @@ -68,6 +68,11 @@ protected QueueMetrics getRootQueueMetrics() { } @Override + protected ReservationQueueMetrics getRootQueueReservationMetrics() { + return fairScheduler.getRootQueueReservationMetrics(); + } + + @Override protected Resource getMinAllocation() { return fairScheduler.getMinimumResourceCapability(); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/InMemoryPlan.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/InMemoryPlan.java index 783fd09..ddce528 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/InMemoryPlan.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/InMemoryPlan.java @@ -31,6 +31,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.apache.hadoop.util.StopWatch; import org.apache.hadoop.yarn.api.records.ReservationId; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.server.resourcemanager.reservation.RLESparseResourceAllocation.RLEOperator; @@ -90,17 +91,21 @@ private Resource totalCapacity; - public InMemoryPlan(QueueMetrics queueMetrics, SharingPolicy policy, + private ReservationQueueMetrics reservationQueueMetrics; + + public InMemoryPlan(QueueMetrics queueMetrics, + ReservationQueueMetrics reservationQueueMetrics, SharingPolicy policy, ReservationAgent agent, Resource totalCapacity, long step, ResourceCalculator resCalc, Resource minAlloc, Resource maxAlloc, String queueName, Planner replanner, boolean getMoveOnExpiry, RMContext rmContext) { - this(queueMetrics, policy, agent, totalCapacity, step, resCalc, minAlloc, - maxAlloc, queueName, replanner, getMoveOnExpiry, rmContext, - new UTCClock()); + this(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, + step, resCalc, minAlloc, maxAlloc, queueName, replanner, + getMoveOnExpiry, rmContext, new UTCClock()); } - public InMemoryPlan(QueueMetrics queueMetrics, SharingPolicy policy, + public InMemoryPlan(QueueMetrics queueMetrics, + ReservationQueueMetrics reservationQueueMetrics, SharingPolicy policy, ReservationAgent agent, Resource totalCapacity, long step, ResourceCalculator resCalc, Resource minAlloc, Resource maxAlloc, String queueName, Planner replanner, boolean getMoveOnExpiry, @@ -119,6 +124,7 @@ public InMemoryPlan(QueueMetrics queueMetrics, SharingPolicy policy, this.getMoveOnExpiry = getMoveOnExpiry; this.clock = clock; this.rmStateStore = rmContext.getStateStore(); + this.reservationQueueMetrics = reservationQueueMetrics; } @Override @@ -127,6 +133,11 @@ public QueueMetrics getQueueMetrics() { } + @Override + public ReservationQueueMetrics getReservationQueueMetrics() { + return reservationQueueMetrics; + } + private void incrementAllocation(ReservationAllocation reservation) { assert (readWriteLock.isWriteLockedByCurrentThread()); Map allocationRequests = @@ -214,6 +225,8 @@ private void decrementAllocation(ReservationAllocation reservation) { @Override public boolean addReservation(ReservationAllocation reservation, boolean isRecovering) throws PlanningException { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); // Verify the allocation is memory based otherwise it is not supported InMemoryReservationAllocation inMemReservation = (InMemoryReservationAllocation) reservation; @@ -223,8 +236,11 @@ public boolean addReservation(ReservationAllocation reservation, + inMemReservation.getReservationId() + " is not mapped to any user"; LOG.error(errMsg); + reservationQueueMetrics.setPlanAddReservationMetrics(stopWatch.now(), + false); throw new IllegalArgumentException(errMsg); } + writeLock.lock(); try { if (reservationTable.containsKey(inMemReservation.getReservationId())) { @@ -257,6 +273,7 @@ public boolean addReservation(ReservationAllocation reservation, if (!reservations.add(inMemReservation)) { LOG.error("Unable to add reservation: {} to plan.", inMemReservation.getReservationId()); + reservationQueueMetrics.setPlanAddReservationMetrics(stopWatch.now(), false); return false; } currentReservations.put(searchInterval, reservations); @@ -265,7 +282,11 @@ public boolean addReservation(ReservationAllocation reservation, incrementAllocation(inMemReservation); LOG.info("Successfully added reservation: {} to plan.", inMemReservation.getReservationId()); + reservationQueueMetrics.setPlanAddReservationMetrics(stopWatch.now(), true); return true; + } catch (Exception e) { + reservationQueueMetrics.setPlanAddReservationMetrics(stopWatch.now(), false); + throw e; } finally { writeLock.unlock(); } @@ -274,6 +295,8 @@ public boolean addReservation(ReservationAllocation reservation, @Override public boolean updateReservation(ReservationAllocation reservation) throws PlanningException { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); writeLock.lock(); boolean result = false; try { @@ -313,6 +336,7 @@ public boolean updateReservation(ReservationAllocation reservation) } } finally { writeLock.unlock(); + reservationQueueMetrics.setPlanUpdateReservationMetrics(stopWatch.now(), result); } } @@ -352,6 +376,8 @@ private boolean removeReservation(ReservationAllocation reservation) { @Override public boolean deleteReservation(ReservationId reservationID) { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); writeLock.lock(); try { ReservationAllocation reservation = getReservationById(reservationID); @@ -362,7 +388,12 @@ public boolean deleteReservation(ReservationId reservationID) { LOG.error(errMsg); throw new IllegalArgumentException(errMsg); } - return removeReservation(reservation); + boolean result = removeReservation(reservation); + reservationQueueMetrics.setPlanDeleteReservationMetrics(stopWatch.now(), result); + return result; + } catch (Exception e){ + reservationQueueMetrics.setPlanDeleteReservationMetrics(stopWatch.now(), false); + throw e; } finally { writeLock.unlock(); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/PlanContext.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/PlanContext.java index 94e299e..6517f42 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/PlanContext.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/PlanContext.java @@ -109,6 +109,15 @@ public QueueMetrics getQueueMetrics(); /** + * Return the {@link ReservationQueueMetrics} for for the queue in the + * {@link ResourceScheduler} corresponding to this plan + * + * @return the {@link ReservationQueueMetrics} for the queue in the + * {@link ResourceScheduler} corresponding to this plan + */ + public ReservationQueueMetrics getReservationQueueMetrics(); + + /** * Instructs the {@link PlanFollower} on what to do for applications * which are still running when the reservation is expiring (move-to-default * vs kill) diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationQueueMetrics.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationQueueMetrics.java new file mode 100644 index 0000000..e43da81 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/ReservationQueueMetrics.java @@ -0,0 +1,264 @@ +/******************************************************************************* + * 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.reservation; + +import static org.apache.hadoop.metrics2.lib.Interns.info; + +import java.util.HashMap; +import java.util.Map; + +import com.google.common.base.Splitter; +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.metrics2.MetricsInfo; +import org.apache.hadoop.metrics2.MetricsSystem; +import org.apache.hadoop.metrics2.annotation.Metric; +import org.apache.hadoop.metrics2.annotation.Metrics; +import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; +import org.apache.hadoop.metrics2.lib.MetricsRegistry; +import org.apache.hadoop.metrics2.lib.MutableCounterInt; +import org.apache.hadoop.metrics2.lib.MutableQuantiles; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue; + +/** + * {@link ReservationQueueMetrics} is used to collect metrics for the + * {@link ReservationSystem} and its constituent components. The + */ +@InterfaceAudience.Private +@Metrics(context = "yarn") +public class ReservationQueueMetrics { + + static final Splitter Q_SPLITTER = + Splitter.on('.').omitEmptyStrings().trimResults(); + private static MetricsRegistry registry; + + /** + * Helper method to clear cache. + */ + @InterfaceAudience.Private + public synchronized static void clearReservationMetrics() { + RESERVATION_METRICS.clear(); + } + + /** + * Simple metrics cache to help prevent re-registrations. + */ + private static final Map RESERVATION_METRICS = + new HashMap<>(); + + /** + * Gets the instance of {@link ReservationQueueMetrics} for a particular + * queue. If an instance did not already exist, a new one will be created. The + * {@link MetricsSystem} used to register these metrics is the singleton + * {@link DefaultMetricsSystem#instance()}. + * + * @param queueName the name of the {@link Queue} that the + * {@link ReservationQueueMetrics} are being gathered for. + * @param parent the parent of the {@link Queue} that the + * {@link ReservationQueueMetrics} are being gathered for. + * @return the {@link ReservationQueueMetrics} for the queue represented + * by the parameter queueName. + */ + public synchronized static ReservationQueueMetrics forReservationQueue( + String queueName, Queue parent) { + return forReservationQueue(DefaultMetricsSystem.instance(), queueName, + parent); + } + + /** + * Gets the instance of {@link ReservationQueueMetrics} for a particular + * queue. If an instance did not already exist, a new one will be created. + * + * @param ms the {@link MetricsSystem} used to register the queue metrics. + * @param queueName the name of the {@link Queue} that the + * {@link ReservationQueueMetrics} are being gathered for. + * @param parent the parent of the {@link Queue} that the + * {@link ReservationQueueMetrics} are being gathered for. + * @return the {@link ReservationQueueMetrics} for the queue represented + * by the parameter queueName. + */ + public synchronized static ReservationQueueMetrics forReservationQueue( + MetricsSystem ms, String queueName, Queue parent) { + ReservationQueueMetrics metrics = RESERVATION_METRICS.get(queueName); + if (metrics == null) { + metrics = new ReservationQueueMetrics(queueName, parent); + metrics.initialize(); + + // Register with the MetricsSystems + if (ms != null) { + metrics = ms.register("ReservationQueue-" + sourceName(queueName) + .toString(), "Metrics for queue: " + queueName, metrics); + } + + RESERVATION_METRICS.put(queueName, metrics); + } + + return metrics; + } + + private MutableQuantiles planAddReservationLatency; + + private MutableQuantiles planUpdateReservationLatency; + + private MutableQuantiles planDeleteReservationLatency; + + private MutableQuantiles planFollowerSynchronizeLatency; + + private MutableQuantiles reservationAgentCreateReservationLatency; + + private MutableQuantiles reservationAgentUpdateReservationLatency; + + private MutableQuantiles reservationAgentDeleteReservationLatency; + + @Metric("Plan Add Reservation Total Count") + private MutableCounterInt planAddReservationTotalCount; + + @Metric("Plan Update Reservation Total Count") + private MutableCounterInt planUpdateReservationTotalCount; + + @Metric("Plan Delete Reservation Total Count") + private MutableCounterInt planDeleteReservationTotalCount; + + @Metric("Plan Add Reservation Failure Count") + private MutableCounterInt planAddReservationFailureCount; + + @Metric("Plan Update Reservation Failure Count") + private MutableCounterInt planUpdateReservationFailureCount; + + @Metric("Plan Delete Reservation Failure Count") + private MutableCounterInt planDeleteReservationFailureCount; + + @Metric("Plan Follower Synchronize Count") + private MutableCounterInt planFollowerSynchronizeCount; + + private Queue parent; + + private static final MetricsInfo RECORD_INFO = + info("ReservationQueueMetrics", "Reservation Metrics by Queue"); + + private ReservationQueueMetrics(String queueName, Queue parent) { + this.parent = parent; + + registry = new MetricsRegistry(RECORD_INFO); + registry.tag(RECORD_INFO, "ReservationMetricsFor" + queueName); + } + + private void initialize() { + planAddReservationLatency = + registry.newQuantiles("PlanAddReservationLatency", + "Latency for create reservation", "ops", "latency", 5); + + planUpdateReservationLatency = + registry.newQuantiles("PlanUpdateReservationLatency", + "Latency for update reservation", "ops", "latency", 5); + + planDeleteReservationLatency = + registry.newQuantiles("PlanDeleteReservationLatency", + "Latency for remove reservation", "ops", "latency", 5); + + planFollowerSynchronizeLatency = + registry.newQuantiles("PlanFollowerSynchronizeLatency", + "Latency for plan follower execution", "ops", "latency", 5); + + reservationAgentCreateReservationLatency = + registry.newQuantiles("ReservationAgentCreateReservationLatency", + "Latency for create reservation", "ops", "latency", 5); + + reservationAgentUpdateReservationLatency = + registry.newQuantiles("ReservationAgentUpdateReservationLatency", + "Latency for update reservation", "ops", "latency", 5); + + reservationAgentDeleteReservationLatency = + registry.newQuantiles("ReservationAgentDeleteReservationLatency", + "Latency for delete reservation", "ops", "latency", 5); + } + + public void setPlanAddReservationMetrics(long latency, boolean success) { + planAddReservationLatency.add(latency); + planAddReservationTotalCount.incr(); + if (!success) { + planAddReservationFailureCount.incr(); + } + if (parent != null) { + parent.getReservationMetrics().setPlanAddReservationMetrics(latency, + success); + } + } + + public void setPlanUpdateReservationMetrics(long latency, boolean success) { + planUpdateReservationLatency.add(latency); + planUpdateReservationTotalCount.incr(); + if (!success) { + planUpdateReservationFailureCount.incr(); + } + if (parent != null) { + parent.getReservationMetrics().setPlanUpdateReservationMetrics(latency, + success); + } + } + + public void setPlanDeleteReservationMetrics(long latency, boolean success) { + planDeleteReservationLatency.add(latency); + planDeleteReservationTotalCount.incr(); + if (!success) { + planDeleteReservationFailureCount.incr(); + } + if (parent != null) { + parent.getReservationMetrics().setPlanDeleteReservationMetrics(latency, + success); + } + } + + public void setPlanFollowerSynchronizeMetrics(long latency) { + planFollowerSynchronizeLatency.add(latency); + planFollowerSynchronizeCount.incr(); + if (parent != null) { + parent.getReservationMetrics().setPlanFollowerSynchronizeMetrics(latency); + } + } + + public void setAgentCreateReservationMetrics(long latency) { + reservationAgentCreateReservationLatency.add(latency); + if (parent != null) { + parent.getReservationMetrics().setAgentCreateReservationMetrics(latency); + } + } + + public void setAgentUpdateReservationMetrics(long latency) { + reservationAgentUpdateReservationLatency.add(latency); + if (parent != null) { + parent.getReservationMetrics().setAgentUpdateReservationMetrics(latency); + } + } + + public void setAgentDeleteReservationMetrics(long latency) { + reservationAgentDeleteReservationLatency.add(latency); + if (parent != null) { + parent.getReservationMetrics().setAgentDeleteReservationMetrics(latency); + } + } + + protected static StringBuilder sourceName(String queueName) { + StringBuilder sb = new StringBuilder(RECORD_INFO.name()); + int i = 0; + for (String node : Q_SPLITTER.split(queueName)) { + sb.append(",q").append(i++).append('=').append(node); + } + return sb; + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/AbstractReservationAgent.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/AbstractReservationAgent.java new file mode 100644 index 0000000..74edbcc --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/AbstractReservationAgent.java @@ -0,0 +1,122 @@ +/** + * 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.reservation.planning; + +import org.apache.hadoop.util.StopWatch; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.Plan; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.exceptions.PlanningException; +import org.slf4j.Logger; + +/** + * This agent wraps the implementation of {@link ReservationAgent} to provide + * common functionality. An example is logging, and gathering metrics. + */ +abstract class AbstractReservationAgent implements ReservationAgent { + + protected abstract Logger getLogger(); + + protected abstract boolean createReservationImpl(ReservationId reservationId, + String user, Plan plan, ReservationDefinition contract) + throws PlanningException; + + @Override + public boolean createReservation(ReservationId reservationId, String user, + Plan plan, ReservationDefinition contract) throws PlanningException { + + getLogger().info("placing the following ReservationRequest: " + contract); + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + try { + boolean res = createReservationImpl(reservationId, user, plan, contract); + + if (res) { + getLogger().info("OUTCOME: SUCCESS, Reservation ID: " + + reservationId.toString() + ", Contract: " + contract.toString()); + } else { + getLogger().info("OUTCOME: FAILURE, Reservation ID: " + + reservationId.toString() + ", Contract: " + contract.toString()); + } + + return res; + } catch (PlanningException e) { + getLogger().info("OUTCOME: FAILURE, Reservation ID: " + + reservationId.toString() + ", Contract: " + contract.toString()); + throw e; + } finally { + plan.getReservationQueueMetrics() + .setAgentCreateReservationMetrics(stopWatch.now()); + } + } + + protected abstract boolean updateReservationImpl(ReservationId reservationId, + String user, Plan plan, ReservationDefinition contract) + throws PlanningException; + + @Override + public boolean updateReservation(ReservationId reservationId, String user, + Plan plan, ReservationDefinition contract) throws PlanningException { + + getLogger().info("updating the following ReservationRequest: " + contract); + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + try { + boolean status = + updateReservationImpl(reservationId, user, plan, contract); + return status; + } catch (PlanningException e) { + getLogger().info("OUTCOME: FAILURE, Reservation ID: " + + reservationId.toString() + ", Contract: " + contract.toString()); + throw e; + } finally { + plan.getReservationQueueMetrics() + .setAgentUpdateReservationMetrics(stopWatch.now()); + } + } + + public abstract boolean deleteReservationImpl(ReservationId reservationId, + String user, Plan plan) throws PlanningException; + + @Override + public boolean deleteReservation(ReservationId reservationId, String user, + Plan plan) throws PlanningException { + + getLogger().info("removing the following ReservationId: " + reservationId); + + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + try { + return deleteReservationImpl(reservationId, user, plan); + } catch (PlanningException e) { + getLogger().info( + "OUTCOME: FAILURE, Reservation ID: " + reservationId.toString()); + throw e; + } finally { + plan.getReservationQueueMetrics() + .setAgentDeleteReservationMetrics(stopWatch.now()); + } + } + +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/AlignedPlannerWithGreedy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/AlignedPlannerWithGreedy.java index 3853f41..20a11d3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/AlignedPlannerWithGreedy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/AlignedPlannerWithGreedy.java @@ -33,7 +33,7 @@ * A planning algorithm that first runs LowCostAligned, and if it fails runs * Greedy. */ -public class AlignedPlannerWithGreedy implements ReservationAgent { +public class AlignedPlannerWithGreedy extends AbstractReservationAgent { // Default smoothness factor public static final int DEFAULT_SMOOTHNESS_FACTOR = 10; @@ -84,49 +84,25 @@ public void init(Configuration conf) { planner = new TryManyReservationAgents(listAlg); } + public Logger getLogger() { + return LOG; + } + @Override - public boolean createReservation(ReservationId reservationId, String user, + public boolean createReservationImpl(ReservationId reservationId, String user, Plan plan, ReservationDefinition contract) throws PlanningException { - - LOG.info("placing the following ReservationRequest: " + contract); - - try { - boolean res = - planner.createReservation(reservationId, user, plan, contract); - - if (res) { - LOG.info("OUTCOME: SUCCESS, Reservation ID: " - + reservationId.toString() + ", Contract: " + contract.toString()); - } else { - LOG.info("OUTCOME: FAILURE, Reservation ID: " - + reservationId.toString() + ", Contract: " + contract.toString()); - } - return res; - } catch (PlanningException e) { - LOG.info("OUTCOME: FAILURE, Reservation ID: " + reservationId.toString() - + ", Contract: " + contract.toString()); - throw e; - } - + return planner.createReservation(reservationId, user, plan, contract); } @Override - public boolean updateReservation(ReservationId reservationId, String user, + public boolean updateReservationImpl(ReservationId reservationId, String user, Plan plan, ReservationDefinition contract) throws PlanningException { - - LOG.info("updating the following ReservationRequest: " + contract); - return planner.updateReservation(reservationId, user, plan, contract); - } @Override - public boolean deleteReservation(ReservationId reservationId, String user, + public boolean deleteReservationImpl(ReservationId reservationId, String user, Plan plan) throws PlanningException { - - LOG.info("removing the following ReservationId: " + reservationId); - return planner.deleteReservation(reservationId, user, plan); - } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/GreedyReservationAgent.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/GreedyReservationAgent.java index 637a17b..8adbdc4 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/GreedyReservationAgent.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/GreedyReservationAgent.java @@ -39,7 +39,7 @@ * size). */ -public class GreedyReservationAgent implements ReservationAgent { +public class GreedyReservationAgent extends AbstractReservationAgent { // Log private static final Logger LOG = LoggerFactory @@ -74,50 +74,27 @@ public void init(Configuration conf) { public boolean isAllocateLeft(){ return allocateLeft; } - @Override - public boolean createReservation(ReservationId reservationId, String user, - Plan plan, ReservationDefinition contract) throws PlanningException { - - LOG.info("placing the following ReservationRequest: " + contract); - - try { - boolean res = - planner.createReservation(reservationId, user, plan, contract); - - if (res) { - LOG.info("OUTCOME: SUCCESS, Reservation ID: " - + reservationId.toString() + ", Contract: " + contract.toString()); - } else { - LOG.info("OUTCOME: FAILURE, Reservation ID: " - + reservationId.toString() + ", Contract: " + contract.toString()); - } - return res; - } catch (PlanningException e) { - LOG.info("OUTCOME: FAILURE, Reservation ID: " + reservationId.toString() - + ", Contract: " + contract.toString()); - throw e; - } + public Logger getLogger() { + return LOG; } @Override - public boolean updateReservation(ReservationId reservationId, String user, + public boolean createReservationImpl(ReservationId reservationId, String user, Plan plan, ReservationDefinition contract) throws PlanningException { + return planner.createReservation(reservationId, user, plan, contract); + } - LOG.info("updating the following ReservationRequest: " + contract); - + @Override + public boolean updateReservationImpl(ReservationId reservationId, String user, + Plan plan, ReservationDefinition contract) throws PlanningException { return planner.updateReservation(reservationId, user, plan, contract); - } @Override - public boolean deleteReservation(ReservationId reservationId, String user, + public boolean deleteReservationImpl(ReservationId reservationId, String user, Plan plan) throws PlanningException { - - LOG.info("removing the following ReservationId: " + reservationId); - return planner.deleteReservation(reservationId, user, plan); - } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Queue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Queue.java index d166e5f..5c7ba5d 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Queue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Queue.java @@ -29,6 +29,7 @@ import org.apache.hadoop.yarn.api.records.QueueInfo; import org.apache.hadoop.yarn.api.records.QueueUserACLInfo; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; @Evolving @@ -47,6 +48,12 @@ QueueMetrics getMetrics(); /** + * Get the queue reservation metrics + * @return the queue reservation metrics + */ + ReservationQueueMetrics getReservationMetrics(); + + /** * Get queue information * @param includeChildQueues include child queues? * @param recursive recursively get child queue information? diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/YarnScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/YarnScheduler.java index 08e0603..c25ca90 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/YarnScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/YarnScheduler.java @@ -43,6 +43,7 @@ import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.event.EventHandler; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.QueueEntitlement; @@ -183,6 +184,14 @@ ApplicationResourceUsageReport getAppResourceUsageReport( QueueMetrics getRootQueueMetrics(); /** + * Get the root queue {@link ReservationQueueMetrics} for the scheduler. + * @return the root queue {@link ReservationQueueMetrics} for the scheduler. + */ + @LimitedPrivate("yarn") + @Evolving + ReservationQueueMetrics getRootQueueReservationMetrics(); + + /** * Check if the user has permission to perform the operation. * If the user has {@link QueueACL#ADMINISTER_QUEUE} permission, * this user can view/modify the applications in this queue diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java index 6c141a1..23c5966 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java @@ -53,6 +53,7 @@ import org.apache.hadoop.yarn.security.PrivilegedEntity.EntityType; import org.apache.hadoop.yarn.security.YarnAuthorizationProvider; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivitiesManager; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceLimits; @@ -81,6 +82,7 @@ volatile Resource maximumAllocation; private volatile QueueState state = null; final CSQueueMetrics metrics; + final ReservationQueueMetrics reservationQueueMetrics; protected final PrivilegedEntity queueEntity; final ResourceCalculator resourceCalculator; @@ -125,6 +127,9 @@ public AbstractCSQueue(CapacitySchedulerContext cs, old != null ? (CSQueueMetrics) old.getMetrics() : CSQueueMetrics .forQueue(getQueuePath(), parent, cs.getConfiguration() .getEnableUserMetrics(), cs.getConf()); + this.reservationQueueMetrics = old != null + ? (ReservationQueueMetrics) old.getReservationMetrics() + : ReservationQueueMetrics.forReservationQueue(getQueuePath(), parent); this.csContext = cs; this.minimumAllocation = csContext.getMinimumResourceCapability(); @@ -197,7 +202,12 @@ public QueueState getState() { public CSQueueMetrics getMetrics() { return metrics; } - + + @Override + public ReservationQueueMetrics getReservationMetrics() { + return reservationQueueMetrics; + } + @Override public String getQueueName() { return queueName; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java index d3186da..5fd9a16 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java @@ -71,6 +71,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore.RMState; import org.apache.hadoop.yarn.server.resourcemanager.recovery.records.ApplicationStateData; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationConstants; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEvent; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEventType; @@ -241,6 +242,11 @@ public QueueMetrics getRootQueueMetrics() { return getRootQueue().getMetrics(); } + @Override + public ReservationQueueMetrics getRootQueueReservationMetrics() { + return getRootQueue().getReservationMetrics(); + } + public CSQueue getRootQueue() { return queueManager.getRootQueue(); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueue.java index e131140..867f572 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueue.java @@ -42,6 +42,7 @@ import org.apache.hadoop.yarn.security.PrivilegedEntity; import org.apache.hadoop.yarn.security.PrivilegedEntity.EntityType; import org.apache.hadoop.yarn.security.YarnAuthorizationProvider; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceWeights; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils; @@ -62,6 +63,7 @@ private final YarnAuthorizationProvider authorizer; private final PrivilegedEntity queueEntity; private final FSQueueMetrics metrics; + private final ReservationQueueMetrics reservationQueueMetrics; protected final FSParentQueue parent; protected final RecordFactory recordFactory = @@ -90,6 +92,8 @@ public FSQueue(String name, FairScheduler scheduler, FSParentQueue parent) { YarnAuthorizationProvider.getInstance(scheduler.getConf()); this.queueEntity = new PrivilegedEntity(EntityType.QUEUE, name); this.metrics = FSQueueMetrics.forQueue(getName(), parent, true, scheduler.getConf()); + this.reservationQueueMetrics = + ReservationQueueMetrics.forReservationQueue(getName(), parent); this.parent = parent; setPolicy(scheduler.getAllocationConfiguration().getSchedulingPolicy(name)); reinit(false); @@ -264,6 +268,11 @@ public FSQueueMetrics getMetrics() { return metrics; } + @Override + public ReservationQueueMetrics getReservationMetrics() { + return reservationQueueMetrics; + } + /** Get the fair share assigned to this Schedulable. */ public Resource getFairShare() { return fairShare; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java index d1a237a..03ada28 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java @@ -54,6 +54,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.RMCriticalThreadUncaughtExceptionHandler; import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore.RMState; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationConstants; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceWeights; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEvent; @@ -169,6 +170,7 @@ // Aggregate metrics FSQueueMetrics rootMetrics; + ReservationQueueMetrics rootReservationMetrics; FSOpDurations fsOpDurations; private float reservableNodesRatio; // percentage of available nodes @@ -1101,6 +1103,11 @@ public QueueMetrics getRootQueueMetrics() { } @Override + public ReservationQueueMetrics getRootQueueReservationMetrics() { + return rootReservationMetrics; + } + + @Override public void handle(SchedulerEvent event) { switch (event.getType()) { case NODE_ADDED: @@ -1296,6 +1303,8 @@ private void initScheduler(Configuration conf) throws IOException { } rootMetrics = FSQueueMetrics.forQueue("root", null, true, conf); + rootReservationMetrics = + ReservationQueueMetrics.forReservationQueue("root", null); fsOpDurations = FSOpDurations.getInstance(true); // This stores per-application scheduling information diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java index a8d4f48..ba6978f 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java @@ -48,6 +48,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore.RMState; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEvent; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEventType; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState; @@ -119,7 +120,8 @@ private static final String DEFAULT_QUEUE_NAME = "default"; private QueueMetrics metrics; - + private ReservationQueueMetrics reservationMetrics; + private final ResourceCalculator resourceCalculator = new DefaultResourceCalculator(); private final Queue DEFAULT_QUEUE = new Queue() { @@ -134,6 +136,11 @@ public QueueMetrics getMetrics() { } @Override + public ReservationQueueMetrics getReservationMetrics() { + return reservationMetrics; + } + + @Override public QueueInfo getQueueInfo( boolean includeChildQueues, boolean recursive) { QueueInfo queueInfo = recordFactory.newRecordInstance(QueueInfo.class); @@ -256,6 +263,8 @@ private synchronized void initScheduler(Configuration conf) { YarnConfiguration.DEFAULT_RM_SCHEDULER_USE_PORT_FOR_NODE_NAME); this.metrics = QueueMetrics.forQueue(DEFAULT_QUEUE_NAME, null, false, conf); + this.reservationMetrics = + ReservationQueueMetrics.forReservationQueue(DEFAULT_QUEUE_NAME, null); this.activeUsersManager = new ActiveUsersManager(metrics); } @@ -912,6 +921,11 @@ public QueueMetrics getRootQueueMetrics() { } @Override + public ReservationQueueMetrics getRootQueueReservationMetrics() { + return DEFAULT_QUEUE.getReservationMetrics(); + } + + @Override public synchronized boolean checkAccess(UserGroupInformation callerUGI, QueueACL acl, String queueName) { return DEFAULT_QUEUE.hasAccess(acl, callerUGI); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestCapacityOverTimePolicy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestCapacityOverTimePolicy.java index 2dee60c..7ed4041 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestCapacityOverTimePolicy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestCapacityOverTimePolicy.java @@ -75,6 +75,8 @@ public void setup() throws Exception { mAgent = mock(ReservationAgent.class); QueueMetrics rootQueueMetrics = mock(QueueMetrics.class); + ReservationQueueMetrics rootQueueReservationMetrics = + mock(ReservationQueueMetrics.class); String reservationQ = ReservationSystemTestUtil.getFullReservationQueueName(); Resource clusterResource = @@ -87,9 +89,9 @@ public void setup() throws Exception { RMContext context = ReservationSystemTestUtil.createMockRMContext(); plan = - new InMemoryPlan(rootQueueMetrics, policy, mAgent, - clusterResource, step, res, minAlloc, maxAlloc, - "dedicated", null, true, context); + new InMemoryPlan(rootQueueMetrics, rootQueueReservationMetrics, policy, + mAgent, clusterResource, step, res, minAlloc, maxAlloc, "dedicated", + null, true, context); } public int[] generateData(int length, int val) { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestInMemoryPlan.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestInMemoryPlan.java index bc98e2f..ff50c23 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestInMemoryPlan.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestInMemoryPlan.java @@ -58,6 +58,7 @@ private Clock clock; private QueueMetrics queueMetrics; + private ReservationQueueMetrics reservationQueueMetrics; private SharingPolicy policy; private ReservationAgent agent; private Planner replanner; @@ -72,6 +73,7 @@ public void setUp() throws PlanningException { clock = mock(Clock.class); queueMetrics = mock(QueueMetrics.class); + reservationQueueMetrics = mock(ReservationQueueMetrics.class); policy = mock(SharingPolicy.class); replanner = mock(Planner.class); @@ -96,7 +98,7 @@ public void tearDown() { @Test public void testAddReservation() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -129,7 +131,7 @@ private void checkAllocation(Plan plan, int[] alloc, int start) { @Test public void testAddEmptyReservation() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -149,7 +151,7 @@ public void testAddEmptyReservation() { public void testAddReservationAlreadyExists() { // First add a reservation Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -181,7 +183,7 @@ public void testAddReservationAlreadyExists() { @Test public void testUpdateReservation() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -236,7 +238,7 @@ public void testUpdateReservation() { @Test public void testUpdateNonExistingReservation() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -261,7 +263,7 @@ public void testUpdateNonExistingReservation() { public void testDeleteReservation() { // First add a reservation Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -309,7 +311,7 @@ public void testDeleteReservation() { @Test public void testDeleteNonExistingReservation() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -329,7 +331,7 @@ public void testDeleteNonExistingReservation() { @Test public void testArchiveCompletedReservations() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID1 = ReservationSystemTestUtil.getNewReservationId(); @@ -412,7 +414,7 @@ public void testArchiveCompletedReservations() { @Test public void testGetReservationsById() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -446,7 +448,7 @@ public void testGetReservationsById() { @Test public void testGetReservationsByInvalidId() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -472,7 +474,7 @@ public void testGetReservationsByInvalidId() { @Test public void testGetReservationsByTimeInterval() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -533,7 +535,7 @@ public void testGetReservationsByTimeInterval() { @Test public void testGetReservationsAtTime() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -558,7 +560,7 @@ public void testGetReservationsAtTime() { @Test public void testGetReservationsWithNoInput() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); ReservationId reservationID = ReservationSystemTestUtil.getNewReservationId(); @@ -585,7 +587,7 @@ public void testGetReservationsWithNoInput() { @Test public void testGetReservationsWithNoReservation() { Plan plan = - new InMemoryPlan(queueMetrics, policy, agent, totalCapacity, 1L, + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, totalCapacity, 1L, resCalc, minAlloc, maxAlloc, planName, replanner, true, context); // Verify that get reservation returns no entries if no queries are made. diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestNoOverCommitPolicy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestNoOverCommitPolicy.java index c5edaf0..99403d9 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestNoOverCommitPolicy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestNoOverCommitPolicy.java @@ -62,6 +62,8 @@ public void setup() throws Exception { String reservationQ = ReservationSystemTestUtil.getFullReservationQueueName(); QueueMetrics rootQueueMetrics = mock(QueueMetrics.class); + ReservationQueueMetrics rootReservationQueueMetrics = + mock(ReservationQueueMetrics.class); Resource clusterResource = ReservationSystemTestUtil.calculateClusterResource(totCont); ReservationSchedulerConfiguration conf = mock @@ -71,9 +73,9 @@ public void setup() throws Exception { RMContext context = ReservationSystemTestUtil.createMockRMContext(); plan = - new InMemoryPlan(rootQueueMetrics, policy, mAgent, - clusterResource, step, res, minAlloc, maxAlloc, - "dedicated", null, true, context); + new InMemoryPlan(rootQueueMetrics, rootReservationQueueMetrics, policy, + mAgent, clusterResource, step, res, minAlloc, maxAlloc, "dedicated", + null, true, context); } public int[] generateData(int length, int val) { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestSchedulerPlanFollowerBase.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestSchedulerPlanFollowerBase.java index c6cebd9..2d6e557 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestSchedulerPlanFollowerBase.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/TestSchedulerPlanFollowerBase.java @@ -59,7 +59,8 @@ protected void testPlanFollower(boolean isMove) throws PlanningException, InterruptedException, AccessControlException { // Initialize plan based on move flag plan = - new InMemoryPlan(scheduler.getRootQueueMetrics(), policy, mAgent, + new InMemoryPlan(scheduler.getRootQueueMetrics(), + scheduler.getRootQueueReservationMetrics(), policy, mAgent, scheduler.getClusterResource(), 1L, res, scheduler.getMinimumResourceCapability(), maxAlloc, "dedicated", null, isMove, context); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestAlignedPlanner.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestAlignedPlanner.java index 25ec9c9..378db30 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestAlignedPlanner.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestAlignedPlanner.java @@ -44,6 +44,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.reservation.RLESparseResourceAllocation; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationAllocation; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationInterval; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSchedulerConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSystemTestUtil; import org.apache.hadoop.yarn.server.resourcemanager.reservation.exceptions.PlanningException; @@ -1056,6 +1057,8 @@ public void setup() throws Exception { policy.init(reservationQ, conf); QueueMetrics queueMetrics = mock(QueueMetrics.class); + ReservationQueueMetrics reservationQueueMetrics = + mock(ReservationQueueMetrics.class); RMContext context = ReservationSystemTestUtil.createMockRMContext(); conf.setInt(AlignedPlannerWithGreedy.SMOOTHNESS_FACTOR, @@ -1071,8 +1074,9 @@ public void setup() throws Exception { agentLeft.init(conf); // Create Plan - plan = new InMemoryPlan(queueMetrics, policy, agentRight, clusterCapacity, - step, res, minAlloc, maxAlloc, "dedicated", null, true, context); + plan = new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, + agentRight, clusterCapacity, step, res, minAlloc, maxAlloc, "dedicated", + null, true, context); } private int initializeScenario1() throws PlanningException { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestGreedyReservationAgent.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestGreedyReservationAgent.java index 51b971b..5371945 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestGreedyReservationAgent.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestGreedyReservationAgent.java @@ -47,6 +47,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.reservation.InMemoryReservationAllocation; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationAllocation; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationInterval; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSchedulerConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSystemTestUtil; import org.apache.hadoop.yarn.server.resourcemanager.reservation.exceptions.PlanningException; @@ -118,10 +119,13 @@ public void setup() throws Exception { agent.init(conf); QueueMetrics queueMetrics = mock(QueueMetrics.class); + ReservationQueueMetrics reservationQueueMetrics = + mock(ReservationQueueMetrics.class); RMContext context = ReservationSystemTestUtil.createMockRMContext(); - plan = new InMemoryPlan(queueMetrics, policy, agent, clusterCapacity, step, - res, minAlloc, maxAlloc, "dedicated", null, true, context); + plan = new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, + agent, clusterCapacity, step, res, minAlloc, maxAlloc, "dedicated", + null, true, context); } @SuppressWarnings("javadoc") @@ -730,9 +734,10 @@ public void testStress(int numJobs) throws PlanningException, IOException { policy.init(reservationQ, conf); RMContext context = ReservationSystemTestUtil.createMockRMContext(); - plan = new InMemoryPlan(scheduler.getRootQueueMetrics(), policy, agent, - clusterCapacity, step, res, minAlloc, maxAlloc, "dedicated", null, - true, context); + plan = new InMemoryPlan(scheduler.getRootQueueMetrics(), + scheduler.getRootQueueReservationMetrics(), policy, agent, + clusterCapacity, step, res, minAlloc, maxAlloc, "dedicated", null, true, + context); int acc = 0; List list = new ArrayList(); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestSimpleCapacityReplanner.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestSimpleCapacityReplanner.java index c4f94c2..efb30b9 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestSimpleCapacityReplanner.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/planning/TestSimpleCapacityReplanner.java @@ -37,6 +37,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.reservation.NoOverCommitPolicy; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationAllocation; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationInterval; +import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationQueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSchedulerConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSystemTestUtil; import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSystemUtil; @@ -66,6 +67,8 @@ public void testReplanningPlanCapacityLoss() throws PlanningException { policy.init("root.dedicated", null); QueueMetrics queueMetrics = mock(QueueMetrics.class); + ReservationQueueMetrics reservationQueueMetrics = + mock(ReservationQueueMetrics.class); when(clock.getTime()).thenReturn(0L); SimpleCapacityReplanner enf = new SimpleCapacityReplanner(clock); @@ -79,8 +82,9 @@ public void testReplanningPlanCapacityLoss() throws PlanningException { // Initialize the plan with more resources InMemoryPlan plan = - new InMemoryPlan(queueMetrics, policy, agent, clusterCapacity, step, - res, minAlloc, maxAlloc, "dedicated", enf, true, context, clock); + new InMemoryPlan(queueMetrics, reservationQueueMetrics, policy, agent, + clusterCapacity, step, res, minAlloc, maxAlloc, "dedicated", enf, + true, context, clock); // add reservation filling the plan (separating them 1ms, so we are sure // s2 follows s1 on acceptance