(* $Id: netplex_types.mli 1065 2006-12-18 16:18:42Z gerd $ *)
(** Types for [Netplex] *)
type param_value =
[ `String of string
| `Int of int
| `Float of float
| `Bool of bool
]
type param_value_or_any =
[ param_value
| `Any of exn
]
type level =
[ `Emerg | `Alert | `Crit | `Err | `Warning | `Notice | `Info | `Debug ]
class type logger =
object
method log : component:string -> level:level -> message:string -> unit
method reopen : unit -> unit
method max_level : level
method set_max_level : level -> unit
end
type parallelization_type =
[ `Multi_processing
| `Multi_threading
| `Controller_attached
]
(** Type of parallelization:
* - [`Multi_processing] on a single host
* - [`Multi_threading] on a single host
* - [`Controller_attached] means that the service runs within the
* controller. This is (for now) only allowed for controller-internal
* services.
*)
type socket_state =
[ `Enabled | `Disabled | `Restarting of bool | `Down ]
(** The state of a socket:
* - [`Enabled]: The controller allows containers to accept connections.
* Note that this does not necessarily means that there such containers.
* - [`Disabled]: It is not allowed to accept new connections. The
* socket is kept open, however.
* - [`Restarting b]: The containers are being restarted. The boolean
* argument says whether the socket will be enabled after that.
* - [`Down]: The socket is down/closed
*)
type container_id = < >
(** Identifies a container *)
type container_state =
[ `Accepting of int * float
| `Busy
| `Starting of float
| `Shutting_down
]
(** The container state for workload management:
* - [`Accepting(n,t)]: The container is accepting further connections.
* It currently processes [n] connections. The last connection was
* accepted at time [t] (seconds since the epoch).
* - [`Busy]: The container does not accept connections
* - [`Starting t]: The container was started at time [t] and is not
* yet ready.
* - [`Shutting_down]: The container is being shutted down.
*)
type capacity =
[ `Normal_quality of int
| `Low_quality of int
| `Unavailable
]
(** How many connections a container can accept in addition to the
* existing connections:
* - [`Normal_quality n]: It can accept n connections with normal
* service quality, [n > 0]
* - [`Low_quality n]: It can accept n connections with low
* service quality (e.g. because it is already quite loaded), [n > 0]
* - [`Unavailable]: No capacity free
*)
class type controller =
object
method ptype : parallelization_type
(** The actually effective parallelization type *)
method controller_config : controller_config
method services : (socket_service * socket_controller * workload_manager) list
(** The list of controlled services *)
method add_service : socket_service -> workload_manager -> unit
(** Adds a new service. Containers for these services will be started
* soon. It is allowed to add several services with the same name
* (but it will be hard to distinguish them later).
*)
method add_admin : (Rpc_server.t -> unit) -> unit
(** [add_admin setup]: Allows to bind another RPC program to the admin
* socket. The function [setup] will be called whenever a connection
* to the admin socket is established, and this function can call
* [Rpc_server.bind] to bind another RPC program. By default, only
* the [Admin] interface is available as described in [netplex_ctrl.x].
*
* Note that this RPC server runs in the scope of the controller! No
* additional process or thread is created.
*)
method logger : logger
(** The logger *)
method event_system : Unixqueue.unix_event_system
(** The event system used by the controller. It {b must not} be used
* from a container.
*)
method restart : unit -> unit
(** Initiates a restart of all containers: All threads/processes are
* terminated and replaced by newly initialized ones.
*)
method shutdown : unit -> unit
(** Initiates a shutdown of all containers. It is no longer possible
* to add new services. When the shutdown has been completed,
* the controller will terminate itself.
*)
end
and controller_config =
object
method socket_directory : string
(** The directory where Unix domain sockets are created. For every
* service a subdirectory is created, and the socket has the name
* of the protocol.
*)
method create_logger : controller -> logger
(** Create a logger to be used for the whole Netplex system. The
* controller is already initialized which makes it possible to
* write the logger as Netplex service. Messages arriving during the
* creation are queued up and sent afterwards to the new logger.
*)
end
and socket_service =
object
method name : string
(** The name of the [socket_service] is used to identify the service
* in the whole netplex process cluster. Names are hierarchical;
* name components are separated by dots (e.g. "company.product.service").
* The prefix "netplex." is reserved for use by Netplex. The name
* "netplex.controller" refers to the service provided by the
* controller.
*)
method sockets : (string * Unix.file_descr array) list
(** A [socket_service] consists of a list of supported protocols
* which are identified by a name. Every protocol is available
* on a list of sockets (which may be bound to different addresses).
*)
method socket_service_config : socket_service_config
(** The configuration *)
method processor : processor
(** A user-supplied object to process incoming connections *)
method create_container : parallelization_type -> socket_service -> container
(** {b Internal method.} Called by the controller to create a new
* container. The container must match the parallelization type of
* the controller. This call is already done in the process/thread
* provided for the container.
*)
end
and socket_service_config =
object
method name : string
(** The proposed name for the [socket_service] *)
method protocols : protocol list
(** This list describes the sockets to create in detail *)
method change_user_to : (int * int) option
(** Instructs the container to change the user of the process after
* starting the service. This is only possible in multi-processing mode.
* In multi-threading mode, this parameter is ignored.
*)
end
and protocol =
object
method name : string
(** The protocol name is an arbitrary string identifying groups of
* sockets serving the same protocol for a [socket_service].
*)
method addresses : Unix.sockaddr array
(** The addresses of the master sockets. (The socket type is always
* SOCK_STREAM.) The list must be non-empty.
*)
method lstn_backlog : int
(** The backlog (argument of Unix.listen) *)
method lstn_reuseaddr : bool
(** Whether to reuse ports immediately *)
method so_keepalive : bool
(** Whether to set the keep-alive socket option *)
method configure_slave_socket : Unix.file_descr -> unit
(** A user-supplied function to configure slave sockets (after [accept]).
* The function is called from the process/thread of the container.
*)
end
and socket_controller =
object
method state : socket_state
(** The current state *)
method enable : unit -> unit
(** Enables a disabled socket service again *)
method disable : unit -> unit
(** Disable a socket service temporarily *)
method restart : unit -> unit
(** Restarts the containers for this socket service only *)
method shutdown : unit -> unit
(** Closes the socket service forever, and initiates a shutdown of all
* containers serving this type of service.
*)
method container_state : (container_id * container_state * bool) list
(* The bool says whether the container is selected to accept the
* next connection
*)
method start_containers : int -> unit
method stop_containers : container_id list -> unit
end
and processor_hooks =
object
method post_add_hook : socket_service -> unit
(** A user-supplied function that is called after the service has been
* added to the controller
*)
method post_rm_hook : socket_service -> unit
(** A user-supplied function that is called after the service has been
* removed from the controller
*)
method pre_start_hook : socket_service -> controller -> container_id -> unit
(** A user-supplied function that is called before the container is
* created and started. It is called from the process/thread of the
* controller.
*)
method post_start_hook : container -> unit
(** A user-supplied function that is called after the container is
* created and started, but before the first service request arrives.
* It is called from the process/thread of the
* container.
*)
method pre_finish_hook : container -> unit
(** A user-supplied function that is called just before the container is
* terminated. It is called from the process/thread of the
* container.
*)
method post_finish_hook : socket_service -> controller -> container_id -> unit
(** A user-supplied function that is called after the container is
* terminated. It is called from the process/thread of the
* controller.
*)
method receive_message :
container -> string -> string array -> unit
(** This function is called when a broadcast message is received.
* The first string is the name of the message, and the array are
* the arguments.
*)
method receive_admin_message :
container -> string -> string array -> unit
(** This function is called when a broadcast admin message is received.
* The first string is the name of the message, and the array are
* the arguments.
*)
method shutdown :