summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2008-11-13 15:47:12 +0000
committerMatthias Radestock <matthias@lshift.net>2008-11-13 15:47:12 +0000
commitd53b45af39bddb0f1f7c55dc0e39b1e15262552b (patch)
tree26228dfbb485397464d696cbab98d8e93ab066c6
parentcc01059ec52429c321dc3a6652820959743b28ef (diff)
downloadrabbitmq-server-bug19790.tar.gz
react to memory threshold breaches present at startupbug19790
-rw-r--r--src/rabbit_alarm.erl19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/rabbit_alarm.erl b/src/rabbit_alarm.erl
index d9c1c450..c2d6aaff 100644
--- a/src/rabbit_alarm.erl
+++ b/src/rabbit_alarm.erl
@@ -77,7 +77,9 @@ register(Pid, HighMemMFA) ->
%%----------------------------------------------------------------------------
init([]) ->
- {ok, #alarms{alertees = dict:new()}}.
+ HWM = system_memory_high_watermark(),
+ {ok, #alarms{alertees = dict:new(),
+ system_memory_high_watermark = HWM}}.
handle_call({register, Pid, HighMemMFA},
State = #alarms{alertees = Alertess}) ->
@@ -118,7 +120,20 @@ code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%----------------------------------------------------------------------------
-
+
+system_memory_high_watermark() ->
+ %% When we register our alarm_handler, the
+ %% system_memory_high_watermark alarm may already have gone
+ %% off. How do we find out about that? Calling
+ %% alarm_handler:get_alarms() would deadlock. So instead we ask
+ %% memsup. Unfortunately that doesn't expose a suitable API, so we
+ %% have to reach quite deeply into its internals.
+ {dictionary, D} = process_info(whereis(memsup), dictionary),
+ case lists:keysearch(system_memory_high_watermark, 1, D) of
+ {value, {_, set}} -> true;
+ _Other -> false
+ end.
+
alert(Alert, Alertees) ->
dict:fold(fun (Pid, {M, F, A}, Acc) ->
ok = erlang:apply(M, F, A ++ [Pid, Alert]),