Skip to content

Commit e0866b7

Browse files
Merge pull request #1011 from rabbitmq/rabbitmq-server-972
Avoid duplicates in members list during partial partition
2 parents 4791683 + 79b2ecb commit e0866b7

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

src/gm.erl

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,11 +1175,20 @@ record_new_member_in_group(NewMember, Left, GroupName, TxnFun) ->
11751175
try
11761176
Group = #gm_group { members = Members, version = Ver } =
11771177
check_membership(Left, read_group(GroupName)),
1178-
{Prefix, [Left | Suffix]} =
1179-
lists:splitwith(fun (M) -> M =/= Left end, Members),
1180-
write_group(Group #gm_group {
1181-
members = Prefix ++ [Left, NewMember | Suffix],
1182-
version = Ver + 1 })
1178+
case lists:member(NewMember, Members) of
1179+
true ->
1180+
%% This avois duplicates during partial partitions,
1181+
%% as inconsistent views might happen during them
1182+
rabbit_log:warning("(~p) GM avoiding duplicate of ~p",
1183+
[self(), NewMember]),
1184+
Group;
1185+
false ->
1186+
{Prefix, [Left | Suffix]} =
1187+
lists:splitwith(fun (M) -> M =/= Left end, Members),
1188+
write_group(Group #gm_group {
1189+
members = Prefix ++ [Left, NewMember | Suffix],
1190+
version = Ver + 1 })
1191+
end
11831192
catch
11841193
lost_membership ->
11851194
%% The transaction must not be abruptly crashed, but

0 commit comments

Comments
 (0)