diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2014-06-25 17:08:12 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2014-06-25 17:08:12 +0100 |
commit | 678f4713e7a725e02fa5f2727704809e8ab3e104 (patch) | |
tree | 1c1fd5d829d224eebd67c544ce2f1c4802b5f993 | |
parent | cabc2b8d44787f5a567d0b0c2b8027cbaafd27c0 (diff) | |
download | rabbitmq-server-678f4713e7a725e02fa5f2727704809e8ab3e104.tar.gz |
Hard-kill all connections and stop all listeners as soon as we decide we are in a minority. Also remve an export from rabbit_networking that was unused (probably dated from era of unsupervised plugins).
-rw-r--r-- | src/rabbit_networking.erl | 31 | ||||
-rw-r--r-- | src/rabbit_node_monitor.erl | 1 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl index 9082dbd3..0791bbe2 100644 --- a/src/rabbit_networking.erl +++ b/src/rabbit_networking.erl @@ -16,8 +16,8 @@ -module(rabbit_networking). --export([boot/0, start/0, start_tcp_listener/1, start_ssl_listener/2, - stop_tcp_listener/1, on_node_down/1, active_listeners/0, +-export([boot/0, start/0, killall/0, start_tcp_listener/1, start_ssl_listener/2, + on_node_down/1, active_listeners/0, node_listeners/1, register_connection/1, unregister_connection/1, connections/0, connection_info_keys/0, connection_info/1, connection_info/2, @@ -60,10 +60,10 @@ -type(label() :: string()). -spec(start/0 :: () -> 'ok'). +-spec(killall/0 :: () -> 'ok'). -spec(start_tcp_listener/1 :: (listener_config()) -> 'ok'). -spec(start_ssl_listener/2 :: (listener_config(), rabbit_types:infos()) -> 'ok'). --spec(stop_tcp_listener/1 :: (listener_config()) -> 'ok'). -spec(active_listeners/0 :: () -> [rabbit_types:listener()]). -spec(node_listeners/1 :: (node()) -> [rabbit_types:listener()]). -spec(register_connection/1 :: (pid()) -> ok). @@ -145,6 +145,25 @@ start() -> rabbit_sup:start_supervisor_child( [{local, rabbit_tcp_client_sup}, {rabbit_connection_sup,start_link,[]}]). +%% We are going to stop for pause-minority, so we are already +%% compromised; anything we confirm from now on is not going to be +%% remembered after we come back. Since rabbit:stop/0 may take a while +%% to gracefully shut down, we should stop talking to the outside +%% world *immediately*. +killall() -> + %% Stop ASAP + kill_connections(), + {ok, TCPListeners} = application:get_env(rabbit, tcp_listeners), + {ok, SSLListeners} = application:get_env(rabbit, ssl_listeners), + [stop_listener(L) || L <- TCPListeners ++ SSLListeners], + %% In case anything reconnected while we were stopping listeners + kill_connections(), + ok. + +kill_connections() -> + Conns = connections_local() ++ rabbit_direct:list_local(), + [exit(P, kill) || P <- Conns]. + ensure_ssl() -> {ok, SslAppsConfig} = application:get_env(rabbit, ssl_apps), ok = app_utils:start_applications(SslAppsConfig), @@ -245,12 +264,12 @@ start_listener0(Address, Protocol, Label, OnConnect) -> {rabbit_misc:ntoa(IPAddress), Port}}) end. -stop_tcp_listener(Listener) -> - [stop_tcp_listener0(Address) || +stop_listener(Listener) -> + [stop_listener0(Address) || Address <- tcp_listener_addresses(Listener)], ok. -stop_tcp_listener0({IPAddress, Port, _Family}) -> +stop_listener0({IPAddress, Port, _Family}) -> Name = rabbit_misc:tcp_name(rabbit_tcp_listener_sup, IPAddress, Port), ok = supervisor:terminate_child(rabbit_sup, Name), ok = supervisor:delete_child(rabbit_sup, Name). diff --git a/src/rabbit_node_monitor.erl b/src/rabbit_node_monitor.erl index 14961478..88c7cc2c 100644 --- a/src/rabbit_node_monitor.erl +++ b/src/rabbit_node_monitor.erl @@ -363,6 +363,7 @@ await_cluster_recovery() -> []), Nodes = rabbit_mnesia:cluster_nodes(all), run_outside_applications(fun () -> + rabbit_networking:killall(), rabbit:stop(), wait_for_cluster_recovery(Nodes) end), |