diff options
| author | Michael Klishin <michael@clojurewerkz.org> | 2020-05-19 11:24:13 +0300 |
|---|---|---|
| committer | Michael Klishin <michael@clojurewerkz.org> | 2020-07-14 03:50:29 +0300 |
| commit | c57b82a705dd38cfbf889f649807348e58140700 (patch) | |
| tree | f2fee8028175f32dc5fcfd88daa5ee72fe7dfcf9 | |
| parent | 244bc0a438969e306768c959b508b14732cfe144 (diff) | |
| download | rabbitmq-server-git-c57b82a705dd38cfbf889f649807348e58140700.tar.gz | |
rabbit_maintenance: simplify return values of listener suspension functions
| -rw-r--r-- | src/rabbit_maintenance.erl | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/rabbit_maintenance.erl b/src/rabbit_maintenance.erl index 023985b7b0..5d9f497d63 100644 --- a/src/rabbit_maintenance.erl +++ b/src/rabbit_maintenance.erl @@ -35,7 +35,7 @@ mark_as_drained() -> unmark_as_drained() -> ok. --spec suspend_all_client_listeners() -> [rabbit_types:ok_or_error(any())]. +-spec suspend_all_client_listeners() -> rabbit_types:ok_or_error(any()). %% Pauses all listeners on the current node except for %% Erlang distribution (clustering and CLI tools). @@ -43,28 +43,39 @@ unmark_as_drained() -> %% but previously established connections won't be interrupted. suspend_all_client_listeners() -> Listeners = rabbit_networking:node_client_listeners(node()), - lists:foldl(fun (#listener{node = Node, ip_address = Addr, port = Port}, Acc) when Node =:= node() -> - Result = ranch:suspend_listener(rabbit_networking:ranch_ref(Addr, Port)), - [Result | Acc]; - (_, Acc) -> - Acc - end, - [], Listeners). + rabbit_log:info("Asked to suspend ~b client connection listeners. " + "No new client connections will be accepted until these listeners are resumed!", [length(Listeners)]), + Results = lists:foldl(local_listener_fold_fun(fun ranch:suspend_listener/1), [], Listeners), + lists:foldl(fun ok_or_first_error/2, ok, Results). - -spec resume_all_client_listeners() -> [rabbit_types:ok_or_error(any())]. + -spec resume_all_client_listeners() -> rabbit_types:ok_or_error(any()). %% Resumes all listeners on the current node except for %% Erlang distribution (clustering and CLI tools). %% A resumed listener will accept new client connections. resume_all_client_listeners() -> Listeners = rabbit_networking:node_client_listeners(node()), - lists:foldl(fun (#listener{node = Node, ip_address = Addr, port = Port}, Acc) when Node =:= node() -> - Result = ranch:resume_listener(rabbit_networking:ranch_ref(Addr, Port)), - [Result | Acc]; - (_, Acc) -> - Acc - end, - [], Listeners). + rabbit_log:info("Asked to resume ~b client connection listeners. " + "New client connections will be accepted from now on", [length(Listeners)]), + Results = lists:foldl(local_listener_fold_fun(fun ranch:resume_listener/1), [], Listeners), + lists:foldl(fun ok_or_first_error/2, ok, Results). close_all_client_connections() -> ok. + +%% +%% Implementation +%% + +local_listener_fold_fun(Fun) -> + fun(#listener{node = Node, ip_address = Addr, port = Port}, Acc) when Node =:= node() -> + RanchRef = rabbit_networking:ranch_ref(Addr, Port), + [Fun(RanchRef) | Acc]; + (_, Acc) -> + Acc + end. + +ok_or_first_error(ok, Acc) -> + Acc; +ok_or_first_error({error, _} = Err, _Acc) -> + Err. |
