Exemple #1
0
 private void Terminate(Instance r, NumberedValue x)
 {
     if (x.Value == accepted?.Value)
     {
         accepted = null;
     }
     Terminate(r, x.Value);
 }
Exemple #2
0
        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);
                }
            });
        }