diff options
| author | Emile Joubert <emile@rabbitmq.com> | 2012-05-23 17:40:47 +0100 |
|---|---|---|
| committer | Emile Joubert <emile@rabbitmq.com> | 2012-05-23 17:40:47 +0100 |
| commit | b4b604ac7f79fc1fe889f71ca8d62609a40e8be7 (patch) | |
| tree | a11f8272bdbb5a231658eb93f79654d8133679e6 /src | |
| parent | f213e8a03792c4df233c4d3522812178caed2d2c (diff) | |
| download | rabbitmq-server-git-b4b604ac7f79fc1fe889f71ca8d62609a40e8be7.tar.gz | |
Remove erased memberstate when possible
Diffstat (limited to 'src')
| -rw-r--r-- | src/gm.erl | 18 |
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]. |
