2016-10-04 16:25:11 -07:00
|
|
|
#ifndef PHOTON_SCHEDULER_H
|
|
|
|
#define PHOTON_SCHEDULER_H
|
|
|
|
|
|
|
|
#include "task.h"
|
2016-10-18 18:27:43 -07:00
|
|
|
#include "event_loop.h"
|
2016-10-04 16:25:11 -07:00
|
|
|
|
2016-12-24 20:02:25 -08:00
|
|
|
/* The duration between local scheduler heartbeats. */
|
2016-12-28 22:33:20 -08:00
|
|
|
#define LOCAL_SCHEDULER_HEARTBEAT_TIMEOUT_MILLISECONDS 100
|
2016-12-24 20:02:25 -08:00
|
|
|
|
2017-02-09 01:34:14 -08:00
|
|
|
#define DEFAULT_NUM_CPUS INT16_MAX
|
|
|
|
#define DEFAULT_NUM_GPUS 0
|
|
|
|
|
2016-10-04 17:06:52 -07:00
|
|
|
/**
|
|
|
|
* Establish a connection to a new client.
|
|
|
|
*
|
|
|
|
* @param loop Event loop of the local scheduler.
|
|
|
|
* @param listener_socket Socket the local scheduler is listening on for new
|
2016-10-05 13:30:10 -07:00
|
|
|
* client requests.
|
2016-10-04 17:06:52 -07:00
|
|
|
* @param context State of the local scheduler.
|
|
|
|
* @param events Flag for events that are available on the listener socket.
|
2016-10-05 13:30:10 -07:00
|
|
|
* @return Void.
|
2016-10-04 17:06:52 -07:00
|
|
|
*/
|
2016-10-18 18:27:43 -07:00
|
|
|
void new_client_connection(event_loop *loop,
|
|
|
|
int listener_sock,
|
|
|
|
void *context,
|
2016-10-04 16:25:11 -07:00
|
|
|
int events);
|
2016-09-27 19:11:09 -07:00
|
|
|
|
2016-10-04 17:06:52 -07:00
|
|
|
/**
|
2016-10-18 18:27:43 -07:00
|
|
|
* This function can be called by the scheduling algorithm to assign a task
|
|
|
|
* to a worker.
|
2016-10-04 17:06:52 -07:00
|
|
|
*
|
2016-10-18 18:27:43 -07:00
|
|
|
* @param info
|
|
|
|
* @param task The task that is submitted to the worker.
|
2017-02-05 14:52:28 -08:00
|
|
|
* @param worker The worker to assign the task to.
|
2016-10-05 13:30:10 -07:00
|
|
|
* @return Void.
|
2016-10-04 17:06:52 -07:00
|
|
|
*/
|
2016-12-04 15:51:03 -08:00
|
|
|
void assign_task_to_worker(local_scheduler_state *state,
|
2016-10-18 18:27:43 -07:00
|
|
|
task_spec *task,
|
2017-02-05 14:52:28 -08:00
|
|
|
local_scheduler_client *worker);
|
2016-09-27 19:11:09 -07:00
|
|
|
|
2016-10-04 17:06:52 -07:00
|
|
|
/**
|
2016-10-18 18:27:43 -07:00
|
|
|
* This is the callback that is used to process a notification from the Plasma
|
|
|
|
* store that an object has been sealed.
|
2016-10-04 17:06:52 -07:00
|
|
|
*
|
2016-10-18 18:27:43 -07:00
|
|
|
* @param loop The local scheduler's event loop.
|
|
|
|
* @param client_sock The file descriptor to read the notification from.
|
|
|
|
* @param context The local scheduler state.
|
|
|
|
* @param events
|
2016-10-05 13:30:10 -07:00
|
|
|
* @return Void.
|
2016-10-04 17:06:52 -07:00
|
|
|
*/
|
2016-10-18 18:27:43 -07:00
|
|
|
void process_plasma_notification(event_loop *loop,
|
|
|
|
int client_sock,
|
|
|
|
void *context,
|
|
|
|
int events);
|
2016-09-27 19:11:09 -07:00
|
|
|
|
2016-12-12 23:17:22 -08:00
|
|
|
/**
|
|
|
|
* Reconstruct an object. If the object does not exist on any nodes, according
|
|
|
|
* to the state tables, and if the object is not already being reconstructed,
|
|
|
|
* this triggers a single reexecution of the task that originally created the
|
|
|
|
* object.
|
|
|
|
*
|
|
|
|
* @param state The local scheduler state.
|
|
|
|
* @param object_id The ID of the object to reconstruct.
|
|
|
|
* @return Void.
|
|
|
|
*/
|
|
|
|
void reconstruct_object(local_scheduler_state *state, object_id object_id);
|
|
|
|
|
2017-02-09 01:34:14 -08:00
|
|
|
void print_resource_info(const local_scheduler_state *s, const task_spec *spec);
|
|
|
|
|
2017-02-17 17:08:52 -08:00
|
|
|
/**
|
|
|
|
* Kill a worker.
|
|
|
|
*
|
|
|
|
* @param worker The local scheduler client to kill.
|
|
|
|
* @param wait A boolean representing whether to wait for the killed worker to
|
|
|
|
* exit.
|
|
|
|
* @param Void.
|
|
|
|
*/
|
|
|
|
void kill_worker(local_scheduler_client *worker, bool wait);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Start a worker. This forks a new worker process that can be added to the
|
|
|
|
* pool of available workers, pending registration of its PID with the local
|
|
|
|
* scheduler.
|
|
|
|
*
|
|
|
|
* @param state The local scheduler state.
|
|
|
|
* @param actor_id The ID of the actor for this worker. If this worker is not an
|
|
|
|
* actor, then NIL_ACTOR_ID should be used.
|
|
|
|
* @param Void.
|
|
|
|
*/
|
|
|
|
void start_worker(local_scheduler_state *state, actor_id actor_id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update our accounting for the current resources being used, according to
|
|
|
|
* some task that is starting or finishing execution.
|
|
|
|
*
|
|
|
|
* @param state The local scheduler state.
|
|
|
|
* @param spec The specification for the task that is or was using resources.
|
|
|
|
* @param return_resources A boolean representing whether the task is starting
|
|
|
|
* or finishing execution. If true, then the task is finishing execution
|
|
|
|
* (possibly temporarily), so it will add to the dynamic resources
|
|
|
|
* available. Else, it will take from the dynamic resources available.
|
|
|
|
* @return Void.
|
|
|
|
*/
|
|
|
|
void update_dynamic_resources(local_scheduler_state *state,
|
|
|
|
task_spec *spec,
|
|
|
|
bool return_resources);
|
|
|
|
|
2016-12-12 23:17:22 -08:00
|
|
|
/** The following methods are for testing purposes only. */
|
|
|
|
#ifdef PHOTON_TEST
|
|
|
|
local_scheduler_state *init_local_scheduler(
|
2016-12-20 20:21:35 -08:00
|
|
|
const char *node_ip_address,
|
2016-12-12 23:17:22 -08:00
|
|
|
event_loop *loop,
|
|
|
|
const char *redis_addr,
|
|
|
|
int redis_port,
|
2016-12-21 18:53:12 -08:00
|
|
|
const char *local_scheduler_socket_name,
|
2016-12-12 23:17:22 -08:00
|
|
|
const char *plasma_manager_socket_name,
|
|
|
|
const char *plasma_store_socket_name,
|
2016-12-13 17:21:38 -08:00
|
|
|
const char *plasma_manager_address,
|
2017-01-27 01:28:48 -08:00
|
|
|
bool global_scheduler_exists,
|
2017-02-10 12:46:23 -08:00
|
|
|
const double static_resource_vector[],
|
2017-02-09 01:34:14 -08:00
|
|
|
const char *worker_path,
|
2017-02-10 12:46:23 -08:00
|
|
|
int num_workers);
|
2016-12-12 23:17:22 -08:00
|
|
|
|
|
|
|
void free_local_scheduler(local_scheduler_state *state);
|
|
|
|
|
|
|
|
scheduling_algorithm_state *get_algorithm_state(local_scheduler_state *state);
|
|
|
|
|
|
|
|
void process_message(event_loop *loop,
|
|
|
|
int client_sock,
|
|
|
|
void *context,
|
|
|
|
int events);
|
2017-02-10 12:46:23 -08:00
|
|
|
|
2016-12-12 23:17:22 -08:00
|
|
|
#endif
|
|
|
|
|
2016-10-04 16:25:11 -07:00
|
|
|
#endif /* PHOTON_SCHEDULER_H */
|