diff options
| author | Matthias Radestock <matthias@lshift.net> | 2008-11-13 15:47:12 +0000 |
|---|---|---|
| committer | Matthias Radestock <matthias@lshift.net> | 2008-11-13 15:47:12 +0000 |
| commit | 85eb53ca7ec4ca74585765c50117d1d9d710774c (patch) | |
| tree | 26228dfbb485397464d696cbab98d8e93ab066c6 | |
| parent | 01251d6d91d60f48c57048c0bb975460f4b48cf8 (diff) | |
| download | rabbitmq-server-git-85eb53ca7ec4ca74585765c50117d1d9d710774c.tar.gz | |
react to memory threshold breaches present at startup
| -rw-r--r-- | src/rabbit_alarm.erl | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/rabbit_alarm.erl b/src/rabbit_alarm.erl index d9c1c45042..c2d6aaffc1 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]), |
