diff options
| author | Matthew Sackman <matthew@rabbitmq.com> | 2012-05-25 11:51:45 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@rabbitmq.com> | 2012-05-25 11:51:45 +0100 |
| commit | 1961b8041f67fe1b34868d7dd0e130cf3caa8179 (patch) | |
| tree | 75731ef95776c5cbaeb72c8215d693e83fcf5144 /src | |
| parent | bf96c3de075dac375b8b39c4affbf28f2bc5c56a (diff) | |
| parent | d953858c4cfdcbbfb8ae2707d9e0d1e8c243b567 (diff) | |
| download | rabbitmq-server-git-1961b8041f67fe1b34868d7dd0e130cf3caa8179.tar.gz | |
Merging bug 24954 into default
Diffstat (limited to 'src')
| -rw-r--r-- | src/gm.erl | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/gm.erl b/src/gm.erl index fc13528029..ff7a251208 100644 --- a/src/gm.erl +++ b/src/gm.erl @@ -1295,16 +1295,30 @@ send_right(Right, View, Msg) -> ok = gen_server2:cast(get_pid(Right), {?TAG, view_version(View), Msg}). callback(Args, Module, Activity) -> - lists:foldl( - fun ({Id, Pubs, _Acks}, ok) -> - lists:foldl(fun ({_PubNum, Pub}, ok) -> - Module:handle_msg(Args, get_pid(Id), Pub); - (_, Error) -> - Error - end, ok, Pubs); - (_, Error) -> - Error - end, ok, Activity). + Result = + lists:foldl( + fun ({Id, Pubs, _Acks}, {Args1, Module1, ok}) -> + lists:foldl(fun ({_PubNum, Pub}, Acc = {Args2, Module2, ok}) -> + case Module2:handle_msg( + Args2, get_pid(Id), Pub) of + ok -> + Acc; + {become, Module3, Args3} -> + {Args3, Module3, ok}; + {stop, _Reason} = Error -> + Error + end; + (_, Error = {stop, _Reason}) -> + Error + end, {Args1, Module1, ok}, Pubs); + (_, Error = {stop, _Reason}) -> + Error + end, {Args, Module, ok}, Activity), + case Result of + {Args, Module, ok} -> ok; + {Args1, Module1, ok} -> {become, Module1, Args1}; + {stop, _Reason} = Error -> Error + end. callback_view_changed(Args, Module, OldView, NewView) -> OldMembers = all_known_members(OldView), |
