From e9176f67e9178145fafeb6781d3491c8d9a32335 Mon Sep 17 00:00:00 2001 From: Jon Ludlam Date: Thu, 23 Jul 2015 14:03:29 +0100 Subject: [PATCH] CA-176973: lvrename - retry when devmapper throws an exception Signed-off-by: Jon Ludlam --- xenvm/lvrename.ml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/xenvm/lvrename.ml b/xenvm/lvrename.ml index b7b9a91..dc455ab 100644 --- a/xenvm/lvrename.ml +++ b/xenvm/lvrename.ml @@ -3,6 +3,21 @@ open Cmdliner open Lwt +let retry fn = + let rec inner n = + match n with + | 0 -> return (fn ()) + | n -> + try + return (fn ()) + with e -> + Printf.fprintf stderr "Caught exception: %s. Retrying.\n%!" (Printexc.to_string e); + Lwt_unix.sleep 1.0 >>= + fun () -> + inner (n-1) + in + inner 5 + let lvrename copts (vg_name,lv_opt) newname physical_device = let module Devmapper = (val !Xenvm_common.dm : Devmapper.S.DEVMAPPER) in let lv_name = match lv_opt with | Some l -> l | None -> failwith "Need an LV name" in @@ -28,7 +43,8 @@ let lvrename copts (vg_name,lv_opt) newname physical_device = let all = Devmapper.ls () in let old_name = Mapper.name_of vg lv in if List.mem old_name all then begin - Devmapper.remove old_name; + retry (fun () -> Devmapper.remove old_name) + >>= fun () -> Mapper.read [ local_device ] >>= fun devices -> let targets = Mapper.to_targets devices vg lv in