summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomyouyou <yxszyn@163.com>2022-01-06 17:39:38 +0800
committerKarl Nilsson <kjnilsson@gmail.com>2022-01-07 10:06:16 +0000
commite5ccf267ffda0ac9e79abae89a073a456e72312e (patch)
tree75e5a9bcfe8352b45736e7e2056fa79abc75fa73
parent8e2edc76c288e04ae89fbd6996fd429be733b082 (diff)
downloadrabbitmq-server-git-e5ccf267ffda0ac9e79abae89a073a456e72312e.tar.gz
'rabbit_stream_coordinator:select_leader' runs with wrong comparison
The list consists of candidates which is a tuple {node, tail}, and the tail is made of {epoch, offset}. While the 'select_leader' think the tail is made of {offset, epoch}. Suppose there are two candidates: [{node1,{1,100}},{node2,{2,99}}] It selects node1 as the leader instead of node2 with larger epoch.
-rw-r--r--deps/rabbit/src/rabbit_stream_coordinator.erl4
1 files changed, 2 insertions, 2 deletions
diff --git a/deps/rabbit/src/rabbit_stream_coordinator.erl b/deps/rabbit/src/rabbit_stream_coordinator.erl
index f88822a54f..fd587e20cb 100644
--- a/deps/rabbit/src/rabbit_stream_coordinator.erl
+++ b/deps/rabbit/src/rabbit_stream_coordinator.erl
@@ -1528,9 +1528,9 @@ find_leader(Members) ->
end.
select_leader(Offsets) ->
- [{Node, _} | _] = lists:sort(fun({_, {Ao, E}}, {_, {Bo, E}}) ->
+ [{Node, _} | _] = lists:sort(fun({_, {E, Ao}}, {_, {E, Bo}}) ->
Ao >= Bo;
- ({_, {_, Ae}}, {_, {_, Be}}) ->
+ ({_, {Ae, _}}, {_, {Be, _}}) ->
Ae >= Be;
({_, empty}, _) ->
false;