@@ -209,28 +209,20 @@ module MigrateLocal = struct
209209 stop ~dbg ~id: mirror_id ;
210210 raise e
211211
212- let stat ~dbg : _ ~id =
212+ let stat ~dbg ~id =
213213 let recv_opt = State. find_active_receive_mirror id in
214214 let send_opt = State. find_active_local_mirror id in
215215 let copy_opt = State. find_active_copy id in
216+ let sr, _vdi = State. of_mirror_id id in
216217 let open State in
217218 let failed =
218219 match send_opt with
219220 | Some send_state ->
221+ let (module Migrate_Backend ) = choose_backend dbg sr in
220222 let failed =
221- match send_state.Send_state. tapdev with
222- | Some tapdev -> (
223- try
224- let stats = Tapctl. stats (Tapctl. create () ) tapdev in
225- stats.Tapctl.Stats. nbd_mirror_failed = 1
226- with _ ->
227- debug " Using cached copy of failure status" ;
228- send_state.Send_state. failed
229- )
230- | None ->
231- false
223+ Migrate_Backend. has_mirror_failed () ~dbg ~mirror_id: id ~sr
232224 in
233- send_state.Send_state. failed < - failed ;
225+ send_state.failed < - failed ;
234226 failed
235227 | None ->
236228 false
@@ -325,58 +317,9 @@ module MigrateLocal = struct
325317 State. clear ()
326318end
327319
328- exception Timeout of Mtime.Span. t
329-
330- let reqs_outstanding_timeout = Mtime.Span. (150 * s)
331-
332- let pp_time () = Fmt. str " %a" Mtime.Span. pp
333-
334- (* Tapdisk should time out after 2 mins. We can wait a little longer *)
335-
336- let pre_deactivate_hook ~dbg :_ ~dp :_ ~sr ~vdi =
337- let open State.Send_state in
338- let id = State. mirror_id_of (sr, vdi) in
339- let start = Mtime_clock. counter () in
340- State. find_active_local_mirror id
341- |> Option. iter (fun s ->
342- (* We used to pause here and then check the nbd_mirror_failed key. Now, we poll
343- until the number of outstanding requests has gone to zero, then check the
344- status. This avoids confusing the backend (CA-128460) *)
345- try
346- match s.tapdev with
347- | None ->
348- ()
349- | Some tapdev ->
350- let open Tapctl in
351- let ctx = create () in
352- let rec wait () =
353- let elapsed = Mtime_clock. count start in
354- if Mtime.Span. compare elapsed reqs_outstanding_timeout > 0 then
355- raise (Timeout elapsed) ;
356- let st = stats ctx tapdev in
357- if st.Stats. reqs_outstanding > 0 then (
358- Thread. delay 1.0 ; wait ()
359- ) else
360- (st, elapsed)
361- in
362- let st, elapsed = wait () in
363- debug " Got final stats after waiting %a" pp_time elapsed ;
364- if st.Stats. nbd_mirror_failed = 1 then (
365- error " tapdisk reports mirroring failed" ;
366- s.failed < - true
367- )
368- with
369- | Timeout elapsed ->
370- error
371- " Timeout out after %a waiting for tapdisk to complete all \
372- outstanding requests"
373- pp_time elapsed ;
374- s.failed < - true
375- | e ->
376- error " Caught exception while finally checking mirror state: %s"
377- (Printexc. to_string e) ;
378- s.failed < - true
379- )
320+ let pre_deactivate_hook ~dbg ~dp ~sr ~vdi =
321+ let (module Migrate_Backend ) = choose_backend dbg sr in
322+ Migrate_Backend. pre_deactivate_hook () ~dbg ~dp ~sr ~vdi
380323
381324let post_deactivate_hook ~sr ~vdi ~dp :_ =
382325 let open State.Send_state in
0 commit comments