summaryrefslogtreecommitdiff
path: root/src/gm.erl
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2012-05-23 17:40:47 +0100
committerEmile Joubert <emile@rabbitmq.com>2012-05-23 17:40:47 +0100
commitb4b604ac7f79fc1fe889f71ca8d62609a40e8be7 (patch)
treea11f8272bdbb5a231658eb93f79654d8133679e6 /src/gm.erl
parentf213e8a03792c4df233c4d3522812178caed2d2c (diff)
downloadrabbitmq-server-git-b4b604ac7f79fc1fe889f71ca8d62609a40e8be7.tar.gz
Remove erased memberstate when possible
Diffstat (limited to 'src/gm.erl')
-rw-r--r--src/gm.erl18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/gm.erl b/src/gm.erl
index 01300f18af..5b82a396ce 100644
--- a/src/gm.erl
+++ b/src/gm.erl
@@ -580,8 +580,10 @@ handle_call({add_on_right, NewMember}, _From,
fun (Group1) ->
View1 = group_to_view(Group1),
ok = send_right(NewMember, View1,
- {catchup, Self, prepare_members_state(
- MembersState)})
+ {catchup, Self,
+ prepare_members_state(
+ remove_erased_members(MembersState,
+ View1))})
end),
View2 = group_to_view(Group),
State1 = check_neighbours(State #state { view = View2 }),
@@ -591,6 +593,7 @@ handle_call({add_on_right, NewMember}, _From,
handle_cast({?TAG, ReqVer, Msg},
State = #state { view = View,
+ members_state = MembersState,
group_name = GroupName,
module = Module,
callback_args = Args }) ->
@@ -598,8 +601,11 @@ handle_cast({?TAG, ReqVer, Msg},
case needs_view_update(ReqVer, View) of
true ->
View1 = group_to_view(read_group(GroupName)),
+ MemberState1 = remove_erased_members(MembersState, View1),
{callback_view_changed(Args, Module, View, View1),
- check_neighbours(State #state { view = View1 })};
+ check_neighbours(
+ State #state { view = View1,
+ members_state = MemberState1 })};
false ->
{ok, State}
end,
@@ -1257,6 +1263,12 @@ make_member(GroupName) ->
{error, not_found} -> ?VERSION_START
end, self()}.
+remove_erased_members(MembersState, View) ->
+ lists:foldl(fun (Id, MembersState1) ->
+ store_member(Id, find_member_or_blank(Id, MembersState),
+ MembersState1)
+ end, blank_member_state(), all_known_members(View)).
+
get_pid({_Version, Pid}) -> Pid.
get_pids(Ids) -> [Pid || {_Version, Pid} <- Ids].