diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2014-04-21 14:37:33 +0100 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2014-04-21 14:37:33 +0100 |
commit | 5e5341568bbac19cd16c5945b0c1b16303cb2c8e (patch) | |
tree | 293e0a64a7c6d155ac5883db18114a9a1e7ac3b3 | |
parent | b7733c51eaa10f9858142ccb71e38f10a93eb825 (diff) | |
download | rabbitmq-server-5e5341568bbac19cd16c5945b0c1b16303cb2c8e.tar.gz |
refactor: extract gm view change handling
-rw-r--r-- | src/gm.erl | 47 |
1 files changed, 18 insertions, 29 deletions
@@ -605,36 +605,27 @@ handle_call({add_on_right, _NewMember}, _From, handle_call({add_on_right, NewMember}, _From, State = #state { self = Self, group_name = GroupName, - view = View, members_state = MembersState, - module = Module, - callback_args = Args, txn_executor = TxnFun }) -> Group = record_new_member_in_group(NewMember, Self, GroupName, TxnFun), View1 = group_to_view(Group), MembersState1 = remove_erased_members(MembersState, View1), ok = send_right(NewMember, View1, {catchup, Self, prepare_members_state(MembersState1)}), - handle_callback_result( - {callback_view_changed(Args, Module, View, View1), - {ok, Group}, - check_neighbours(State #state { view = View1, - members_state = MembersState1 })}). + {Result, State1} = change_view(View1, State #state { + members_state = MembersState1 }), + handle_callback_result({Result, {ok, Group}, State1}). handle_cast({?TAG, ReqVer, Msg}, State = #state { view = View, members_state = MembersState, - group_name = GroupName, - module = Module, - callback_args = Args }) -> + group_name = GroupName }) -> {Result, State1} = case needs_view_update(ReqVer, View) of true -> View1 = group_to_view(dirty_read_group(GroupName)), MemberState1 = remove_erased_members(MembersState, View1), - {callback_view_changed(Args, Module, View, View1), - check_neighbours( - State #state { view = View1, - members_state = MemberState1 })}; + change_view(View1, State #state { + members_state = MemberState1 }); false -> {ok, State} end, handle_callback_result( @@ -1148,10 +1139,7 @@ erase_members_in_group(Members, GroupName, TxnFun) -> maybe_erase_aliases(State = #state { self = Self, group_name = GroupName, - view = View0, members_state = MembersState, - module = Module, - callback_args = Args, txn_executor = TxnFun }, View) -> #view_member { aliases = Aliases } = fetch_view_member(Self, View), {Erasable, MembersState1} @@ -1170,9 +1158,7 @@ maybe_erase_aliases(State = #state { self = Self, _ -> group_to_view( erase_members_in_group(Erasable, GroupName, TxnFun)) end, - State1 = State #state { members_state = MembersState1, view = View1 }, - {callback_view_changed(Args, Module, View0, View1), - check_neighbours(State1)}. + change_view(View1, State #state { members_state = MembersState1 }). can_erase_view_member(Self, Self, _LA, _LP) -> false; can_erase_view_member(_Self, _Id, N, N) -> true; @@ -1370,16 +1356,19 @@ callback(Args, Module, Activity) -> {stop, _Reason} = Error -> Error end. -callback_view_changed(Args, Module, OldView, NewView) -> - OldMembers = all_known_members(OldView), - NewMembers = all_known_members(NewView), +change_view(View, State = #state { view = View0, + module = Module, + callback_args = Args }) -> + OldMembers = all_known_members(View0), + NewMembers = all_known_members(View), Births = NewMembers -- OldMembers, Deaths = OldMembers -- NewMembers, - case {Births, Deaths} of - {[], []} -> ok; - _ -> Module:members_changed( - Args, get_pids(Births), get_pids(Deaths)) - end. + Result = case {Births, Deaths} of + {[], []} -> ok; + _ -> Module:members_changed( + Args, get_pids(Births), get_pids(Deaths)) + end, + {Result, check_neighbours(State #state { view = View })}. handle_callback_result({Result, State}) -> if_callback_success( |