예제 #1
0
        public async Task Run()
        {
            var messageSender = new MessageSender();

            var    greatestPromisedTimePeriod = -1;
            var    lastAcceptedTime           = -1;
            string lastAcceptedValue          = null;

            await LoopUtil.LoopTheLoop(_queue, async message =>
            {
                if (message.TimePeriod <= lastAcceptedTime)
                {
                    return;
                }

                switch (message.Type)
                {
                case "prepare":
                    if (message.TimePeriod > greatestPromisedTimePeriod)
                    {
                        greatestPromisedTimePeriod = message.TimePeriod;
                    }

                    await messageSender.PostMessage(new[] { message.ProposerName }, "promised", new Promised
                    {
                        By                     = _name,
                        TimePeriod             = message.TimePeriod,
                        HaveAccepted           = lastAcceptedTime > -1,
                        LastAcceptedTimePeriod = lastAcceptedTime,
                        LastAcceptedValue      = lastAcceptedValue
                    });
                    break;

                case "proposed":
                    if (message.TimePeriod < greatestPromisedTimePeriod)
                    {
                        return;
                    }

                    lastAcceptedTime  = message.TimePeriod;
                    lastAcceptedValue = message.Value;

                    await messageSender.PostMessage(_learnerNames, "accepted", new Accepted
                    {
                        By         = _name,
                        TimePeriod = message.TimePeriod,
                        Value      = message.Value
                    });
                    break;
                }
            });
        }
예제 #2
0
        public async Task Run()
        {
            var messenger = new MessageSender();
            var received  = new Dictionary <int, List <Promised> >();
            var latestProposedTimePeriod = 0;

            await LoopUtil.LoopTheLoop(_queue, async message =>
            {
                if (message.TimePeriod <= latestProposedTimePeriod)
                {
                    return;
                }

                if (!received.TryGetValue(message.TimePeriod, out var messagesForPeriod))
                {
                    received[message.TimePeriod] = messagesForPeriod = new List <Promised>();
                }

                var matchingMessage =
                    messagesForPeriod.FirstOrDefault(
                        prevMessage => message.By != prevMessage.By);

                if (matchingMessage == null)
                {
                    return;
                }

                messagesForPeriod.Add(message);
                latestProposedTimePeriod = message.TimePeriod;

                var lastValueWithGreatestTime =
                    message.LastAcceptedTimePeriod > matchingMessage.LastAcceptedTimePeriod
                        ? message.LastAcceptedValue
                        : matchingMessage.LastAcceptedValue;

                var proposedValue = (message, matchingMessage) switch
                {
                    ({ HaveAccepted : true }, { HaveAccepted : true }) => lastValueWithGreatestTime,
예제 #3
0
        public async Task Run()
        {
            var received = new Dictionary <int, List <Accepted> >();

            await LoopUtil.LoopTheLoop(_queue, async message =>
            {
                if (!received.TryGetValue(message.TimePeriod, out var messagesForPeriod))
                {
                    received[message.TimePeriod] = messagesForPeriod = new List <Accepted>();
                }

                var matchingMessage = messagesForPeriod.FirstOrDefault(
                    prevMessage => message.By != prevMessage.By);

                messagesForPeriod.Add(message);

                if (matchingMessage == null)
                {
                    return;
                }

                Console.WriteLine($"Learned value '{message.Value}' in time period {message.TimePeriod}");
            });
        }