summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandru Scvortov <alexandru@rabbitmq.com>2011-08-03 18:53:01 +0100
committerAlexandru Scvortov <alexandru@rabbitmq.com>2011-08-03 18:53:01 +0100
commit040044cf3ba5adfa3809e5196d67b711ba92680f (patch)
treee3d2907a87c7427826c7d280708db11b4a3efc6c
parent3383b7ccaa079ebeca4b7ab701abed7d7324ca6e (diff)
downloadrabbitmq-server-040044cf3ba5adfa3809e5196d67b711ba92680f.tar.gz
keep track of which nodes are up and don't cleanup after the same node twice
-rw-r--r--src/rabbit_node_monitor.erl32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/rabbit_node_monitor.erl b/src/rabbit_node_monitor.erl
index 1f30a2fc..9583cc6b 100644
--- a/src/rabbit_node_monitor.erl
+++ b/src/rabbit_node_monitor.erl
@@ -27,6 +27,8 @@
-define(SERVER, ?MODULE).
-define(RABBIT_UP_RPC_TIMEOUT, 2000).
+-record(state, {rabbits}).
+
%%----------------------------------------------------------------------------
-ifdef(use_specs).
@@ -61,27 +63,28 @@ notify_cluster() ->
init([]) ->
ok = net_kernel:monitor_nodes(true),
- {ok, no_state}.
+ {ok, #state{rabbits = sets:new()}}.
handle_call(_Request, _From, State) ->
{noreply, State}.
-handle_cast({rabbit_running_on, Node}, State) ->
- rabbit_log:info("node ~p up~n", [Node]),
+handle_cast({rabbit_running_on, Node}, State = #state{rabbits = Rabbits}) ->
+ rabbit_log:info("rabbit on ~p up~n", [Node]),
erlang:monitor(process, {rabbit, Node}),
ok = rabbit_alarm:on_node_up(Node),
- {noreply, State};
+ {noreply, State#state{rabbits = sets:add_element(Node, Rabbits)}};
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info({nodedown, Node}, State) ->
rabbit_log:info("node ~p down~n", [Node]),
- ok = handle_dead_rabbit(Node),
- {noreply, State};
+ {noreply, handle_dead_rabbit(Node, State)};
+handle_info({nodeup, Node}, State = #state{rabbits = Nodes}) ->
+ rabbit_log:info("node ~p up~n", [Node]),
+ {noreply, State#state{rabbits = sets:add_element(Node, Nodes)}};
handle_info({'DOWN', _MRef, process, {rabbit, Node}, _Reason}, State) ->
rabbit_log:info("node ~p lost 'rabbit'~n", [Node]),
- ok = handle_dead_rabbit(Node),
- {noreply, State};
+ {noreply, handle_dead_rabbit(Node, State)};
handle_info(_Info, State) ->
{noreply, State}.
@@ -96,7 +99,12 @@ code_change(_OldVsn, State, _Extra) ->
%% TODO: This may turn out to be a performance hog when there are lots
%% of nodes. We really only need to execute some of these statements
%% on *one* node, rather than all of them.
-handle_dead_rabbit(Node) ->
- ok = rabbit_networking:on_node_down(Node),
- ok = rabbit_amqqueue:on_node_down(Node),
- ok = rabbit_alarm:on_node_down(Node).
+handle_dead_rabbit(Node, State = #state{rabbits = Rabbits}) ->
+ case sets:is_element(Node, Rabbits) of
+ true -> rabbit_log:info("handling dead rabbit ~p~n", [Node]),
+ ok = rabbit_networking:on_node_down(Node),
+ ok = rabbit_amqqueue:on_node_down(Node),
+ ok = rabbit_alarm:on_node_down(Node),
+ State#state{rabbits = sets:del_element(Node, Rabbits)};
+ false -> State
+ end.