private static LinkedListStack <Node> PrepareMessage(RelayMessage message) { LinkedListStack <Node> nodes = NodeManager.Instance.GetNodesForMessage(message); message.RelayTTL--; SetHydrationPolicy(message); if (nodes.Count > 0) { System.Net.IPAddress myAddress = NodeManager.Instance.MyIpAddress; if (myAddress != null) { message.AddAddressToHistory(myAddress); } } DebugWriter.WriteDebugInfo(message, nodes); return(nodes); }
private SimpleLinkedList <Node> PrepareMessage(RelayMessage message, bool isRetry) { if (isRetry) { message.RelayTTL++; } SimpleLinkedList <Node> nodes = NodeManager.Instance.GetNodesForMessage(message); message.RelayTTL--; SetHydrationPolicy(message); if (nodes.Count > 0 && !isRetry) { System.Net.IPAddress myAddress = NodeManager.Instance.MyIpAddress; if (myAddress != null) { message.AddressHistory.Add(myAddress); } } DebugWriter.WriteDebugInfo(message, nodes); return(nodes); }
/// <summary> /// Splits messages into various lists of in and out message destined for different nodes. /// </summary> /// <param name="messages"></param> /// <returns></returns> internal NodeWithMessagesCollection DistributeMessages(IList <RelayMessage> messages) { NodeWithMessagesCollection distribution = new NodeWithMessagesCollection(); RelayMessage message; Node node; for (int i = 0; i < messages.Count; i++) { if (messages[i] != null) { message = messages[i]; RelayMessage interZoneMessage = null; SimpleLinkedList <Node> nodesForMessage = GetNodesForMessage(message); SimpleLinkedList <Node> nodesForInterZoneMessage = null; if (nodesForMessage.Count > 0) { message.AddressHistory.Add(MyIpAddress); } message.RelayTTL--; #region Identify InterZone Messages if (message.IsTwoWayMessage == false) { message.ResultOutcome = RelayOutcome.Queued; //will be queued, if sync will not get overwritten // Identify nodes in foreign zones int nodeCount = nodesForMessage.Count; for (int nodeIndex = 0; nodeIndex < nodeCount; nodeIndex++) { nodesForMessage.Pop(out node); if (_myNodeDefinition != null && _myNodeDefinition.Zone != node.NodeDefinition.Zone) { // Message needs to cross Zone bounderies if (interZoneMessage == null) { interZoneMessage = RelayMessage.CreateInterZoneMessageFrom(message); nodesForInterZoneMessage = new SimpleLinkedList <Node>(); } nodesForInterZoneMessage.Push(node); } else { nodesForMessage.Push(node); } } } #endregion if (nodesForMessage.Count > 0) { DebugWriter.WriteDebugInfo(message, nodesForMessage); distribution.Add(message, nodesForMessage); } if (nodesForInterZoneMessage != null && nodesForInterZoneMessage.Count > 0) { DebugWriter.WriteDebugInfo(interZoneMessage, nodesForInterZoneMessage); distribution.Add(interZoneMessage, nodesForInterZoneMessage); } } } return(distribution); }