diff options
| author | Simon MacMullen <simon@lshift.net> | 2008-11-25 16:36:08 +0000 |
|---|---|---|
| committer | Simon MacMullen <simon@lshift.net> | 2008-11-25 16:36:08 +0000 |
| commit | 3701bc0c4a5c2a5fb30e709da89c39ac97ede2a6 (patch) | |
| tree | 3a4c064935880ff006d66c4bbdf4e3408fcfb865 /src | |
| parent | b29f01db686f64f0e17b808c658a42312b92fb29 (diff) | |
| parent | 86c9f9247b03cb680b3cb3859efd4dff05fdcb0a (diff) | |
| download | rabbitmq-server-git-3701bc0c4a5c2a5fb30e709da89c39ac97ede2a6.tar.gz | |
Make comments a bit clearer
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_alarm.erl | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/rabbit_alarm.erl b/src/rabbit_alarm.erl index e2f468b7fe..bb2e386680 100644 --- a/src/rabbit_alarm.erl +++ b/src/rabbit_alarm.erl @@ -61,6 +61,13 @@ start() -> rabbit:start_child(rabbit_linux_memory), ok; _ -> + %% Start memsup programmatically rather than via the rabbitmq-server + %% script. This is not quite the right thing to do as os_mon checks + %% to see if memsup is available before starting it, but as memsup + %% is available everywhere (even on VXWorks) it should be ok. + supervisor:start_child(os_mon_sup, {memsup, {memsup, start_link, []}, + permanent, 2000, worker, [memsup]}), + %% The default memsup check interval is 1 minute, which is way too %% long - rabbit can gobble up all memory in a matter of %% seconds. Unfortunately the memory_check_interval configuration @@ -73,13 +80,6 @@ start() -> %% check has completed, i.e. after one minute. So if rabbit eats %% all the memory within the first minute after startup then we %% are out of luck. - - %% Start memsup programmatically rather than via the rabbitmq-server - %% script. This is not quite the right thing to do as os_mon checks - %% to see if memsup is available before starting it, but as memsup - %% is available everywhere (even on VXWorks) it should be ok. - supervisor:start_child(os_mon_sup, {memsup, {memsup, start_link, []}, - permanent, 2000, worker, [memsup]}), ok = os_mon:call(memsup, {set_check_interval, ?MEMSUP_CHECK_INTERVAL}, infinity) end. @@ -94,7 +94,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}) -> @@ -135,7 +137,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]), |
