public void Handle(GetFingerTable message) { var bitCount = message.Identity.RoutingHash.BitCount; var entries = FingerTable.CreateEntries(bitCount, message.ForNode.RoutingHash); var responder = new RequestResponseHandler <Guid>(Node.MessageBus); Node.MessageBus.Subscribe(responder); var replyCount = new Reference <int>(0); // ensure all replies share the current count for (int i = 0; i < bitCount; ++i) { var index = i; // Value must be constant in the scope of the reply responder.Publish( new FindSuccessorToHash(Node.Identity, entries[i].StartValue, GetNextCorrelation()), (FindSuccessorToHash.Reply reply) => { entries[index] = new RoutingTableEntry(entries[index].StartValue, reply.Successor); ++replyCount.Value; if (replyCount == bitCount) { var getFingerTableReply = new GetFingerTable.Reply(Node.Identity, message.CorrelationId, entries); CloseHandlerWithReply(getFingerTableReply, message.Identity, responder); } }); } }
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); } }
public FingerTable(NodeInfo identity, int tableLength) : base(tableLength) { Identity = identity; 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); }