/** * 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 java.util.LinkedList; import java.util.List; 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; /** * A planning algorithm that invokes several other planning algorithms according * to a given order. If one of the planners succeeds, the allocation it * generates is returned. */ public class TryManyReservationAgents implements ReservationAgent { // Planning algorithms private final List<ReservationAgent> algs; // Constructor public TryManyReservationAgents(List<ReservationAgent> algs) { this.algs = new LinkedList<ReservationAgent>(algs); } @Override public boolean createReservation(ReservationId reservationId, String user, Plan plan, ReservationDefinition contract) throws PlanningException { // Save the planning exception PlanningException planningException = null; // Try all of the algorithms, in order for (ReservationAgent alg : algs) { try { if (alg.createReservation(reservationId, user, plan, contract)) { return true; } } catch (PlanningException e) { planningException = e; } } // If all of the algorithms failed and one of the algorithms threw an // exception, throw the last planning exception if (planningException != null) { throw planningException; } // If all of the algorithms failed, return false return false; } @Override public boolean updateReservation(ReservationId reservationId, String user, Plan plan, ReservationDefinition contract) throws PlanningException { // Save the planning exception PlanningException planningException = null; // Try all of the algorithms, in order for (ReservationAgent alg : algs) { try { if (alg.updateReservation(reservationId, user, plan, contract)) { return true; } } catch (PlanningException e) { planningException = e; } } // If all of the algorithms failed and one of the algorithms threw an // exception, throw the last planning exception if (planningException != null) { throw planningException; } // If all of the algorithms failed, return false return false; } @Override public boolean deleteReservation(ReservationId reservationId, String user, Plan plan) throws PlanningException { return plan.deleteReservation(reservationId); } }