Esempio n. 1
0
		internal NodeGroup(RelayNodeGroupDefinition groupDefinition, RelayNodeConfig nodeConfig, ForwardingConfig forwardingConfig)
		{   
			GroupDefinition = groupDefinition;
			Activated = groupDefinition.Activated;
			_clusterByRange = groupDefinition.UseIdRanges;
			_forwardingConfig = forwardingConfig;
			NodeSelectionHopWindowSize = groupDefinition.NodeSelectionHopWindowSize;
			RelayNodeClusterDefinition myClusterDefinition = NodeManager.Instance.GetMyNodeClusterDefinition();

			foreach (RelayNodeClusterDefinition clusterDefintion in groupDefinition.RelayNodeClusters)
			{
				NodeCluster nodeCluster = new NodeCluster(clusterDefintion, nodeConfig, this, forwardingConfig);
				if (clusterDefintion == myClusterDefinition)
				{
					MyCluster = nodeCluster;
				}
				Clusters.Add(nodeCluster);
			}

			_nodeReselectTimerCallback = new System.Threading.TimerCallback(NodeReselectTimer_Elapsed);
			if (_nodeReselectTimer == null)
			{
				_nodeReselectTimer = new System.Threading.Timer(_nodeReselectTimerCallback);
			}
			_nodeReselectTimer.Change(NodeReselectIntervalMilliseconds, NodeReselectIntervalMilliseconds);

			QueueTimerCallback = new System.Threading.TimerCallback(QueueTimer_Elapsed);
			if (QueueTimer == null)
			{
				QueueTimer = new System.Threading.Timer(QueueTimerCallback);
			}
			QueueTimer.Change(DequeueIntervalMilliseconds, DequeueIntervalMilliseconds);
		}
Esempio n. 2
0
        internal NodeGroup(RelayNodeGroupDefinition groupDefinition, RelayNodeConfig nodeConfig, ForwardingConfig forwardingConfig)
        {
            GroupDefinition   = groupDefinition;
            Activated         = groupDefinition.Activated;
            _clusterByRange   = groupDefinition.UseIdRanges;
            _forwardingConfig = forwardingConfig;

            RelayNodeClusterDefinition myClusterDefinition = NodeManager.Instance.GetMyNodeClusterDefinition();

            foreach (RelayNodeClusterDefinition clusterDefintion in groupDefinition.RelayNodeClusters)
            {
                NodeCluster nodeCluster = new NodeCluster(clusterDefintion, nodeConfig, this, forwardingConfig);
                if (clusterDefintion == myClusterDefinition)
                {
                    MyCluster = nodeCluster;
                }
                Clusters.Add(nodeCluster);
            }

            _nodeReselectTimerCallback = new System.Threading.TimerCallback(NodeReselectTimer_Elapsed);
            if (_nodeReselectTimer == null)
            {
                _nodeReselectTimer = new System.Threading.Timer(_nodeReselectTimerCallback);
            }
            _nodeReselectTimer.Change(NodeReselectIntervalMilliseconds, NodeReselectIntervalMilliseconds);

            QueueTimerCallback = new System.Threading.TimerCallback(QueueTimer_Elapsed);
            if (QueueTimer == null)
            {
                QueueTimer = new System.Threading.Timer(QueueTimerCallback);
            }
            QueueTimer.Change(DequeueIntervalMilliseconds, DequeueIntervalMilliseconds);
        }
		public SocketTransportAdapter(RelayNodeDefinition node,
			RelayNodeGroupDefinition group, int chunkLength)
		{
			this.node = node;
			this.defaultChunkLength = chunkLength;
			LoadSettings(node, group);
		}
Esempio n. 4
0
 public RelayNodeClusterDefinition GetMyCluster()
 {
     if (!lookedForCluster)
     {
         lock (myClusterLock)
         {
             if (!lookedForCluster)
             {
                 RelayNodeGroupDefinition myGroup = GetMyGroup();
                 if (myGroup != null)
                 {
                     int portNumber;
                     List <IPAddress> addresses;
                     GetMyNetworkInfo(out addresses, out portNumber);
                     if (portNumber != 0 && addresses != null)
                     {
                         foreach (IPAddress address in addresses)
                         {
                             myCluster = myGroup.GetClusterFor(address, portNumber);
                             if (myCluster != null)
                             {
                                 break;
                             }
                         }
                     }
                 }
                 lookedForCluster = true;
             }
         }
     }
     return(myCluster);
 }
		public void LoadSettings(RelayNodeDefinition node, RelayNodeGroupDefinition group)
		{
			MySpace.SocketTransport.SocketSettings newSettings = BuildSettings(group.SocketSettings);
			if (newSettings.SameAs(settings)) return;
			IDisposable disposableObject = null;
			try
			{
				settings = newSettings;
				socketClient = new SocketClient(node.IPEndPoint, settings);
				disposableObject = asyncSocketClient;
				asyncSocketClient = new AsyncSocketClient(node.IPEndPoint, new SocketPoolConfig
				{
					ReceiveTimeout = settings.ReceiveTimeout,
					NetworkOrdered = settings.UseNetworkOrder,
					ConnectTimeout = settings.ConnectTimeout,
					LoanCapacity = settings.PoolSize
				});
			}
			finally
			{
				if (disposableObject != null)
				{
					try
					{
						asyncSocketClient.Dispose();
					}
					catch (Exception ex)
					{
						log.Error("Failed to dispose AsyncSocketClient", ex);
					}
				}
			}
		}
        private IRelayTransport _createTransportDelegate(RelayNodeDefinition nodeDefinition,
                                                         RelayNodeGroupDefinition groupDefinition)
        {
            var transport = new MockTransport(nodeDefinition, groupDefinition);

            transport.DoDispatchMessages        = true;
            transport.MessageRecievedMethod     = _receiveMessage;
            transport.MessageListRecievedMethod = _receiveMessageList;
            IRelayTransport[] otherTransports = null;
            if (_createTransports != null)
            {
                var count = _createTransports.Length;
                if (count > 0)
                {
                    otherTransports = new IRelayTransport[count];
                    for (var idx = 0; idx < count; ++idx)
                    {
                        otherTransports[idx] = _createTransports[idx](
                            nodeDefinition, groupDefinition);
                    }
                }
            }
            if (otherTransports == null)
            {
                return(transport);
            }
            var transports = new List <IRelayTransport>();

            transports.AddRange(otherTransports);
            transports.Add(transport);
            return(new RelayTransportStack(transports.ToArray()));
        }
Esempio n. 7
0
 public RelayNodeDefinition GetMyNode()
 {
     if (!lookedForNode)
     {
         lock (myNodeLock)
         {
             if (!lookedForNode)
             {
                 RelayNodeGroupDefinition group = GetMyGroup();
                 if (group != null)
                 {
                     int portNumber;
                     List <IPAddress> addresses;
                     GetMyNetworkInfo(out addresses, out portNumber);
                     if (portNumber != 0 && addresses != null)
                     {
                         foreach (IPAddress address in addresses)
                         {
                             myNode = group.GetNodeFor(address, portNumber);
                             if (myNode != null)
                             {
                                 break;
                             }
                         }
                     }
                 }
                 lookedForNode = true;
             }
         }
     }
     return(myNode);
 }
 public SocketTransportAdapter(RelayNodeDefinition node,
                               RelayNodeGroupDefinition group, int chunkLength)
 {
     this.node = node;
     this.defaultChunkLength = chunkLength;
     LoadSettings(node, group);
 }
Esempio n. 9
0
        private void InstantiatePipelineClient(RelayNodeGroupDefinition groupDefinition)
        {
            var client = PipelineClient.GetClient(_ipEndPoint);

            client.AckTimeout      = TimeSpan.FromMilliseconds(groupDefinition.SocketSettings.ReceiveTimeout >> 1);
            client.ResponseTimeout = TimeSpan.FromMilliseconds(groupDefinition.SocketSettings.ReceiveTimeout);
            RelayMessageSender     = new PipelineSender(client);
        }
Esempio n. 10
0
        internal void ReloadMapping(RelayNodeGroupDefinition groupDefinition, RelayNodeConfig newConfig, ForwardingConfig newForwardingConfig)
        {
            RelayNodeClusterDefinition myClusterDefinition = newConfig.GetMyCluster();

            Activated         = groupDefinition.Activated;
            GroupDefinition   = groupDefinition;
            _clusterByRange   = groupDefinition.UseIdRanges;
            _forwardingConfig = newForwardingConfig;

            if (groupDefinition.RelayNodeClusters.Length == Clusters.Count)
            {
                //same number of clusters, just let the clusters rebuild themselves. the clusters will entirely rebuild, so shuffinling around servers should be okay
                if (_log.IsDebugEnabled)
                {
                    _log.DebugFormat("Rebuilding existing clusters in group {0}.", groupDefinition.Name);
                }
                for (int i = 0; i < groupDefinition.RelayNodeClusters.Length; i++)
                {
                    Clusters[i].ReloadMapping(groupDefinition.RelayNodeClusters[i], newConfig, newForwardingConfig);
                    if (groupDefinition.RelayNodeClusters[i] == myClusterDefinition)
                    {
                        MyCluster = Clusters[i];
                    }
                }
                if (myClusterDefinition == null && MyCluster != null)
                {
                    if (_log.IsInfoEnabled)
                    {
                        _log.InfoFormat("Group {0} no longer contains this server. Removing.", GroupName);
                    }
                    //this group no longer contains "me". If it DID contain "me", it would've been set above.
                    MyCluster = null;
                }
            }
            else
            {
                //build new clusters and replace the existing ones with them
                if (_log.IsInfoEnabled)
                {
                    _log.InfoFormat("Number of clusters in group {0} changed, rebuilding.", groupDefinition.Name);
                }
                NodeCluster        myCluster   = null;
                List <NodeCluster> newClusters = new List <NodeCluster>();
                foreach (RelayNodeClusterDefinition clusterDefintion in groupDefinition.RelayNodeClusters)
                {
                    NodeCluster nodeCluster = new NodeCluster(clusterDefintion, newConfig, this, newForwardingConfig);
                    if (clusterDefintion == myClusterDefinition)
                    {
                        myCluster = nodeCluster;
                    }
                    newClusters.Add(nodeCluster);
                }
                Clusters  = newClusters;
                MyCluster = myCluster;
            }
            _nodeReselectTimer.Change(NodeReselectIntervalMilliseconds, NodeReselectIntervalMilliseconds);
        }
		/// <summary>
		/// Creates a new instance of <see cref="IRelayTransport"/> for the given <see cref="RelayNodeDefinition"/>
		/// and <see cref="RelayNodeGroupDefinition"/>.
		/// </summary>
		/// <param name="nodeDefinition">The node definition.</param>
		/// <param name="group">The group.</param>
		/// <param name="chunkLength">The chunk length</param>
		/// <returns></returns>
		internal static IRelayTransport CreateTransportForNode(RelayNodeDefinition nodeDefinition,
			RelayNodeGroupDefinition group, int chunkLength)
		{
			CreateTransportDelegate creator = CreateTransportMethod;
			if (creator == null)
			{
				return new SocketTransportAdapter(nodeDefinition, group, chunkLength);
			}
			IRelayTransport transport = creator(nodeDefinition, group) ?? new NullTransport();
			return transport;
		}
Esempio n. 12
0
        /// <summary>
        /// Creates a new instance of <see cref="IRelayTransport"/> for the given <see cref="RelayNodeDefinition"/>
        /// and <see cref="RelayNodeGroupDefinition"/>.
        /// </summary>
        /// <param name="nodeDefinition">The node definition.</param>
        /// <param name="group">The group.</param>
        /// <param name="chunkLength">The chunk length</param>
        /// <returns></returns>
        internal static IRelayTransport CreateTransportForNode(RelayNodeDefinition nodeDefinition,
                                                               RelayNodeGroupDefinition group, int chunkLength)
        {
            CreateTransportDelegate creator = CreateTransportMethod;

            if (creator == null)
            {
                return(new SocketTransportAdapter(nodeDefinition, group, chunkLength));
            }
            IRelayTransport transport = creator(nodeDefinition, group) ?? new NullTransport();

            return(transport);
        }
Esempio n. 13
0
        /// <summary>Initializes an instance of the <see cref="MockTransport"/> class.</summary>
        /// <param name="nodeDefinition">The node definition.</param>
        /// <param name="groupDefinition">The group definition.</param>
        public MockTransport(RelayNodeDefinition nodeDefinition,
                             RelayNodeGroupDefinition groupDefinition)
        {
            if (nodeDefinition == null)
            {
                throw new ArgumentNullException("nodeDefinition");
            }
            if (groupDefinition == null)
            {
                throw new ArgumentNullException("groupDefinition");
            }

            _node              = nodeDefinition;
            _group             = groupDefinition;
            DoDispatchMessages = true;
        }
        public SocketTransportSender(RelayNodeDefinition nodeDefinition, RelayNodeGroupDefinition groupDefinition)
        {
            if (groupDefinition.SocketSettings != null)
            {
                _sendTimeout = TimeSpan.FromMilliseconds(groupDefinition.SocketSettings.SendTimeout);
            }
            else if (groupDefinition.DefaultSocketSettings != null)
            {
                _sendTimeout = TimeSpan.FromMilliseconds(groupDefinition.DefaultSocketSettings.SendTimeout);
            }
            else
            {
                _sendTimeout = TimeSpan.Zero;
            }

            _transport = new SocketTransportAdapter(nodeDefinition, groupDefinition, 1);
        }
Esempio n. 15
0
        public RelayNodeGroupDefinition GetNodeGroupForTypeId(short typeId)
        {
            RelayNodeGroupDefinition group = null;

            if (RelayNodeMapping != null && TypeSettings != null)
            {
                string groupName = TypeSettings.TypeSettingCollection.GetGroupNameForId(typeId);
                if (groupName != null)
                {
                    if (RelayNodeMapping.RelayNodeGroups.Contains(groupName))
                    {
                        group = RelayNodeMapping.RelayNodeGroups[groupName];
                    }
                }
            }

            return(group);
        }
Esempio n. 16
0
        public RelayNodeGroupDefinition GetMyGroup()
        {
            if (!lookedForGroup)
            {
                lock (myGroupLock)
                {
                    if (!lookedForGroup)
                    {
                        int portNumber;
                        List <IPAddress> addresses;
                        GetMyNetworkInfo(out addresses, out portNumber);
                        if (portNumber == 0)
                        {
                            if (log.IsInfoEnabled)
                            {
                                log.Info("This server is not listening and will act as a client.");
                            }
                        }
                        else if (addresses != null)
                        {
                            if (log.IsInfoEnabled)
                            {
                                log.Info("The Relay Node Mapping is looking for group containing this server.");
                            }
                            myGroup = RelayNodeMapping.RelayNodeGroups.GetGroupContaining(addresses, portNumber);
                            if (log.IsInfoEnabled)
                            {
                                if (myGroup != null)
                                {
                                    log.InfoFormat("This server is in group {0}", myGroup.Name);
                                }
                                else
                                {
                                    log.InfoFormat("This server is not in any defined groups and will act as a client.");
                                }
                            }
                        }

                        lookedForGroup = true;
                    }
                }
            }
            return(myGroup);
        }
        private void BuildNodeGroups(RelayNodeConfig relayNodeConfig, Dictionary <string, Dictionary <string, MessageQueue> > errorQueues)
        {
            RelayNodeMapping relayNodeMapping = relayNodeConfig.RelayNodeMapping;

            if (relayNodeMapping != null)
            {
                if (relayNodeMapping.Validate())
                {
                    NodeGroupCollection nodeGroups = new NodeGroupCollection(relayNodeMapping.RelayNodeGroups, relayNodeConfig, ForwardingConfig);

                    NodeGroups = nodeGroups;
                    RelayNodeGroupDefinition myGroupDefinition = Config.GetMyGroup();
                    if (myGroupDefinition != null && NodeGroups.Contains(myGroupDefinition.Name))
                    {
                        MyNodeGroup = NodeGroups[myGroupDefinition.Name];
                    }
                    else
                    {
                        MyNodeGroup = null;
                    }

                    if (errorQueues != null)
                    {
                        nodeGroups.PopulateQueues(errorQueues, true);
                    }
                }
                else
                {
                    if (_log.IsErrorEnabled)
                    {
                        _log.Error("Forwarder not loading invalid config.");
                    }
                    NodeGroups = new NodeGroupCollection();
                }
            }
            else
            {
                NodeGroups = new NodeGroupCollection();
            }
        }
Esempio n. 18
0
        /// <summary>
        /// Initializes a new instance of the <see cref="RelayEndPoint"/> class, and presents a <see cref="IRelayMessageSender"/>.
        /// </summary>
        /// <param name="nodeDefinition">The node definition.</param>
        /// <param name="groupDefinition">The group definition.</param>
        /// <exception cref="InvalidOperationException">Thrown if the RelayNode configuration member "ServiceType" is set to an invalid value.</exception>
        /// <remarks>A RelayEndPoint references either a PipelineTransport or or SocketTransport type endpoint, which is configured in the RelayNodeMapping.
        /// A pipeline node will have the PipelinePort set to a nonzero value.  A SocketTransport node will have the ServiceType="Sockets" and Port set
        /// to a nonzero value.</remarks>
        public RelayEndPoint(RelayNodeDefinition nodeDefinition, RelayNodeGroupDefinition groupDefinition)
        {
            var address = Dns.GetHostAddresses(nodeDefinition.Host)[0];

            if (nodeDefinition.PipelinePort != 0)
            {
                _ipEndPoint = new IPEndPoint(address, nodeDefinition.PipelinePort);
                InstantiatePipelineClient(groupDefinition);
            }
            else
            {
                if (nodeDefinition.ServiceType == "Sockets")
                {
                    _ipEndPoint = new IPEndPoint(address, nodeDefinition.Port);
                    InstantiateSocketTransportClient(nodeDefinition, groupDefinition);
                }
                else
                {
                    throw new InvalidOperationException(String.Format("An invalid ServiceType, {0}, was defined for Relay Node {2}/{1}.", nodeDefinition.ServiceType, nodeDefinition.Host, groupDefinition.Name));
                }
            }
        }
Esempio n. 19
0
        /// <summary>
        /// Initializes the cluster info.
        /// </summary>
        /// <param name="myClusterPos">My cluster pos.</param>
        /// <param name="numClustersInGroup">The num clusters in group.</param>
        /// <param name="myZone">My zone.</param>
        private static void InitializeClusterInfo(out int myClusterPos, out int numClustersInGroup, out ushort myZone)
        {
            RelayNodeGroupDefinition myGroup = RelayNodeConfig.GetRelayNodeConfig().GetMyGroup();

            RelayNodeClusterDefinition myCluster = RelayNodeConfig.GetRelayNodeConfig().GetMyCluster();

            RelayNodeDefinition myNode = RelayNodeConfig.GetRelayNodeConfig().GetMyNode();

            myZone             = myNode.Zone;
            numClustersInGroup = myGroup.RelayNodeClusters.Length;
            myClusterPos       = 0;

            foreach (RelayNodeClusterDefinition cluster in myGroup.RelayNodeClusters)
            {
                if (cluster.RelayNodes.Length == myCluster.RelayNodes.Length &&
                    cluster.ContainsNode(myNode.IPAddress, myNode.Port))
                {
                    // this cluster contains my Node
                    break;
                }
                myClusterPos++;
            }
        }
        public void LoadSettings(RelayNodeDefinition node, RelayNodeGroupDefinition group)
        {
            MySpace.SocketTransport.SocketSettings newSettings = BuildSettings(group.SocketSettings);
            if (newSettings.SameAs(settings))
            {
                return;
            }
            IDisposable disposableObject = null;

            try
            {
                settings          = newSettings;
                socketClient      = new SocketClient(node.IPEndPoint, settings);
                disposableObject  = asyncSocketClient;
                asyncSocketClient = new AsyncSocketClient(node.IPEndPoint, new SocketPoolConfig
                {
                    ReceiveTimeout = settings.ReceiveTimeout,
                    NetworkOrdered = settings.UseNetworkOrder,
                    ConnectTimeout = settings.ConnectTimeout,
                    LoanCapacity   = settings.PoolSize
                });
            }
            finally
            {
                if (disposableObject != null)
                {
                    try
                    {
                        asyncSocketClient.Dispose();
                    }
                    catch (Exception ex)
                    {
                        log.Error("Failed to dispose AsyncSocketClient", ex);
                    }
                }
            }
        }
Esempio n. 21
0
 private void InstantiateSocketTransportClient(RelayNodeDefinition nodeDefinition, RelayNodeGroupDefinition groupDefinition)
 {
     RelayMessageSender = new SocketTransportSender(nodeDefinition, groupDefinition);
 }
Esempio n. 22
0
 private void _receiveMessageList(IList <RelayMessage> messages, RelayNodeDefinition nodeDefinition, RelayNodeGroupDefinition groupDefinition)
 {
     foreach (var component in _components)
     {
         component.HandleMessages(messages);
     }
 }
Esempio n. 23
0
		internal void ReloadMapping(RelayNodeGroupDefinition groupDefinition, RelayNodeConfig newConfig, ForwardingConfig newForwardingConfig)
		{
			RelayNodeClusterDefinition myClusterDefinition = newConfig.GetMyCluster();
			Activated = groupDefinition.Activated;
			GroupDefinition = groupDefinition;
			_clusterByRange = groupDefinition.UseIdRanges;
			_forwardingConfig = newForwardingConfig;
			NodeSelectionHopWindowSize = groupDefinition.NodeSelectionHopWindowSize;
			if (groupDefinition.RelayNodeClusters.Length == Clusters.Count)
			{
				//same number of clusters, just let the clusters rebuild themselves. the clusters will entirely rebuild, so shuffinling around servers should be okay
				if (_log.IsInfoEnabled)
					_log.InfoFormat("Rebuilding existing clusters in group {0}.", groupDefinition.Name);
				for (int i = 0; i < groupDefinition.RelayNodeClusters.Length; i++)
				{
					Clusters[i].ReloadMapping(groupDefinition.RelayNodeClusters[i], newConfig, newForwardingConfig);
					if (groupDefinition.RelayNodeClusters[i] == myClusterDefinition)
					{
						MyCluster = Clusters[i];
					}
				}
				if (myClusterDefinition == null && MyCluster != null)
				{
					if (_log.IsInfoEnabled)
						_log.InfoFormat("Group {0} no longer contains this server. Removing.", GroupName);
					//this group no longer contains "me". If it DID contain "me", it would've been set above.
					MyCluster = null;
				}
			}
			else
			{
				//build new clusters and replace the existing ones with them
				if (_log.IsInfoEnabled)
					_log.InfoFormat("Number of clusters in group {0} changed, rebuilding.", groupDefinition.Name);
				NodeCluster myCluster = null;
				List<NodeCluster> newClusters = new List<NodeCluster>();
				foreach (RelayNodeClusterDefinition clusterDefintion in groupDefinition.RelayNodeClusters)
				{
					NodeCluster nodeCluster = new NodeCluster(clusterDefintion, newConfig, this, newForwardingConfig);
					if (clusterDefintion == myClusterDefinition)
					{
						myCluster = nodeCluster;
					}
					newClusters.Add(nodeCluster);
				}
				Clusters = newClusters;
				MyCluster = myCluster;
			}
			_nodeReselectTimer.Change(NodeReselectIntervalMilliseconds, NodeReselectIntervalMilliseconds);
		}
Esempio n. 24
0
 private void _receiveMessage(RelayMessage message, RelayNodeDefinition nodeDefinition, RelayNodeGroupDefinition groupDefinition)
 {
     foreach (var component in _components)
     {
         component.HandleMessage(message);
     }
 }