if !access_log_transaction_ops && tid <> 0
then access_logging ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end) ~level:Debug
+let live_update () =
+ xb_op ~tid:0 ~con:"" ~ty:Xenbus.Xb.Op.Debug "Live update begin"
+
let xb_answer ~tid ~con ~ty data =
let print, level = match ty with
| Xenbus.Xb.Op.Error when String.startswith "ENOENT" data -> !access_log_read_ops , Warn
let launch_exn t =
let executable, rest = args_of_t t in
let args = Array.of_list (executable :: rest) in
+ info "Launching %s, args: %s" executable (String.concat " " rest);
Unix.execv args.(0) args
let validate_exn t =
| "-s" :: _ ->
let timeout = ref 60 in
let force = ref false in
- Arg.parse_argv ~current:(ref 1) (Array.of_list args)
+ Arg.parse_argv ~current:(ref 0) (Array.of_list args)
[ ( "-t"
, Arg.Set_int timeout
, "timeout in seconds to wait for active transactions to finish"
then None
else try match split None '\000' data with
| "live-update" :: params ->
- LiveUpdate.parse_live_update params
+ let dropped_trailing_nul = params |> List.rev |> List.tl |> List.rev in
+ LiveUpdate.parse_live_update dropped_trailing_nul
| "print" :: msg :: _ ->
Logging.xb_op ~tid:0 ~ty:Xenbus.Xb.Op.Debug ~con:"=======>" msg;
None
in
Systemd.sd_notify_ready ();
+ let live_update = ref false in
while not (!quit && Connections.prevents_quit cons = [])
do
try
- main_loop ()
+ main_loop ();
+ live_update := Process.LiveUpdate.should_run cons;
+ if !live_update || !quit then begin
+ (* don't initiate live update if saving state fails *)
+ DB.to_file store cons Disk.xs_daemon_database;
+ quit := true;
+ end
with exc ->
- error "caught exception %s" (Printexc.to_string exc);
+ let bt = Printexc.get_backtrace () in
+ error "caught exception %s: %s" (Printexc.to_string exc) bt;
if cf.reraise_top_level then
raise exc
done;
info "stopping xenstored";
- DB.to_file store cons Disk.xs_daemon_database;
(* unlink pidfile so that launch-xenstore works again *)
Unixext.unlink_safe pidfile;
(match cf.pidfile with Some pidfile -> Unixext.unlink_safe pidfile | None -> ());
- ()
+
+ if !live_update then begin
+ Logging.live_update ();
+ Process.LiveUpdate.launch_exn !Process.LiveUpdate.state
+ end