Skip to content

Commit

Permalink
Merge pull request #5939 from Vincent-lau/private/shul2/sr-scan-health
Browse files Browse the repository at this point in the history
CP-51042: Raise error in sr-scan when SR.stat finds an unhealthy SR
  • Loading branch information
Vincent-lau authored Aug 16, 2024
2 parents d04ba27 + 0fbc9d5 commit 68f318b
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 20 deletions.
1 change: 1 addition & 0 deletions ocaml/xapi-idl/storage/storage_interface.ml
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,7 @@ module Errors = struct
| Content_ids_do_not_match of (string * string)
| Missing_configuration_parameter of string
| Internal_error of string
| Sr_unhealthy of sr_health
| Unknown_error
[@@default Unknown_error] [@@deriving rpcty]
end
Expand Down
47 changes: 27 additions & 20 deletions ocaml/xapi/xapi_sr.ml
Original file line number Diff line number Diff line change
Expand Up @@ -787,30 +787,37 @@ let scan ~__context ~sr =
SRScanThrottle.execute (fun () ->
transform_storage_exn (fun () ->
let sr_uuid = Db.SR.get_uuid ~__context ~self:sr in
let vs =
C.SR.scan (Ref.string_of task)
(Storage_interface.Sr.of_string sr_uuid)
in
let db_vdis =
Db.VDI.get_records_where ~__context
~expr:(Eq (Field "SR", Literal sr'))
in
update_vdis ~__context ~sr db_vdis vs ;

let sr_info =
C.SR.stat (Ref.string_of task)
(Storage_interface.Sr.of_string sr_uuid)
in
let virtual_allocation =
List.fold_left Int64.add 0L
(List.map (fun v -> v.Storage_interface.virtual_size) vs)
in
Db.SR.set_virtual_allocation ~__context ~self:sr
~value:virtual_allocation ;
Db.SR.set_physical_size ~__context ~self:sr ~value:sr_info.total_space ;
Db.SR.set_physical_utilisation ~__context ~self:sr
~value:(Int64.sub sr_info.total_space sr_info.free_space) ;
Db.SR.remove_from_other_config ~__context ~self:sr ~key:"dirty" ;
Db.SR.set_clustered ~__context ~self:sr ~value:sr_info.clustered
match sr_info with
| {health; _} when health <> Healthy ->
raise Storage_interface.(Storage_error (Sr_unhealthy health))
| _ ->
let vs =
C.SR.scan (Ref.string_of task)
(Storage_interface.Sr.of_string sr_uuid)
in
let db_vdis =
Db.VDI.get_records_where ~__context
~expr:(Eq (Field "SR", Literal sr'))
in
update_vdis ~__context ~sr db_vdis vs ;
let virtual_allocation =
List.fold_left
(fun acc v -> Int64.add v.Storage_interface.virtual_size acc)
0L vs
in
Db.SR.set_virtual_allocation ~__context ~self:sr
~value:virtual_allocation ;
Db.SR.set_physical_size ~__context ~self:sr
~value:sr_info.total_space ;
Db.SR.set_physical_utilisation ~__context ~self:sr
~value:(Int64.sub sr_info.total_space sr_info.free_space) ;
Db.SR.remove_from_other_config ~__context ~self:sr ~key:"dirty" ;
Db.SR.set_clustered ~__context ~self:sr ~value:sr_info.clustered
)
)

Expand Down

0 comments on commit 68f318b

Please sign in to comment.