summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@apache.org>2019-05-01 10:05:44 -0400
committerNick Vatamaniuc <nickva@users.noreply.github.com>2019-05-01 13:30:42 -0400
commit762d7a81416d07ab2f9a7f7091376376075578c0 (patch)
treee0d1060c35c5c2a57d90a1c712356da2fe08bcae
parent3714ff53ac7f82654dece7a977eafb95decce113 (diff)
downloadcouchdb-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.erl24
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)