diff options
| author | Francesco Mazzoli <francesco@rabbitmq.com> | 2012-07-11 13:16:22 +0100 |
|---|---|---|
| committer | Francesco Mazzoli <francesco@rabbitmq.com> | 2012-07-11 13:16:22 +0100 |
| commit | b740677bf32ed4bb92d0373297723ec82cc24afd (patch) | |
| tree | 3a69bf8cf4e38141cc5fb0ac933dfe4c8a17679f /src | |
| parent | 95092ed26876699c42118d37fda5222fff137257 (diff) | |
| download | rabbitmq-server-git-b740677bf32ed4bb92d0373297723ec82cc24afd.tar.gz | |
let `rabbit_alarm' handle everything in place of `alarm_handler'
No logging on set/clear alarm yet, me and Simon agree that we should do
logging only on the events that rabbit knows it should be receiving
(right now the resource limits ones)
Diffstat (limited to 'src')
| -rw-r--r-- | src/file_handle_cache.erl | 4 | ||||
| -rw-r--r-- | src/rabbit_alarm.erl | 39 | ||||
| -rw-r--r-- | src/rabbit_disk_monitor.erl | 4 | ||||
| -rw-r--r-- | src/vm_memory_monitor.erl | 4 |
4 files changed, 32 insertions, 19 deletions
diff --git a/src/file_handle_cache.erl b/src/file_handle_cache.erl index f3b4dbafa2..2546d5c5d6 100644 --- a/src/file_handle_cache.erl +++ b/src/file_handle_cache.erl @@ -1028,8 +1028,8 @@ obtain_limit_reached(#fhc_state { obtain_limit = Limit, adjust_alarm(OldState, NewState) -> case {obtain_limit_reached(OldState), obtain_limit_reached(NewState)} of - {false, true} -> alarm_handler:set_alarm({file_descriptor_limit, []}); - {true, false} -> alarm_handler:clear_alarm(file_descriptor_limit); + {false, true} -> rabbit_alarm:set_alarm({file_descriptor_limit, []}); + {true, false} -> rabbit_alarm:clear_alarm(file_descriptor_limit); _ -> ok end, NewState. diff --git a/src/rabbit_alarm.erl b/src/rabbit_alarm.erl index d16d90a45d..1fb2056e74 100644 --- a/src/rabbit_alarm.erl +++ b/src/rabbit_alarm.erl @@ -18,19 +18,23 @@ -behaviour(gen_event). --export([start/0, stop/0, register/2, on_node_up/1, on_node_down/1]). +-export([start_link/0, start/0, stop/0, register/2, set_alarm/1, + clear_alarm/1, on_node_up/1, on_node_down/1]). -export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2, code_change/3]). -export([remote_conserve_resources/3]). %% Internal use only +-define(SERVER, ?MODULE). + -record(alarms, {alertees, alarmed_nodes}). %%---------------------------------------------------------------------------- -ifdef(use_specs). +-spec(start_link/0 :: () -> rabbit_types:ok_pid_or_error()). -spec(start/0 :: () -> 'ok'). -spec(stop/0 :: () -> 'ok'). -spec(register/2 :: (pid(), rabbit_types:mfargs()) -> boolean()). @@ -41,36 +45,43 @@ %%---------------------------------------------------------------------------- +start_link() -> + gen_event:start_link({local, ?SERVER}). + start() -> - ok = alarm_handler:add_alarm_handler(?MODULE, []), + ok = rabbit_sup:start_restartable_child(?MODULE), + ok = gen_event:add_handler(?SERVER, ?MODULE, []), {ok, MemoryWatermark} = application:get_env(vm_memory_high_watermark), rabbit_sup:start_restartable_child(vm_memory_monitor, [MemoryWatermark]), - {ok, DiskLimit} = application:get_env(disk_free_limit), rabbit_sup:start_restartable_child(rabbit_disk_monitor, [DiskLimit]), ok. stop() -> - ok = alarm_handler:delete_alarm_handler(?MODULE). + ok. register(Pid, HighMemMFA) -> - gen_event:call(alarm_handler, ?MODULE, - {register, Pid, HighMemMFA}, + gen_event:call(?SERVER, ?MODULE, {register, Pid, HighMemMFA}, infinity). -on_node_up(Node) -> gen_event:notify(alarm_handler, {node_up, Node}). +set_alarm(Alarm) -> + gen_event:notify(?SERVER, {set_alarm, Alarm}). -on_node_down(Node) -> gen_event:notify(alarm_handler, {node_down, Node}). +clear_alarm(Alarm) -> + gen_event:notify(?SERVER, {clear_alarm, Alarm}). + +on_node_up(Node) -> gen_event:notify(?SERVER, {node_up, Node}). + +on_node_down(Node) -> gen_event:notify(?SERVER, {node_down, Node}). -%% Can't use alarm_handler:{set,clear}_alarm because that doesn't -%% permit notifying a remote node. remote_conserve_resources(Pid, Source, true) -> - gen_event:notify({alarm_handler, node(Pid)}, + gen_event:notify({?SERVER, node(Pid)}, {set_alarm, {{resource_limit, Source, node()}, []}}); remote_conserve_resources(Pid, Source, false) -> - gen_event:notify({alarm_handler, node(Pid)}, + gen_event:notify({?SERVER, node(Pid)}, {clear_alarm, {resource_limit, Source, node()}}). + %%---------------------------------------------------------------------------- init([]) -> @@ -85,15 +96,17 @@ handle_call(_Request, State) -> {ok, not_understood, State}. handle_event({set_alarm, {{resource_limit, Source, Node}, []}}, State) -> + %% TODO: Do some logging {ok, maybe_alert(fun dict:append/3, Node, Source, State)}; handle_event({clear_alarm, {resource_limit, Source, Node}}, State) -> + %% TODO: Do some logging {ok, maybe_alert(fun dict_unappend/3, Node, Source, State)}; handle_event({node_up, Node}, State) -> %% Must do this via notify and not call to avoid possible deadlock. ok = gen_event:notify( - {alarm_handler, Node}, + {?SERVER, Node}, {register, self(), {?MODULE, remote_conserve_resources, []}}), {ok, State}; diff --git a/src/rabbit_disk_monitor.erl b/src/rabbit_disk_monitor.erl index 58375abb45..e72181c061 100644 --- a/src/rabbit_disk_monitor.erl +++ b/src/rabbit_disk_monitor.erl @@ -149,10 +149,10 @@ internal_update(State = #state { limit = Limit, case {Alarmed, NewAlarmed} of {false, true} -> emit_update_info("exceeded", CurrentFreeBytes, LimitBytes), - alarm_handler:set_alarm({{resource_limit, disk, node()}, []}); + rabbit_alarm:set_alarm({{resource_limit, disk, node()}, []}); {true, false} -> emit_update_info("below limit", CurrentFreeBytes, LimitBytes), - alarm_handler:clear_alarm({resource_limit, disk, node()}); + rabbit_alarm:clear_alarm({resource_limit, disk, node()}); _ -> ok end, diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl index fb184d1ab2..3f34c2e9e0 100644 --- a/src/vm_memory_monitor.erl +++ b/src/vm_memory_monitor.erl @@ -181,10 +181,10 @@ internal_update(State = #state { memory_limit = MemLimit, case {Alarmed, NewAlarmed} of {false, true} -> emit_update_info(set, MemUsed, MemLimit), - alarm_handler:set_alarm({{resource_limit, memory, node()}, []}); + rabbit_alarm:set_alarm({{resource_limit, memory, node()}, []}); {true, false} -> emit_update_info(clear, MemUsed, MemLimit), - alarm_handler:clear_alarm({resource_limit, memory, node()}); + rabbit_alarm:clear_alarm({resource_limit, memory, node()}); _ -> ok end, |
