summaryrefslogtreecommitdiff
path: root/src/rabbit_alarm.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rabbit_alarm.erl')
-rw-r--r--src/rabbit_alarm.erl23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/rabbit_alarm.erl b/src/rabbit_alarm.erl
index 534409aa..55c98ad5 100644
--- a/src/rabbit_alarm.erl
+++ b/src/rabbit_alarm.erl
@@ -38,7 +38,7 @@
-export([init/1, handle_call/2, handle_event/2, handle_info/2,
terminate/2, code_change/3]).
--record(alarms, {alertees, vm_memory_high_watermark = false}).
+-record(alarms, {alertees, vm_memory_high_watermark = false, flap_state}).
%%----------------------------------------------------------------------------
@@ -75,7 +75,8 @@ register(Pid, HighMemMFA) ->
%%----------------------------------------------------------------------------
init([]) ->
- {ok, #alarms{alertees = dict:new()}}.
+ {ok, #alarms{alertees = dict:new(),
+ flap_state = rabbit_alarm_flap_limiter:init()}}.
handle_call({register, Pid, {M, F, A} = HighMemMFA},
State = #alarms{alertees = Alertess}) ->
@@ -91,12 +92,22 @@ handle_call(_Request, State) ->
{ok, not_understood, State}.
handle_event({set_alarm, {vm_memory_high_watermark, []}}, State) ->
- ok = alert(true, State#alarms.alertees),
- {ok, State#alarms{vm_memory_high_watermark = true}};
+ {Res, FState} = rabbit_alarm_flap_limiter:set(State#alarms.flap_state),
+ State1 = State#alarms{flap_state = FState},
+ {ok, case Res of
+ true -> ok = alert(true, State#alarms.alertees),
+ State1#alarms{vm_memory_high_watermark = true};
+ false -> State1
+ end};
handle_event({clear_alarm, vm_memory_high_watermark}, State) ->
- ok = alert(false, State#alarms.alertees),
- {ok, State#alarms{vm_memory_high_watermark = false}};
+ {Res, FState} = rabbit_alarm_flap_limiter:clear(State#alarms.flap_state),
+ State1 = State#alarms{flap_state = FState},
+ {ok, case Res of
+ true -> ok = alert(false, State#alarms.alertees),
+ State1#alarms{vm_memory_high_watermark = false};
+ false -> State1
+ end};
handle_event(_Event, State) ->
{ok, State}.