summaryrefslogtreecommitdiff
path: root/src/gm.erl
diff options
context:
space:
mode:
authorJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2016-11-24 12:00:42 +0100
committerJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2016-11-24 12:00:42 +0100
commitbfd14dd7ff1a7eb28c00a44d5d52887f42cd603d (patch)
treec3aa531499314917188806a073ef2fde590f4c1e /src/gm.erl
parent1bd0fa11a08e311718d0c0162ab38aa646068790 (diff)
parentbeb8e52c3648c06340c4c1d6b573a2570d4ee0dd (diff)
downloadrabbitmq-server-git-bfd14dd7ff1a7eb28c00a44d5d52887f42cd603d.tar.gz
Merge branch 'stable' into rabbitmq-management-236
Diffstat (limited to 'src/gm.erl')
-rw-r--r--src/gm.erl19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/gm.erl b/src/gm.erl
index 74e19ee6fd..41aa01f04d 100644
--- a/src/gm.erl
+++ b/src/gm.erl
@@ -1175,11 +1175,20 @@ record_new_member_in_group(NewMember, Left, GroupName, TxnFun) ->
try
Group = #gm_group { members = Members, version = Ver } =
check_membership(Left, read_group(GroupName)),
- {Prefix, [Left | Suffix]} =
- lists:splitwith(fun (M) -> M =/= Left end, Members),
- write_group(Group #gm_group {
- members = Prefix ++ [Left, NewMember | Suffix],
- version = Ver + 1 })
+ case lists:member(NewMember, Members) of
+ true ->
+ %% This avois duplicates during partial partitions,
+ %% as inconsistent views might happen during them
+ rabbit_log:warning("(~p) GM avoiding duplicate of ~p",
+ [self(), NewMember]),
+ Group;
+ false ->
+ {Prefix, [Left | Suffix]} =
+ lists:splitwith(fun (M) -> M =/= Left end, Members),
+ write_group(Group #gm_group {
+ members = Prefix ++ [Left, NewMember | Suffix],
+ version = Ver + 1 })
+ end
catch
lost_membership ->
%% The transaction must not be abruptly crashed, but