diff options
author | Nick Vatamaniuc <vatamane@apache.org> | 2019-05-01 10:05:44 -0400 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2019-05-01 13:30:42 -0400 |
commit | 762d7a81416d07ab2f9a7f7091376376075578c0 (patch) | |
tree | e0d1060c35c5c2a57d90a1c712356da2fe08bcae | |
parent | 3714ff53ac7f82654dece7a977eafb95decce113 (diff) | |
download | couchdb-762d7a81416d07ab2f9a7f7091376376075578c0.tar.gz |
Use individual rexi kill messages by default
When performing a rolling upgrade older nodes won't be able to handle newer
kill_all messages. In busy clusters this could cause couch_server and other
message queue backups while the upgrade is in progress.
Make message sending behavior is configurable. After all the nodes have been
upgraded, can toggle `[rexi] use_kill_all = true` to save on some inter-node
network traffic. In a future release the configuration check might be removed,
default to sending kill_all messages only.
-rw-r--r-- | src/rexi/src/rexi.erl | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/rexi/src/rexi.erl b/src/rexi/src/rexi.erl index 21e2b5388..ead5bee0c 100644 --- a/src/rexi/src/rexi.erl +++ b/src/rexi/src/rexi.erl @@ -80,12 +80,24 @@ kill(Node, Ref) -> %% No rexi_EXIT message will be sent. -spec kill_all([{node(), reference()}]) -> ok. kill_all(NodeRefs) when is_list(NodeRefs) -> - PerNodeMap = lists:foldl(fun({Node, Ref}, Acc) -> - maps:update_with(Node, fun(Refs) -> [Ref | Refs] end, [Ref], Acc) - end, #{}, NodeRefs), - maps:map(fun(Node, Refs) -> - rexi_utils:send(rexi_utils:server_pid(Node), cast_msg({kill_all, Refs})) - end, PerNodeMap), + %% Upgrade clause. Since kill_all is a new message, nodes in a mixed + %% cluster won't know how to process it. In that case, the default is to send + %% the individual kill messages. Once all the nodes have been upgraded, can + %% configure the cluster to send kill_all messages. + case config:get_boolean("rexi", "use_kill_all", false) of + true -> + PerNodeMap = lists:foldl(fun({Node, Ref}, Acc) -> + maps:update_with(Node, fun(Refs) -> + [Ref | Refs] + end, [Ref], Acc) + end, #{}, NodeRefs), + maps:map(fun(Node, Refs) -> + ServerPid = rexi_utils:server_pid(Node), + rexi_utils:send(ServerPid, cast_msg({kill_all, Refs})) + end, PerNodeMap); + false -> + lists:foreach(fun({Node, Ref}) -> kill(Node, Ref) end, NodeRefs) + end, ok. %% @equiv async_server_call(Server, self(), Request) |