public void RemoveMessage(ShadowCompletionMessage message) { PeerMessageQueue peerQueue; if (!_savedMessages.TryGetValue(message.ToPeer, out peerQueue)) { peerQueue = new PeerMessageQueue(message.ToPeer); _savedMessages.Add(message.ToPeer, peerQueue); } if (peerQueue[message.Endpoint].Count == 0 || peerQueue.GlobalQueue.Count == 0) { peerQueue.OutOfOrderAcks.Add(message.MessageId, message); return; } var item = peerQueue.GlobalQueue.Peek(); if (item.Message.MessageIdentity != message.MessageId) { peerQueue.OutOfOrderAcks.Add(message.MessageId, message); } else { peerQueue.GlobalQueue.Dequeue(); RemoveFromTransportQueue(message.Endpoint, message.MessageId, peerQueue); } }
public void SaveMessage(ShadowMessageCommand shadowMessage) { PeerMessageQueue queue; if (!_savedMessages.TryGetValue(shadowMessage.PrimaryRecipient, out queue)) { queue = new PeerMessageQueue(shadowMessage.PrimaryRecipient); _savedMessages[shadowMessage.PrimaryRecipient] = queue; } if (queue.OutOfOrderAcks.Count > 0 && queue.OutOfOrderAcks.ContainsKey(shadowMessage.Message.MessageIdentity)) { Console.WriteLine(string.Format("removing out of order ack {0}", shadowMessage.Message.MessageIdentity)); queue.OutOfOrderAcks.Remove(shadowMessage.Message.MessageIdentity); return; } queue[shadowMessage.TargetEndpoint].Enqueue(shadowMessage); queue.GlobalQueue.Enqueue(shadowMessage); }
private static void RemoveFromTransportQueue(IEndpoint endpoint, Guid messageId, PeerMessageQueue peerQueue) { var item = peerQueue[endpoint].Dequeue(); if (item.Message.MessageIdentity != messageId) { //argh, missing messages? Debugger.Break(); Console.WriteLine("error when removing from queue"); } }