summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2012-05-25 13:57:54 +0100
committerEmile Joubert <emile@rabbitmq.com>2012-05-25 13:57:54 +0100
commit60b718c4cdf67d6269693ad917a463f14c3320d3 (patch)
treeca84c8b0dfb34d1c20b867cb79b4eeeb7f89ed72
parentb4b604ac7f79fc1fe889f71ca8d62609a40e8be7 (diff)
downloadrabbitmq-server-git-60b718c4cdf67d6269693ad917a463f14c3320d3.tar.gz
Update own members_state as well when sending catchup
-rw-r--r--src/gm.erl33
1 files changed, 18 insertions, 15 deletions
diff --git a/src/gm.erl b/src/gm.erl
index 5b82a396ce..e894347e04 100644
--- a/src/gm.erl
+++ b/src/gm.erl
@@ -575,18 +575,21 @@ handle_call({add_on_right, NewMember}, _From,
members_state = MembersState,
module = Module,
callback_args = Args }) ->
- Group = record_new_member_in_group(
- GroupName, Self, NewMember,
- fun (Group1) ->
- View1 = group_to_view(Group1),
- ok = send_right(NewMember, View1,
- {catchup, Self,
- prepare_members_state(
- remove_erased_members(MembersState,
- View1))})
- end),
+ {MembersState1, Group} =
+ record_new_member_in_group(GroupName, Self, NewMember,
+ fun (Group1) ->
+ View1 = group_to_view(Group1),
+ MembersState1 = remove_erased_members(
+ MembersState, View1),
+ ok = send_right(NewMember, View1,
+ {catchup, Self,
+ prepare_members_state(
+ MembersState1)}),
+ MembersState1
+ end),
View2 = group_to_view(Group),
- State1 = check_neighbours(State #state { view = View2 }),
+ State1 = check_neighbours(State #state { view = View2,
+ members_state = MembersState1 }),
Result = callback_view_changed(Args, Module, View, View2),
handle_callback_result({Result, {ok, Group}, State1}).
@@ -1058,7 +1061,7 @@ record_dead_member_in_group(Member, GroupName) ->
Group.
record_new_member_in_group(GroupName, Left, NewMember, Fun) ->
- {atomic, Group} =
+ {atomic, {MembersState, Group}} =
mnesia:sync_transaction(
fun () ->
[#gm_group { members = Members, version = Ver } = Group1] =
@@ -1068,11 +1071,11 @@ record_new_member_in_group(GroupName, Left, NewMember, Fun) ->
Members1 = Prefix ++ [Left, NewMember | Suffix],
Group2 = Group1 #gm_group { members = Members1,
version = Ver + 1 },
- ok = Fun(Group2),
+ MembersState = Fun(Group2),
mnesia:write(Group2),
- Group2
+ {MembersState, Group2}
end),
- Group.
+ {MembersState, Group}.
erase_members_in_group(Members, GroupName) ->
DeadMembers = [{dead, Id} || Id <- Members],