Esempio n. 1
0
        public SuccessorTable(NodeInfo identity, int successorCount) : base(successorCount)
        {
            Identity = identity;

            for (int i = 0; i < Entries.Length; ++i)
            {
                var finger = identity.RoutingHash;
                Entries[i] = new RoutingTableEntry(finger, identity);
            }
        }
Esempio n. 2
0
        private void Init(NodeInfo identity, int tableLength)
        {
            var routingHash = identity.RoutingHash;

            for (int i = 0; i < tableLength; ++i)
            {
                var finger = routingHash + routingHash.One() << i;
                Entries[i] = new RoutingTableEntry(finger, identity);
            }
        }
Esempio n. 3
0
        public static RoutingTableEntry[] CreateEntries(int entryCount, ConsistentHash nodeHash)
        {
            var entries = RoutingTable.CreateEntries(entryCount);

            for (int i = 0; i < entryCount; ++i)
            {
                var finger = nodeHash + nodeHash.One() << i;
                entries[i] = new RoutingTableEntry(finger, null);
            }

            return(entries);
        }
            public void Handle(Notify message)
            {
                _node.Log($"{message.TypeName()} From:{message.From}");
                _commMgr.SendAck(message, message.CorrelationId);

                // Let the predecessor know to join to the specified successor.
                // And adjust successor table accordingly.
                var entries = _node.SuccessorTable.Entries;

                for (int i = 1; i < entries.Length; ++i)
                {
                    entries[i] = entries[i - 1];
                }
                var successor = message.NewSuccessor;

                entries[0] = new RoutingTableEntry(successor.RoutingHash, successor);

                _node.Log($"Changed successor to {successor}");
                _commMgr.Send(new NotifyReply(_node.Identity, message.From, message.CorrelationId));
            }
            public void Handle(GetSuccessorTable message)
            {
                _node.LogMessage(message);
                _commMgr.SendAck(message, message.CorrelationId);

                var applicant = message.Applicant;

                if (_node.IsInDomain(applicant.RoutingHash))
                {
                    _node.Log($"{applicant} IsInDomain");
                    // the predecessors successor table will become the applicant's if the applicant node
                    // becomes the new predecessor. The head of the predecessors table is this node.

                    var nextSuccessor    = _node.Identity;
                    var returnAddress    = message.From;
                    var tableLength      = _node.SuccessorTable.Length;
                    var predecessorTable = new RoutingTableEntry[_node.SuccessorTable.Length];
                    if (tableLength > 1)
                    {
                        var thisTable = _node.SuccessorTable;
                        for (int i = 0; i < predecessorTable.Length - 1; i++)
                        {
                            predecessorTable[i + 1] = thisTable[i];
                        }
                    }

                    predecessorTable[0] = new RoutingTableEntry(_node.Identity.RoutingHash, _node.Identity);

                    var reply = new GetSuccessorTableReply(_node.Identity, returnAddress, message.CorrelationId)
                    {
                        SuccessorTable = predecessorTable,
                    };
                    _node.Log($"Sending {reply.TypeName()}");
                    _commMgr.Send(reply);


                    //message.SuccessorTable[message.HopCount] = new RoutingTableEntry(nextSuccessor.RoutingHash, nextSuccessor);

                    //var hopMax = _node.Config.SuccessorCount - 1;
                    //if (message.HopCount < hopMax)
                    //{
                    //    nextSuccessor = _node.Successor;
                    //    _node.Log($"Successor({message.HopCount}) found. Forwarding to {nextSuccessor}");

                    //    var forwardMsg = message;
                    //    forwardMsg.To = nextSuccessor;
                    //    forwardMsg.HopCount++;
                    //    forwardMsg.Applicant = nextSuccessor; // we need to now follow a chain of successors

                    //    _commMgr.Send(forwardMsg);
                    //}
                    //else
                    //{
                    //    // we've collected all the successors. Now send them home
                    //    var returnAddress = message.From;
                    //    var reply = new GetSuccessorTableReply(_node.Identity, returnAddress, message.CorrelationId)
                    //    {
                    //        SuccessorTable = message.SuccessorTable,
                    //    };
                    //    _node.Log($"Sending {reply.TypeName()} Successor({message.HopCount}) found.");
                    //    _commMgr.Send(reply);
                    //}
                }
                else // Ask the network
                {
                    var closestNode = _node.SuccessorTable.FindClosestPrecedingFinger(applicant.RoutingHash);
                    message.To = closestNode;
                    _node.Log($"Routing {message.TypeName()} {message.To}");
                    _commMgr.Send(message);
                }
            }