private void Terminate(Instance r, NumberedValue x) { if (x.Value == accepted?.Value) { accepted = null; } Terminate(r, x.Value); }
private void BindAsProposer(Instance r) { WaitQuorum(r, MessageType.Ack, msgs => { var v = PickHighestNumberedValue(msgs)?.Value ?? Proposer.GetProposal(); if (Archiver.CanCommit(v)) { var x = new NumberedValue(v, proposalNumber); Broadcast(r, MessageType.Select, x); } }); WaitMessage(r, MessageType.Nack, msg => { if (msg.Value != null) { var n = (long)msg.Value; if (n > minNumber) { minNumber = Math.Max(n, minNumber); if (RandomExtensions.Tryout(0.5)) { Propose(r); } } } }); WaitQuorum(r, MessageType.Accept, msgs => { var m = msgs.Select(m => m.Value).Distinct(); if (m.Count() == 1) { var x = m.Single() as NumberedValue; Terminate(r, x); Broadcast(r, MessageType.Decide, x); } }); }