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

[Xen-API] [PATCH 5 of 8] CA-43021: Tidy-up the chain reading code a little



# HG changeset patch
# User David Scott <dave.scott@xxxxxxxxxxxxx>
# Date 1282565813 -3600
# Node ID c2b46bf167dbcef8f2eb3114837e1f5ab352d678
# Parent  980bea836c4e7e93b586f42e632bdf3c4a863cdb
CA-43021: Tidy-up the chain reading code a little.

Signed-off-by: David Scott <dave.scott@xxxxxxxxxxxxx>

diff -r 980bea836c4e -r c2b46bf167db ocaml/xapi/sparse_dd.ml
--- a/ocaml/xapi/sparse_dd.ml   Mon Aug 23 13:16:51 2010 +0100
+++ b/ocaml/xapi/sparse_dd.ml   Mon Aug 23 13:16:53 2010 +0100
@@ -322,10 +322,10 @@
                last_percent := new_percent
 
 let _ = 
-       let base = ref "" and src = ref "" and dest = ref "" and size = ref 
(-1L) and prezeroed = ref false and test = ref false in
-       Arg.parse [ "-base", Arg.Set_string base, "base disk to search for 
differences from (default: None)";
-                   "-src", Arg.Set_string src, "source disk";
-                   "-dest", Arg.Set_string dest, "destination disk";
+       let base = ref None and src = ref None and dest = ref None and size = 
ref (-1L) and prezeroed = ref false and test = ref false in
+       Arg.parse [ "-base", Arg.String (fun x -> base := Some x), "base disk 
to search for differences from (default: None)";
+                   "-src", Arg.String (fun x -> src := Some x), "source disk";
+                   "-dest", Arg.String (fun x -> dest := Some x), "destination 
disk";
                    "-size", Arg.String (fun x -> size := Int64.of_string x), 
"number of bytes to copy";
                    "-prezeroed", Arg.Set prezeroed, "assume the destination 
disk has been prezeroed";
                    "-machine", Arg.Set machine_readable, "emit 
machine-readable output";
@@ -357,28 +357,47 @@
                test_lots_of_strings ();
                exit 0
        end;
-       if !src = "" || !dest = "" || !size = (-1L) then begin
+       if !src = None || !dest = None || !size = (-1L) then begin
                Printf.fprintf stderr "Must have -src -dest and -size 
arguments\n";
                exit 1;
        end;
-
+       let empty = Bat.of_list [] in
 
         let size = Some !size in
-       let src_vhd = vhd_of_device !src and dest_vhd = vhd_of_device !dest in
-       Printf.printf "auto-detect src vhd:  %s\n" (Opt.default "None" (Opt.map 
(fun x -> "Some " ^ x) src_vhd));
-       let bat = match src_vhd with
-       | Some vhd ->
-               (try
-                       let chain = chain_of_vhd vhd in
-                       Printf.printf "chain: %s\n" (String.concat "; " chain);
-                       let empty = Bat.of_list [] in
-                       Some (List.fold_left Bat.union empty (List.map bat 
chain))
-               with e ->
-                       Printf.printf "Caught exception: %s while calculating 
BAT. Ignoring all BAT information\n" (Printexc.to_string e);
-                       None)
-       | None -> None in
+
+       (** [chain_of_device device] returns [None] if [device] is None.
+           If device is [Some d] then returns [None] if no vhds were detected 
or [Some chain] *)
+       let chain_of_device device = 
+               let flatten = function
+               | Some (Some x) -> Some x
+               | Some None -> None
+               | None -> None in
+               let vhd : string option = flatten (Opt.map vhd_of_device 
device) in
+               let chain : string list option = Opt.map chain_of_vhd vhd in
+               let option y = Opt.default "None" (Opt.map (fun x -> "Some " ^ 
x) y) in
+               Printf.printf "%s has chain: [ %s ]" (option device) (option 
(Opt.map (String.concat "; ") chain));
+               chain in
+
+       let bat : Bat.t option = 
+       try
+               let src_chain = chain_of_device !src in
+               let base_chain = chain_of_device !base in
+
+               (* If the src_chain is None then we have no BAT information *)
+               Opt.map
+               (fun s ->
+                       let b = Opt.default [] base_chain in
+                       (* We need to copy blocks from: (base - src) + (src - 
base)
+                          ie. everything except for blocks from the shared 
nodes *)
+                       let unshared = List.set_difference b s @ 
(List.set_difference s b) in
+                       List.fold_left Bat.union empty (List.map bat unshared)
+               ) src_chain
+       with e ->
+               Printf.printf "Caught exception: %s while calculating BAT. 
Ignoring all BAT information\n" (Printexc.to_string e);
+               None in
+
        progress_cb 0.;
-       let stats = file_dd ~progress_cb ?size ?bat !prezeroed !src !dest in
+       let stats = file_dd ~progress_cb ?size ?bat !prezeroed (Opt.unbox !src) 
(Opt.unbox !dest) in
        Printf.printf "Time: %.2f seconds\n" (Unix.gettimeofday () -. start);
        Printf.printf "\nNumber of writes: %d\n" stats.writes;
        Printf.printf "Number of bytes: %Ld\n" stats.bytes
 ocaml/xapi/sparse_dd.ml |  59 ++++++++++++++++++++++++++++++++----------------
 1 files changed, 39 insertions(+), 20 deletions(-)


Attachment: xen-api.hg-5.patch
Description: Text Data

_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api

 


Rackspace

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