summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2012-05-25 11:51:45 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2012-05-25 11:51:45 +0100
commit1961b8041f67fe1b34868d7dd0e130cf3caa8179 (patch)
tree75731ef95776c5cbaeb72c8215d693e83fcf5144 /src
parentbf96c3de075dac375b8b39c4affbf28f2bc5c56a (diff)
parentd953858c4cfdcbbfb8ae2707d9e0d1e8c243b567 (diff)
downloadrabbitmq-server-git-1961b8041f67fe1b34868d7dd0e130cf3caa8179.tar.gz
Merging bug 24954 into default
Diffstat (limited to 'src')
-rw-r--r--src/gm.erl34
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),