Skip to content

Commit

Permalink
CP-3657: Update alert priorities
Browse files Browse the repository at this point in the history
* Reversed the meaning of mail-min-priority config key, and renamed it
mail-max-priority.

* Removed priority checking from Xapi_vmpp.

* Updated priority checking in mail-alarm.

* Updated comments to reflect XenCenter usage.
  • Loading branch information
mietek committed Sep 19, 2012
1 parent f03a307 commit 8383d08
Show file tree
Hide file tree
Showing 22 changed files with 168 additions and 156 deletions.
140 changes: 73 additions & 67 deletions ocaml/idl/api_messages.ml
Expand Up @@ -11,93 +11,99 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details. * GNU Lesser General Public License for more details.
*) *)

(*
Priority Name Description
-------- --------------------- -----------------------------------------------------------------------------
1 Data-loss imminent Take action now or your data may be permanently lost (e.g. corrupted)
2 Service-loss imminent Take action now or some service(s) may fail (e.g. host / VM crash)
3 Service degraded Take action now or some service may suffer (e.g. NIC bond degraded without HA)
4 Service recovered Notice that something just improved (e.g. NIC bond repaired)
5 Informational More day-to-day stuff (e.g. VM started, suspended, shutdown, rebooted etc)
*)

let msgList = ref [] let msgList = ref []


let addMessage x = let addMessage name priority =
let _ = msgList := x::!msgList in let msg = (name, priority) in
x let _ = msgList := msg :: !msgList in
msg

let license_does_not_support_pooling = addMessage "LICENSE_DOES_NOT_SUPPORT_POOLING" 2L (* Name conflict with Api_errors; unused in xen-api *)
let license_expires_soon = addMessage "LICENSE_EXPIRES_SOON" 2L (* Used by license-check.py, which may be unused? *)


let license_does_not_support_pooling = addMessage "LICENSE_DOES_NOT_SUPPORT_POOLING" let ha_statefile_lost = addMessage "HA_STATEFILE_LOST" 2L
(* Fired by license-check.py *)
let license_expires_soon = addMessage "LICENSE_EXPIRES_SOON"


let ha_statefile_lost = addMessage "HA_STATEFILE_LOST" let ha_heartbeat_approaching_timeout = addMessage "HA_HEARTBEAT_APPROACHING_TIMEOUT" 5L
let ha_statefile_lost_priority = 10L let ha_statefile_approaching_timeout = addMessage "HA_STATEFILE_APPROACHING_TIMEOUT" 5L
let ha_xapi_healthcheck_approaching_timeout = addMessage "HA_XAPI_HEALTHCHECK_APPROACHING_TIMEOUT" 5L


let ha_heartbeat_approaching_timeout = addMessage "HA_HEARTBEAT_APPROACHING_TIMEOUT" let ha_network_bonding_error = addMessage "HA_NETWORK_BONDING_ERROR" 3L
let ha_statefile_approaching_timeout = addMessage "HA_STATEFILE_APPROACHING_TIMEOUT"
let ha_xapi_healthcheck_approaching_timeout = addMessage "HA_XAPI_HEALTHCHECK_APPROACHING_TIMEOUT"


let ha_network_bonding_error = addMessage "HA_NETWORK_BONDING_ERROR" let ha_pool_overcommitted = addMessage "HA_POOL_OVERCOMMITTED" 3L (* GUI maximizes ntol, which means this is often subsumed by DROP_IN_PLAN_EXISTS_FOR; hence low priority *)
let ha_network_bonding_error_priority = 10L


let ha_pool_overcommitted = addMessage "HA_POOL_OVERCOMMITTED" let ha_pool_drop_in_plan_exists_for = addMessage "HA_POOL_DROP_IN_PLAN_EXISTS_FOR" 3L
let ha_pool_overcommitted_priority = 1L (* GUI maximizes ntol, which means this is often subsumed by DROP_IN_PLAN_EXISTS_FOR; hence low priority *) let ha_protected_vm_restart_failed = addMessage "HA_PROTECTED_VM_RESTART_FAILED" 2L


let ha_pool_drop_in_plan_exists_for = addMessage "HA_POOL_DROP_IN_PLAN_EXISTS_FOR" let ha_host_failed = addMessage "HA_HOST_FAILED" 3L
let ha_protected_vm_restart_failed = addMessage "HA_PROTECTED_VM_RESTART_FAILED"


let ha_host_failed = addMessage "HA_HOST_FAILED" let ha_host_was_fenced = addMessage "HA_HOST_WAS_FENCED" 4L
let ha_host_failed_priority = 10L


let ha_host_was_fenced = addMessage "HA_HOST_WAS_FENCED" let redo_log_healthy = addMessage "METADATA_LUN_HEALTHY" 4L
let redo_log_broken = addMessage "METADATA_LUN_BROKEN" 3L


let redo_log_healthy = addMessage "METADATA_LUN_HEALTHY" let ip_configured_pif_can_unplug = addMessage "IP_CONFIGURED_PIF_CAN_UNPLUG" 3L
let redo_log_broken = addMessage "METADATA_LUN_BROKEN"


let ip_configured_pif_can_unplug = addMessage "IP_CONFIGURED_PIF_CAN_UNPLUG" let vif_qos_failed = addMessage "VIF_QOS_FAILED" 3L (* Used in idl/datamodel.ml *)
let vbd_qos_failed = addMessage "VBD_QOS_FAILED" 3L (* Used in idl/datamodel.ml *)
let vcpu_qos_failed = addMessage "VCPU_QOS_FAILED" 3L (* Used in idl/datamodel.ml *)


let vif_qos_failed = addMessage "VIF_QOS_FAILED" let vm_started = addMessage "VM_STARTED" 5L
let vbd_qos_failed = addMessage "VBD_QOS_FAILED" let vm_shutdown = addMessage "VM_SHUTDOWN" 5L (* Name conflict with Api_errors *)
let vcpu_qos_failed = addMessage "VCPU_QOS_FAILED" let vm_rebooted = addMessage "VM_REBOOTED" 5L (* Name conflict with Api_errors *)
let vm_suspended = addMessage "VM_SUSPENDED" 5L
let vm_resumed = addMessage "VM_RESUMED" 5L
let vm_crashed = addMessage "VM_CRASHED" 2L (* Name conflict with Api_errors; unused in xen-api *)
let vm_cloned = addMessage "VM_CLONED" 5L (* Prviously missing from table *)


let vm_started = addMessage "VM_STARTED" let host_sync_data_failed = addMessage "HOST_SYNC_DATA_FAILED" 3L (* Kept for backward compatibility; used in XenCenter *)
let vm_shutdown = addMessage "VM_SHUTDOWN" let host_clock_skew_detected = addMessage "HOST_CLOCK_SKEW_DETECTED" 3L
let vm_rebooted = addMessage "VM_REBOOTED" let host_clock_went_backwards = addMessage "HOST_CLOCK_WENT_BACKWARDS" 1L (* Unused in xen-api *)
let vm_suspended = addMessage "VM_SUSPENDED"
let vm_resumed = addMessage "VM_RESUMED"
let vm_crashed = addMessage "VM_CRASHED"
let vm_cloned = addMessage "VM_CLONED"
let host_sync_data_failed = addMessage "HOST_SYNC_DATA_FAILED" (* Kept for backward compatibility. *)
let host_clock_skew_detected = addMessage "HOST_CLOCK_SKEW_DETECTED"
let host_clock_skew_detected_priority = 10L
let host_clock_went_backwards = addMessage "HOST_CLOCK_WENT_BACKWARDS"
let host_clock_went_backwards_priority = 10L


let pool_master_transition = addMessage "POOL_MASTER_TRANSITION" let pool_master_transition = addMessage "POOL_MASTER_TRANSITION" 4L


let pbd_plug_failed_on_server_start = addMessage "PBD_PLUG_FAILED_ON_SERVER_START" let pbd_plug_failed_on_server_start = addMessage "PBD_PLUG_FAILED_ON_SERVER_START" 3L


let alarm = addMessage "ALARM" let alarm = addMessage "ALARM" 1L (* Previously missing from table; unused in xen-api *)


let wlb_failed = addMessage "WLB_CONSULTATION_FAILED" let wlb_failed = addMessage "WLB_CONSULTATION_FAILED" 3L
let wlb_optimization_alert = addMessage "WLB_OPTIMIZATION_ALERT" let wlb_optimization_alert = addMessage "WLB_OPTIMIZATION_ALERT" 3L (* Used in XenCenter *)


let auth_external_init_failed = addMessage "EXTAUTH_INIT_IN_HOST_FAILED" let auth_external_init_failed = addMessage "EXTAUTH_INIT_IN_HOST_FAILED" 2L
let auth_external_pool_non_homogeneous = addMessage "EXTAUTH_IN_POOL_IS_NON_HOMOGENEOUS" let auth_external_pool_non_homogeneous = addMessage "EXTAUTH_IN_POOL_IS_NON_HOMOGENEOUS" 2L


let multipath_periodic_alert = addMessage "MULTIPATH_PERIODIC_ALERT" let multipath_periodic_alert = addMessage "MULTIPATH_PERIODIC_ALERT" 3L


let v6_server_up = addMessage "LICENSE_SERVER_CONNECTED" let v6_server_up = addMessage "LICENSE_SERVER_CONNECTED" 4L (* Used in XenCenter *)
let v6_server_down = addMessage "LICENSE_SERVER_UNAVAILABLE" let v6_server_down = addMessage "LICENSE_SERVER_UNAVAILABLE" 3L (* Used in XenCenter *)
let v6_license_expired = addMessage "LICENSE_EXPIRED" let v6_license_expired = addMessage "LICENSE_EXPIRED" 2L (* Used in XenCenter *)
let v6_grace_license = addMessage "GRACE_LICENSE" let v6_grace_license = addMessage "GRACE_LICENSE" 3L
let v6_rejected = addMessage "LICENSE_NOT_AVAILABLE" let v6_rejected = addMessage "LICENSE_NOT_AVAILABLE" 2L
let v6_comm_error = addMessage "LICENSE_SERVER_UNREACHABLE" let v6_comm_error = addMessage "LICENSE_SERVER_UNREACHABLE" 2L


(* VMPP message types *) (* VMPP message types *)
let vmpp_backup_lock_failed = addMessage "VMPP_SNAPSHOT_LOCK_FAILED" (*'The snapshot phase is already executing for this protection policy. Please try again later'*) let vmpp_snapshot_lock_failed = addMessage "VMPP_SNAPSHOT_LOCK_FAILED" 3L (*'The snapshot phase is already executing for this protection policy. Please try again later'*)
let vmpp_backup_succeeded = addMessage "VMPP_SNAPSHOT_SUCCEEDED" (*'Successfully performed the snapshot phase of the protection policy'*) let vmpp_snapshot_succeeded = addMessage "VMPP_SNAPSHOT_SUCCEEDED" 5L (*'Successfully performed the snapshot phase of the protection policy'*)
let vmpp_archive_lock_failed = addMessage "VMPP_ARCHIVE_LOCK_FAILED" (*'The archive sub-policy is already executing for some protection policy in the pool.Please try again later'*) let vmpp_snapshot_failed = addMessage "VMPP_SNAPSHOT_FAILED" 3L (*'The snapshot phase of the protection policy failed.'*)
let vmpp_archive_failed_0 = addMessage "VMPP_ARCHIVE_FAILED_0" (*'The archive phase failed for this protection policy'*) let vmpp_archive_lock_failed = addMessage "VMPP_ARCHIVE_LOCK_FAILED" 3L (*'The archive sub-policy is already executing for some protection policy in the pool.Please try again later'*)
let vmpp_archive_suceeded = addMessage "VMPP_ARCHIVE_SUCCEEDED" (*'Successfully performed the archive phase of the protection policy'*) let vmpp_archive_failed_0 = addMessage "VMPP_ARCHIVE_FAILED_0" 3L (*'The archive phase failed for this protection policy'*)
let vmpp_archive_target_mount_failed = addMessage "VMPP_ARCHIVE_TARGET_MOUNT_FAILED" (*'Failed to mount the archive target. Please check the archive target configuration settings'*) let vmpp_archive_suceeded = addMessage "VMPP_ARCHIVE_SUCCEEDED" 5L (*'Successfully performed the archive phase of the protection policy'*)
let vmpp_archive_target_unmount_failed = addMessage "VMPP_ARCHIVE_TARGET_UNMOUNT_FAILED" (*'Failed to unmount the archive target. Please make sure than the local directory was mounted successfully and has no open handles'*) let vmpp_archive_target_mount_failed = addMessage "VMPP_ARCHIVE_TARGET_MOUNT_FAILED" 3L (*'Failed to mount the archive target. Please check the archive target configuration settings'*)
let vmpp_license_error = addMessage "VMPP_LICENSE_ERROR" (*'This operation is not allowed under your license. Please contact your support representative'*) let vmpp_archive_target_unmount_failed = addMessage "VMPP_ARCHIVE_TARGET_UNMOUNT_FAILED" 3L (*'Failed to unmount the archive target. Please make sure than the local directory was mounted successfully and has no open handles'*)
let vmpp_xapi_logon_failure = addMessage "VMPP_XAPI_LOGON_FAILURE" (*'Could not login to API session.'*) let vmpp_license_error = addMessage "VMPP_LICENSE_ERROR" 3L (*'This operation is not allowed under your license. Please contact your support representative'*)
let vmpp_backup_missed_event = addMessage "VMPP_SNAPSHOT_MISSED_EVENT" (*'A scheduled snapshot event was missed due to another on-going scheduled snapshot run. This is unexpected behaviour, please re-configure your snapshot sub-policy',*) let vmpp_xapi_logon_failure = addMessage "VMPP_XAPI_LOGON_FAILURE" 3L (*'Could not login to API session.'*)
let vmpp_archive_missed_event = addMessage "VMPP_ARCHIVE_MISSED_EVENT" (*'A scheduled archive event was missed due to another on-going scheduled archive run. This is unexpected behaviour, please re-configure your archive sub-policy'*) let vmpp_snapshot_missed_event = addMessage "VMPP_SNAPSHOT_MISSED_EVENT" 3L (*'A scheduled snapshot event was missed due to another on-going scheduled snapshot run. This is unexpected behaviour, please re-configure your snapshot sub-policy',*)
let vmpp_backup_failed = addMessage "VMPP_SNAPSHOT_FAILED" (*'The snapshot phase of the protection policy failed.'*) let vmpp_archive_missed_event = addMessage "VMPP_ARCHIVE_MISSED_EVENT" 3L (*'A scheduled archive event was missed due to another on-going scheduled archive run. This is unexpected behaviour, please re-configure your archive sub-policy'*)
let vmpp_snapshot_archive_already_exists = addMessage "VMPP_SNAPSHOT_ARCHIVE_ALREADY_EXISTS" (*'Failed to archive the snapshot, it has already been archived on the specified target'*) let vmpp_snapshot_archive_already_exists = addMessage "VMPP_SNAPSHOT_ARCHIVE_ALREADY_EXISTS" 3L (*'Failed to archive the snapshot, it has already been archived on the specified target'*)


let bond_status_changed = addMessage "BOND_STATUS_CHANGED" (* A link in a bond went down or came back up *) let bond_status_changed = addMessage "BOND_STATUS_CHANGED" 3L (* A link in a bond went down or came back up *) (* Previously missing from table *)
24 changes: 12 additions & 12 deletions ocaml/idl/datamodel.ml
Expand Up @@ -1135,18 +1135,18 @@ let _ =




let _ = let _ =
message Api_messages.ha_pool_overcommitted ~doc:"Pool has become overcommitted: it can nolonger guarantee to restart protected VMs if the configured number of hosts fail." (); message (fst Api_messages.ha_pool_overcommitted) ~doc:"Pool has become overcommitted: it can no longer guarantee to restart protected VMs if the configured number of hosts fail." ();
message Api_messages.ha_statefile_lost ~doc:"Host lost access to HA storage heartbeat" (); message (fst Api_messages.ha_statefile_lost) ~doc:"Host lost access to HA storage heartbeat" ();
message Api_messages.ha_heartbeat_approaching_timeout ~doc:"HA network heartbeat almost timed-out" (); message (fst Api_messages.ha_heartbeat_approaching_timeout) ~doc:"HA network heartbeat almost timed-out" ();
message Api_messages.ha_statefile_approaching_timeout ~doc:"HA storage heartbeat almost timed-out" (); message (fst Api_messages.ha_statefile_approaching_timeout) ~doc:"HA storage heartbeat almost timed-out" ();
message Api_messages.ha_xapi_healthcheck_approaching_timeout ~doc:"HA xapi healthcheck almost timed-out" (); message (fst Api_messages.ha_xapi_healthcheck_approaching_timeout) ~doc:"HA xapi healthcheck almost timed-out" ();
message Api_messages.ha_network_bonding_error ~doc:"HA network heartbeat interface bonding error" (); message (fst Api_messages.ha_network_bonding_error) ~doc:"HA network heartbeat interface bonding error" ();
message Api_messages.vif_qos_failed ~doc:"Applying QoS to VIF failed." (); message (fst Api_messages.vif_qos_failed) ~doc:"Applying QoS to VIF failed." ();
message Api_messages.vbd_qos_failed ~doc:"Applying QoS to VBD failed." (); message (fst Api_messages.vbd_qos_failed) ~doc:"Applying QoS to VBD failed." ();
message Api_messages.vcpu_qos_failed ~doc:"Applying QoS to VCPU failed." (); message (fst Api_messages.vcpu_qos_failed) ~doc:"Applying QoS to VCPU failed." ();
message Api_messages.pool_master_transition ~doc:"Host has become the new Pool master." (); message (fst Api_messages.pool_master_transition) ~doc:"Host has become the new Pool master." ();
message Api_messages.pbd_plug_failed_on_server_start ~doc:"Host failed to attach one or more Storage Repositories." (); message (fst Api_messages.pbd_plug_failed_on_server_start) ~doc:"Host failed to attach one or more Storage Repositories." ();
() ()


(* ------------------------------------------------------------------------------------------------------------ (* ------------------------------------------------------------------------------------------------------------
Session Management Session Management
Expand Down
3 changes: 2 additions & 1 deletion ocaml/mpathalert/mpathalert.ml
Expand Up @@ -267,7 +267,8 @@ let sender rpc session (delay, msg, queue) =
end); end);


if Buffer.length msg <> 0 then begin if Buffer.length msg <> 0 then begin
let (_:API.ref_message) = Client.Message.create rpc session Api_messages.multipath_periodic_alert 5L `Pool pool_uuid (Buffer.contents msg) in let (name, priority) = Api_messages.multipath_periodic_alert in
let (_:API.ref_message) = Client.Message.create rpc session name priority `Pool pool_uuid (Buffer.contents msg) in
remember_broken_history state_of_the_world; remember_broken_history state_of_the_world;
Buffer.clear msg; Buffer.clear msg;
end; end;
Expand Down
6 changes: 3 additions & 3 deletions ocaml/multipathrt/alert_utils.ml
Expand Up @@ -147,7 +147,7 @@ let wait_for_alert rpc session ?(delay=180.0) check_message f =
raise (Multipathrt_exceptions.Test_error (Printf.sprintf "received unexpected exception: %s" (Printexc.to_string e))) raise (Multipathrt_exceptions.Test_error (Printf.sprintf "received unexpected exception: %s" (Printexc.to_string e)))


let wait_for_alert_saying_all_is_well rpc session scsi_id max_paths = let wait_for_alert_saying_all_is_well rpc session scsi_id max_paths =
wait_for_alert rpc session (fun msg -> msg.API.message_name = Api_messages.multipath_periodic_alert) (fun msg -> wait_for_alert rpc session (fun msg -> msg.API.message_name = fst Api_messages.multipath_periodic_alert) (fun msg ->
(* Check there's no unhealthy entry for this path *) (* Check there's no unhealthy entry for this path *)
let body = parse_alert_body msg.API.message_body in let body = parse_alert_body msg.API.message_body in
begin begin
Expand All @@ -169,7 +169,7 @@ let wait_for_alert_saying_all_is_well rpc session scsi_id max_paths =
) )


let wait_for_alert_saying_we_flapped rpc session scsi_id max_paths = let wait_for_alert_saying_we_flapped rpc session scsi_id max_paths =
wait_for_alert rpc session (fun msg -> msg.API.message_name = Api_messages.multipath_periodic_alert) (fun msg -> wait_for_alert rpc session (fun msg -> msg.API.message_name = fst Api_messages.multipath_periodic_alert) (fun msg ->
(* Check there's no unhealthy entry for this path *) (* Check there's no unhealthy entry for this path *)
let body = parse_alert_body msg.API.message_body in let body = parse_alert_body msg.API.message_body in
begin begin
Expand All @@ -195,7 +195,7 @@ let wait_for_alert_saying_we_flapped rpc session scsi_id max_paths =


let wait_for_alert_saying_path_is_unhealthy rpc session scsi_id max_paths = let wait_for_alert_saying_path_is_unhealthy rpc session scsi_id max_paths =
wait_for_alert rpc session (fun msg -> wait_for_alert rpc session (fun msg ->
msg.API.message_name = Api_messages.multipath_periodic_alert && begin msg.API.message_name = fst Api_messages.multipath_periodic_alert && begin
let body = parse_alert_body msg.API.message_body in let body = parse_alert_body msg.API.message_body in
let unhealthy_entries = get_entries_concerning_scsiid body.unhealthy scsi_id in let unhealthy_entries = get_entries_concerning_scsiid body.unhealthy scsi_id in
match unhealthy_entries with match unhealthy_entries with
Expand Down
4 changes: 2 additions & 2 deletions ocaml/network/network_monitor_thread.ml
Expand Up @@ -40,9 +40,9 @@ let send_bond_change_alert dev interfaces message =
let obj_uuid = Util_inventory.lookup Util_inventory._installation_uuid in let obj_uuid = Util_inventory.lookup Util_inventory._installation_uuid in
let body = Printf.sprintf "The status of the %s bond %s" ifaces message in let body = Printf.sprintf "The status of the %s bond %s" ifaces message in
try try
let (name, priority) = Api_messages.bond_status_changed in
let (_: 'a Ref.t) = XenAPI.Message.create ~rpc:xapi_rpc ~session_id let (_: 'a Ref.t) = XenAPI.Message.create ~rpc:xapi_rpc ~session_id
~name:Api_messages.bond_status_changed ~priority:1L ~cls:`Host ~name ~priority ~cls:`Host ~obj_uuid ~body in ()
~obj_uuid ~body in ()
with _ -> with _ ->
warn "Exception sending a bond-status-change alert." warn "Exception sending a bond-status-change alert."
) )
Expand Down
2 changes: 1 addition & 1 deletion ocaml/xapi/create_storage.ml
Expand Up @@ -110,7 +110,7 @@ let create_storage (me: API.ref_host) rpc session_id __context : unit =
let all_pbds_ok = plug_all_pbds __context rpc session_id in let all_pbds_ok = plug_all_pbds __context rpc session_id in
if not(all_pbds_ok) then begin if not(all_pbds_ok) then begin
let obj_uuid = Helpers.get_localhost_uuid () in let obj_uuid = Helpers.get_localhost_uuid () in
Xapi_alert.add ~name:Api_messages.pbd_plug_failed_on_server_start ~priority:1L ~cls:`Host ~obj_uuid ~body:""; Xapi_alert.add ~msg:Api_messages.pbd_plug_failed_on_server_start ~cls:`Host ~obj_uuid ~body:"";
end; end;
Xapi_host_helpers.consider_enabling_host ~__context Xapi_host_helpers.consider_enabling_host ~__context


Expand Down
2 changes: 1 addition & 1 deletion ocaml/xapi/db_gc.ml
Expand Up @@ -149,7 +149,7 @@ let detect_clock_skew ~__context host skew =
let host_name_label = Db.Host.get_name_label ~__context ~self:host in let host_name_label = Db.Host.get_name_label ~__context ~self:host in
let pool = Helpers.get_pool ~__context in let pool = Helpers.get_pool ~__context in
let pool_name_label = Db.Pool.get_name_label ~__context ~self:pool in let pool_name_label = Db.Pool.get_name_label ~__context ~self:pool in
Xapi_alert.add ~name:Api_messages.host_clock_skew_detected ~priority:Api_messages.host_clock_skew_detected_priority ~cls:`Host ~obj_uuid Xapi_alert.add ~msg:Api_messages.host_clock_skew_detected ~cls:`Host ~obj_uuid
~body:(Printf.sprintf "The clock on server '%s' may not be synchronized with the other servers in pool '%s'. This could lead to errors when performing VM lifecycle operations, and will also affect the times recorded against archived performance data gathered from this server." host_name_label pool_name_label) ~body:(Printf.sprintf "The clock on server '%s' may not be synchronized with the other servers in pool '%s'. This could lead to errors when performing VM lifecycle operations, and will also affect the times recorded against archived performance data gathered from this server." host_name_label pool_name_label)
end; end;
(* If we are under half the max skew then re-arm the message sender *) (* If we are under half the max skew then re-arm the message sender *)
Expand Down

0 comments on commit 8383d08

Please sign in to comment.