blob: 4e5d743221bcafbd866f10cc642c8f28acb235bd [file] [log] [blame]
/**
* 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.mesos;
import org.apache.mesos.Protos.*;
import java.util.List;
/**
* Callback interface to be implemented by frameworks'
* schedulers. Note that only one callback will be invoked at a time,
* so it is not recommended that you block within a callback because
* it may cause a deadlock.
* <p>
* Each callback includes a reference to the scheduler driver that was
* used to run this scheduler. The reference will not change for the
* duration of a scheduler (i.e., from the point you do {@link
* SchedulerDriver#start} to the point that {@link
* SchedulerDriver#join} returns). This is intended for convenience so
* that a scheduler doesn't need to store a reference to the driver
* itself.
*/
public interface Scheduler {
/**
* Invoked when the scheduler successfully registers with a Mesos
* master. A unique ID (generated by the master) used for
* distinguishing this framework from others and MasterInfo
* with the IP and port of the current master are provided as arguments.
*
* @param driver The scheduler driver that was registered.
* @param frameworkId The framework ID generated by the master.
* @param masterInfo Info about the current master, including IP and port.
*
* @see SchedulerDriver
* @see FrameworkID
* @see MasterInfo
*/
void registered(SchedulerDriver driver,
FrameworkID frameworkId,
MasterInfo masterInfo);
/**
* Invoked when the scheduler reregisters with a newly elected Mesos master.
* This is only called when the scheduler has previously been registered.
* MasterInfo containing the updated information about the elected master
* is provided as an argument.
*
* @param driver The driver that was reregistered.
* @param masterInfo The updated information about the elected master.
*
* @see SchedulerDriver
* @see MasterInfo
*/
void reregistered(SchedulerDriver driver, MasterInfo masterInfo);
/**
* Invoked when resources have been offered to this framework. A
* single offer will only contain resources from a single slave.
* Resources associated with an offer will not be re-offered to
* _this_ framework until either (a) this framework has rejected
* those resources (see {@link SchedulerDriver#launchTasks}) or (b)
* those resources have been rescinded (see {@link Scheduler#offerRescinded}).
* Note that resources may be concurrently offered to more than one
* framework at a time (depending on the allocator being used). In
* that case, the first framework to launch tasks using those
* resources will be able to use them while the other frameworks
* will have those resources rescinded (or if a framework has
* already launched tasks with those resources then those tasks will
* fail with a TASK_LOST status and a message saying as much).
*
* @param driver The driver that was used to run this scheduler.
* @param offers The resources offered to this framework.
*
* @see SchedulerDriver
* @see Offer
*/
void resourceOffers(SchedulerDriver driver, List<Offer> offers);
/**
* Invoked when an offer is no longer valid (e.g., the slave was
* lost or another framework used resources in the offer). If for
* whatever reason an offer is never rescinded (e.g., dropped
* message, failing over framework, etc.), a framework that attempts
* to launch tasks using an invalid offer will receive TASK_LOST
* status updates for those tasks (see {@link #resourceOffers}).
*
* @param driver The driver that was used to run this scheduler.
* @param offerId The ID of the offer that was rescinded.
*
* @see SchedulerDriver
* @see OfferID
*/
void offerRescinded(SchedulerDriver driver, OfferID offerId);
/**
* Invoked when the status of a task has changed (e.g., a slave is
* lost and so the task is lost, a task finishes and an executor
* sends a status update saying so, etc). If implicit
* acknowledgements are being used, then returning from this
* callback _acknowledges_ receipt of this status update! If for
* whatever reason the scheduler aborts during this callback (or
* the process exits) another status update will be delivered (note,
* however, that this is currently not true if the slave sending the
* status update is lost/fails during that time). If explicit
* acknowledgements are in use, the scheduler must acknowledge this
* status on the driver.
*
* @param driver The driver that was used to run this scheduler.
* @param status The status update, which includes the task ID and status.
*
* @see SchedulerDriver
* @see TaskStatus
*/
void statusUpdate(SchedulerDriver driver, TaskStatus status);
/**
* Invoked when an executor sends a message. These messages are best
* effort; do not expect a framework message to be retransmitted in
* any reliable fashion.
*
* @param driver The driver that received the message.
* @param executorId The ID of the executor that sent the message.
* @param slaveId The ID of the slave that launched the executor.
* @param data The message payload.
*
* @see SchedulerDriver
* @see ExecutorID
* @see SlaveID
*/
void frameworkMessage(SchedulerDriver driver,
ExecutorID executorId,
SlaveID slaveId,
byte[] data);
/**
* Invoked when the scheduler becomes "disconnected" from the master
* (e.g., the master fails and another is taking over).
*
* @param driver The driver that was used to run this scheduler.
*
* @see SchedulerDriver
*/
void disconnected(SchedulerDriver driver);
/**
* Invoked when a slave has been determined unreachable (e.g.,
* machine failure, network partition). Most frameworks will need to
* reschedule any tasks launched on this slave on a new slave.
*
* NOTE: This callback is not reliably delivered. If a host or
* network failure causes messages between the master and the
* scheduler to be dropped, this callback may not be invoked.
*
* @param driver The driver that was used to run this scheduler.
* @param slaveId The ID of the slave that was lost.
*
* @see SchedulerDriver
* @see SlaveID
*/
void slaveLost(SchedulerDriver driver, SlaveID slaveId);
/**
* Invoked when an executor has exited/terminated. Note that any
* tasks running will have TASK_LOST status updates automagically
* generated.
*
* NOTE: This callback is not reliably delivered. If a host or
* network failure causes messages between the master and the
* scheduler to be dropped, this callback may not be invoked.
*
* @param driver The driver that was used to run this scheduler.
* @param executorId The ID of the executor that was lost.
* @param slaveId The ID of the slave that launched the executor.
* @param status The exit status of the executor.
*
* @see SchedulerDriver
* @see ExecutorID
* @see SlaveID
* @see Status
*/
void executorLost(SchedulerDriver driver,
ExecutorID executorId,
SlaveID slaveId,
int status);
/**
* Invoked when there is an unrecoverable error in the scheduler or
* driver. The driver will be aborted BEFORE invoking this callback.
*
* @param driver The driver that was used to run this scheduler.
* @param message The error message.
*
* @see SchedulerDriver
*/
void error(SchedulerDriver driver, String message);
}