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