(* $Id$ *)
let configure rpc_program_number cf addr : Cache_server.cache_instance =
let get_param name =
try cf # resolve_parameter addr name
with Not_found ->
failwith ("Missing parameter '" ^ name ^ "'") in
let get_string_param name =
cf # string_param (get_param name) in
let get_int_param name =
cf # int_param (get_param name) in
let directory = get_string_param "cache_directory" in
let max_size = Int64.of_int (get_int_param "cache_max_size") in
let save_cache_period = get_int_param "save_cache_period" in
let save_cache_speed = get_int_param "save_cache_speed" in
let cconfig =
( object
method directory = directory
method max_size = max_size
method save_cache_period = save_cache_period
method save_cache_speed = save_cache_speed
method rpc_program_number = rpc_program_number
end
) in
Cache_server.create cconfig
;;
let do_setup rpc_enable also_setup srv (cache : Cache_server.cache_instance) =
if rpc_enable then
Cache_server.bind srv cache;
also_setup srv cache
;;
let hooks post_start_hook (cache : Cache_server.cache_instance)
: Netplex_types.processor_hooks =
object
inherit Netplex_kit.empty_processor_hooks()
method post_start_hook cont =
(* It is important that the cache is first activated in the
container process!
*)
Cache_server.activate cont#event_system cache;
cont # log `Notice "Container started";
post_start_hook cache cont
method pre_finish_hook cont =
cont # log `Notice "Container shut down";
method receive_admin_message cont cmd args =
match cmd with
| "verify" ->
let log = cont # log `Notice in
Cache_server.verify log cache
| "save" ->
Cache_server.save cache
| _ ->
()
end
;;
let factory ?(post_start_hook = fun _ _ -> ())
?(setup = fun _ _ -> ())
?(rpc_enable = true)
?(rpc_program_number = 600l)
~name () =
Rpc_netplex.rpc_factory
~configure:(configure rpc_program_number)
~setup:(do_setup rpc_enable setup)
~hooks:(hooks post_start_hook)
~name
()
;;