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; } }); }
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,
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}"); }); }