Skip to content

Commit 5f22d15

Browse files
authored
CA-402901: Update leaked dp to Sr (#6171)
When add leaked datapath: 1. add leaked datapath to Sr.vdis 2. write to db file 3. log enhance If there are storage exceptions raised when destroying datapath, the procedure fails and the state of VDI becomes incorrect, which leads to various abnormalresults in subsequent operations. To handle this, the leaked datapath is designed to redestroy the datapath and refresh the state before next storage operation via function remove_datapaths_andthen_nolock. But this mechanism doesn't take effect in current code. This commit is to fix this bug. leaked datapath should be added to Sr.vdis to make the leaked datapath really work. And write to db file to avoid losing the leaked datapath if xapi restarts.
2 parents 27e4e25 + dc651b3 commit 5f22d15

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

ocaml/xapi/storage_impl.ml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,10 @@ functor
459459
List.fold_left perform_one vdi_t ops
460460

461461
let perform_nolock context ~dbg ~dp ~sr ~vdi ~vm this_op =
462+
let __FUNCTION__ = "perform_nolock" in
463+
debug "%s dp=%s, sr=%s, vdi=%s, vm=%s, op=%s" __FUNCTION__ dp
464+
(s_of_sr sr) (s_of_vdi vdi) (s_of_vm vm)
465+
(Vdi_automaton.string_of_op this_op) ;
462466
match Host.find sr !Host.host with
463467
| None ->
464468
raise (Storage_error (Sr_not_attached (s_of_sr sr)))
@@ -479,6 +483,15 @@ functor
479483
superstate to superstate'. These may fail: if so we revert the
480484
datapath+VDI state to the most appropriate value. *)
481485
let ops = Vdi_automaton.( - ) superstate superstate' in
486+
debug "%s %s -> %s: %s" __FUNCTION__
487+
(Vdi_automaton.string_of_state superstate)
488+
(Vdi_automaton.string_of_state superstate')
489+
(String.concat ", "
490+
(List.map
491+
(fun (op, _) -> Vdi_automaton.string_of_op op)
492+
ops
493+
)
494+
) ;
482495
side_effects context dbg dp sr sr_t vdi vdi_t vm ops
483496
with e ->
484497
let e =
@@ -535,7 +548,8 @@ functor
535548
)
536549
with e ->
537550
if not allow_leak then (
538-
ignore (Vdi.add_leaked dp vdi_t) ;
551+
Sr.replace vdi (Vdi.add_leaked dp vdi_t) sr_t ;
552+
Everything.to_file !host_state_path (Everything.make ()) ;
539553
raise e
540554
) else (
541555
(* allow_leak means we can forget this dp *)

0 commit comments

Comments
 (0)