[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 7/8] tools/ocaml/xenstored: start live update process


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Edwin Török <edvin.torok@xxxxxxxxxx>
  • Date: Fri, 15 Jan 2021 22:28:49 +0000
  • Authentication-results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: Edwin Török <edvin.torok@xxxxxxxxxx>, "Christian Lindig" <christian.lindig@xxxxxxxxxx>, David Scott <dave@xxxxxxxxxx>, "Ian Jackson" <iwj@xxxxxxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, Pau Ruiz Safont <pau.safont@xxxxxxxxxx>
  • Delivery-date: Fri, 15 Jan 2021 22:52:43 +0000
  • Ironport-sdr: 9jlr/S+Fg0jA0mFFaWVtVhO82mWeFmb6c+xVOZz+81qBhs4FkeJTYRq6spJHCsiWM1cK55DYHL WRSoJgQMfx11TpkCHZSPiFdSzsmotWCTXbVaavv60by8Rvav/4guc9rGgJmseVkUomN9iGQKSS blw9ALxKH5V2Uh4jKQ14AVEfhkzg/6+J9ivkDpBYUs23WTwSWRPW54IvvjTacDdTMXdKh4ET+8 YVN/ZYJKYdyb+4DqlIFZpkhnV14y8xW2CRItXbVGE8wJGBXue775uCwBSgNmOktwnMvdzakZ49 6LA=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Signed-off-by: Edwin Török <edvin.torok@xxxxxxxxxx>
Reviewed-by: Pau Ruiz Safont <pau.safont@xxxxxxxxxx>
Reviewed-by: Christian Lindig <christian.lindig@xxxxxxxxxx>

---
Changed since V1:
* post publicly now that the XSA is out
---
 tools/ocaml/xenstored/logging.ml   |  3 +++
 tools/ocaml/xenstored/process.ml   |  8 +++++---
 tools/ocaml/xenstored/xenstored.ml | 29 ++++++++++++++++++++++-------
 3 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/tools/ocaml/xenstored/logging.ml b/tools/ocaml/xenstored/logging.ml
index 1ede131329..39c3036155 100644
--- a/tools/ocaml/xenstored/logging.ml
+++ b/tools/ocaml/xenstored/logging.ml
@@ -327,6 +327,9 @@ let end_transaction ~tid ~con =
        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
diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index c3c5dc58c0..3174d8ede5 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -112,6 +112,7 @@ let string_of_t t =
 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 =
@@ -151,7 +152,7 @@ let parse_live_update args =
                | "-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"
@@ -166,7 +167,7 @@ let parse_live_update args =
                                {!state with deadline = Unix.gettimeofday () +. 
float !timeout
                                ; force= !force; pending= true}
                | _ ->
-                       invalid_arg ("Unknown arguments: " ^ String.concat " " 
args)) ;
+                       invalid_arg ("Unknown arguments: " ^ String.concat "," 
args)) ;
        None
        with
        | Arg.Bad s | Arg.Help s | Invalid_argument s ->
@@ -200,7 +201,8 @@ let do_debug con t _domains cons data =
        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
diff --git a/tools/ocaml/xenstored/xenstored.ml 
b/tools/ocaml/xenstored/xenstored.ml
index 500d96753b..22413271fb 100644
--- a/tools/ocaml/xenstored/xenstored.ml
+++ b/tools/ocaml/xenstored/xenstored.ml
@@ -311,6 +311,11 @@ let _ =
                );
        );
 
+       (* required for xenstore-control to detect availability of live-update 
*)
+       Store.mkdir store Perms.Connection.full_rights (Store.Path.of_string 
"/tool");
+       Store.write store Perms.Connection.full_rights
+               (Store.Path.of_string "/tool/xenstored") Sys.executable_name;
+
        Sys.set_signal Sys.sighup (Sys.Signal_handle sighup_handler);
        Sys.set_signal Sys.sigterm (Sys.Signal_handle (fun _ ->
                 info "Received SIGTERM";
@@ -483,18 +488,28 @@ let _ =
                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 -> ());
-       ()
+       (* 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
-- 
2.29.2




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.