From c355c40ea896d1bae3e80dc7d1acbfaa0c627aab Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Fri, 13 May 2022 13:04:56 +0200 Subject: [PATCH] refactor: call emqx_alarm:ensure_deactivated everywhere --- apps/emqx/src/emqx_alarm.erl | 35 +++++++++++++------ apps/emqx/src/emqx_alarm_handler.erl | 4 +-- apps/emqx/src/emqx_congestion.erl | 2 +- apps/emqx/src/emqx_os_mon.erl | 13 ++++--- apps/emqx/src/emqx_sys_mon.erl | 2 +- apps/emqx/src/emqx_vm_mon.erl | 2 +- .../src/emqx_resource_health_check.erl | 2 +- .../emqx_license/src/emqx_license_checker.erl | 2 +- .../src/emqx_license_resources.erl | 2 +- 9 files changed, 40 insertions(+), 24 deletions(-) diff --git a/apps/emqx/src/emqx_alarm.erl b/apps/emqx/src/emqx_alarm.erl index eca1aeed2..a9419b27e 100644 --- a/apps/emqx/src/emqx_alarm.erl +++ b/apps/emqx/src/emqx_alarm.erl @@ -35,6 +35,8 @@ deactivate/1, deactivate/2, deactivate/3, + ensure_deactivated/1, + ensure_deactivated/2, ensure_deactivated/3, delete_all_deactivated_alarms/0, get_alarms/0, @@ -114,6 +116,28 @@ activate(Name, Details) -> activate(Name, Details, Message) -> gen_server:call(?MODULE, {activate_alarm, Name, Details, Message}). +-spec ensure_deactivated(binary() | atom()) -> ok. +ensure_deactivated(Name) -> + ensure_deactivated(Name, no_details). + +-spec ensure_deactivated(binary() | atom(), atom() | map()) -> ok. +ensure_deactivated(Name, Data) -> + ensure_deactivated(Name, Data, <<>>). + +-spec ensure_deactivated(binary() | atom(), atom() | map(), iodata()) -> ok. +ensure_deactivated(Name, Data, Message) -> + %% this duplicates the dirty read in handle_call, + %% intention is to avoid making gen_server calls when there is no alarm + case mnesia:dirty_read(?ACTIVATED_ALARM, Name) of + [] -> + ok; + _ -> + case deactivate(Name, Data, Message) of + {error, not_found} -> ok; + Other -> Other + end + end. + -spec deactivate(binary() | atom()) -> ok | {error, not_found}. deactivate(Name) -> deactivate(Name, no_details, <<"">>). @@ -121,17 +145,6 @@ deactivate(Name) -> deactivate(Name, Details) -> deactivate(Name, Details, <<"">>). -ensure_deactivated(Name, Details, Message) -> - case mnesia:dirty_read(?ACTIVATED_ALARM, Name) of - [] -> - ok; - _ -> - case deactivate(Name, Details, Message) of - {error, not_found} -> ok; - Other -> Other - end - end. - deactivate(Name, Details, Message) -> gen_server:call(?MODULE, {deactivate_alarm, Name, Details, Message}). diff --git a/apps/emqx/src/emqx_alarm_handler.erl b/apps/emqx/src/emqx_alarm_handler.erl index 66d2303d5..b5967a21d 100644 --- a/apps/emqx/src/emqx_alarm_handler.erl +++ b/apps/emqx/src/emqx_alarm_handler.erl @@ -69,7 +69,7 @@ handle_event({set_alarm, {process_memory_high_watermark, Pid}}, State) -> ), {ok, State}; handle_event({clear_alarm, process_memory_high_watermark}, State) -> - _ = emqx_alarm:deactivate(high_process_memory_usage), + emqx_alarm:ensure_deactivated(high_process_memory_usage), {ok, State}; handle_event({set_alarm, {?LC_ALARM_ID_RUNQ, Info}}, State) -> #{node := Node, runq_length := Len} = Info, @@ -77,7 +77,7 @@ handle_event({set_alarm, {?LC_ALARM_ID_RUNQ, Info}}, State) -> emqx_alarm:activate(runq_overload, Info, Message), {ok, State}; handle_event({clear_alarm, ?LC_ALARM_ID_RUNQ}, State) -> - _ = emqx_alarm:deactivate(runq_overload), + emqx_alarm:ensure_deactivated(runq_overload), {ok, State}; handle_event(_, State) -> {ok, State}. diff --git a/apps/emqx/src/emqx_congestion.erl b/apps/emqx/src/emqx_congestion.erl index f8448b106..1e25ab391 100644 --- a/apps/emqx/src/emqx_congestion.erl +++ b/apps/emqx/src/emqx_congestion.erl @@ -115,7 +115,7 @@ do_cancel_alarm_congestion(Socket, Transport, Channel, Reason) -> ok = remove_alarm_sent_at(Reason), AlarmDetails = tcp_congestion_alarm_details(Socket, Transport, Channel), Message = io_lib:format("connection congested: ~0p", [AlarmDetails]), - emqx_alarm:deactivate(?ALARM_CONN_CONGEST(Channel, Reason), AlarmDetails, Message), + emqx_alarm:ensure_deactivated(?ALARM_CONN_CONGEST(Channel, Reason), AlarmDetails, Message), ok. is_tcp_congested(Socket, Transport) -> diff --git a/apps/emqx/src/emqx_os_mon.erl b/apps/emqx/src/emqx_os_mon.erl index c0960abd6..5b3c019cf 100644 --- a/apps/emqx/src/emqx_os_mon.erl +++ b/apps/emqx/src/emqx_os_mon.erl @@ -174,9 +174,9 @@ start_cpu_check_timer() -> Interval = emqx:get_config([sysmon, os, cpu_check_interval]), case erlang:system_info(system_architecture) of "x86_64-pc-linux-musl" -> ok; - _ -> _ = emqx_misc:start_timer(Interval, cpu_check) - end, - ok. + _ -> start_timer(Interval, cpu_check) + end. + start_mem_check_timer() -> Interval = emqx:get_config([sysmon, os, mem_check_interval]), IsSupported = @@ -189,10 +189,13 @@ start_mem_check_timer() -> end, case is_integer(Interval) andalso IsSupported of true -> - _ = emqx_misc:start_timer(Interval, mem_check); + start_timer(Interval, mem_check); false -> ok - end, + end. + +start_timer(Interval, Msg) -> + _ = emqx_misc:start_timer(Interval, Msg), ok. update_mem_alarm_stauts(HWM) when HWM > 1.0 orelse HWM < 0.0 -> diff --git a/apps/emqx/src/emqx_sys_mon.erl b/apps/emqx/src/emqx_sys_mon.erl index 697ced06e..78da63057 100644 --- a/apps/emqx/src/emqx_sys_mon.erl +++ b/apps/emqx/src/emqx_sys_mon.erl @@ -195,7 +195,7 @@ handle_partition_event({partition, {occurred, Node}}) -> emqx_alarm:activate(partition, #{occurred => Node}, Message); handle_partition_event({partition, {healed, Node}}) -> Message = io_lib:format("Partition healed at node ~ts", [Node]), - emqx_alarm:deactivate(partition, no_details, Message). + emqx_alarm:ensure_deactivated(partition, no_details, Message). suppress(Key, SuccFun, State = #{events := Events}) -> case lists:member(Key, Events) of diff --git a/apps/emqx/src/emqx_vm_mon.erl b/apps/emqx/src/emqx_vm_mon.erl index c7484c741..299c20c28 100644 --- a/apps/emqx/src/emqx_vm_mon.erl +++ b/apps/emqx/src/emqx_vm_mon.erl @@ -77,7 +77,7 @@ handle_info({timeout, _Timer, check}, State) -> Percent when Percent < ProcLowWatermark -> Usage = io_lib:format("~p%", [Percent * 100]), Message = [Usage, " process usage"], - emqx_alarm:deactivate( + emqx_alarm:ensure_deactivated( too_many_processes, #{ usage => Usage, diff --git a/apps/emqx_resource/src/emqx_resource_health_check.erl b/apps/emqx_resource/src/emqx_resource_health_check.erl index 265592582..88f3c3bb9 100644 --- a/apps/emqx_resource/src/emqx_resource_health_check.erl +++ b/apps/emqx_resource/src/emqx_resource_health_check.erl @@ -77,7 +77,7 @@ health_check(Name) -> {Pid, begin_health_check} -> case emqx_resource:health_check(Name) of ok -> - emqx_alarm:deactivate(Name); + emqx_alarm:ensure_deactivated(Name); {error, _} -> emqx_alarm:activate( Name, diff --git a/lib-ee/emqx_license/src/emqx_license_checker.erl b/lib-ee/emqx_license/src/emqx_license_checker.erl index 473ca0965..5840d8917 100644 --- a/lib-ee/emqx_license/src/emqx_license_checker.erl +++ b/lib-ee/emqx_license/src/emqx_license_checker.erl @@ -197,7 +197,7 @@ expiry_early_alarm(License) -> Date = iolist_to_binary(io_lib:format("~B~2..0B~2..0B", [Y, M, D])), ?OK(emqx_alarm:activate(license_expiry, #{expiry_at => Date})); false -> - ?OK(emqx_alarm:deactivate(license_expiry)) + ?OK(emqx_alarm:ensure_deactivated(license_expiry)) end. print_warnings(Warnings) -> diff --git a/lib-ee/emqx_license/src/emqx_license_resources.erl b/lib-ee/emqx_license/src/emqx_license_resources.erl index 96300d60b..551601923 100644 --- a/lib-ee/emqx_license/src/emqx_license_resources.erl +++ b/lib-ee/emqx_license/src/emqx_license_resources.erl @@ -103,7 +103,7 @@ connection_quota_early_alarm({ok, #{max_connections := Max}}) when is_integer(Ma ]), ?OK(emqx_alarm:activate(license_quota, #{high_watermark => HighPercent}, Message)) end, - Count < Max * Low andalso ?OK(emqx_alarm:deactivate(license_quota)); + Count < Max * Low andalso ?OK(emqx_alarm:ensure_deactivated(license_quota)); connection_quota_early_alarm(_Limits) -> ok.