summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Mazzoli <francesco@rabbitmq.com>2012-07-11 13:16:22 +0100
committerFrancesco Mazzoli <francesco@rabbitmq.com>2012-07-11 13:16:22 +0100
commitb740677bf32ed4bb92d0373297723ec82cc24afd (patch)
tree3a69bf8cf4e38141cc5fb0ac933dfe4c8a17679f
parent95092ed26876699c42118d37fda5222fff137257 (diff)
downloadrabbitmq-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)
-rw-r--r--Makefile4
-rw-r--r--src/file_handle_cache.erl4
-rw-r--r--src/rabbit_alarm.erl39
-rw-r--r--src/rabbit_disk_monitor.erl4
-rw-r--r--src/vm_memory_monitor.erl4
5 files changed, 34 insertions, 21 deletions
diff --git a/Makefile b/Makefile
index 0e3960dcfa..3681a7878d 100644
--- a/Makefile
+++ b/Makefile
@@ -217,11 +217,11 @@ stop-rabbit-on-node: all
echo "rabbit:stop()." | $(ERL_CALL)
set-resource-alarm: all
- echo "alarm_handler:set_alarm({{resource_limit, $(SOURCE), node()}, []})." | \
+ echo "rabbit_alarm:set_alarm({{resource_limit, $(SOURCE), node()}, []})." | \
$(ERL_CALL)
clear-resource-alarm: all
- echo "alarm_handler:clear_alarm({resource_limit, $(SOURCE), node()})." | \
+ echo "rabbit_alarm:clear_alarm({resource_limit, $(SOURCE), node()})." | \
$(ERL_CALL)
stop-node:
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,