diff options
author | Alexandru Scvortov <alexandru@rabbitmq.com> | 2011-08-03 18:53:01 +0100 |
---|---|---|
committer | Alexandru Scvortov <alexandru@rabbitmq.com> | 2011-08-03 18:53:01 +0100 |
commit | 040044cf3ba5adfa3809e5196d67b711ba92680f (patch) | |
tree | e3d2907a87c7427826c7d280708db11b4a3efc6c | |
parent | 3383b7ccaa079ebeca4b7ab701abed7d7324ca6e (diff) | |
download | rabbitmq-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.erl | 32 |
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. |