From 1733d0655c88c4075f460f3e346ed4958005a8f5 Mon Sep 17 00:00:00 2001 From: "Andrew J. Stone" Date: Wed, 18 Dec 2013 01:24:17 -0500 Subject: [PATCH] 2.0 view change bugfix commit a view change using quorums not including the new view --- src/riak_ensemble_peer.erl | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/riak_ensemble_peer.erl b/src/riak_ensemble_peer.erl index 4109a1a..acf52ae 100644 --- a/src/riak_ensemble_peer.erl +++ b/src/riak_ensemble_peer.erl @@ -437,7 +437,7 @@ leading({update_members, Changes}, _From, State=#state{fact=Fact, ViewSeq = {Fact#fact.epoch, Fact#fact.seq}, NewFact = Fact#fact{views=Views2, view_seq=ViewSeq}, pause_workers(State), - case try_commit(NewFact, State) of + case try_commit_new_view(NewFact, State) of {ok, State3} -> unpause_workers(State), {reply, ok, leading, State3}; @@ -513,6 +513,20 @@ transition(State=#state{id=Id, fact=Fact}) -> Failed end. +-spec try_commit_new_view(fact(), state()) -> {failed, state()} | {ok, state()}. +try_commit_new_view(Fact, State) -> + Views = views(State), + NewFact = increment_sequence(Fact), + {Future, State2} = blocking_send_all({commit, NewFact}, State), + State3 = local_commit(NewFact, State2), + case wait_for_quorum(Future) of + {quorum_met, _Replies} -> + State4 = State3#state{last_views=Views}, + {ok, State4}; + {timeout, _Replies} -> + {failed, set_leader(undefined, State3)} + end. + -spec try_commit(fact(), state()) -> {failed, state()} | {ok, state()}. try_commit(NewFact0, State) -> Views = views(State),