Example #1
0
            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);
                        }
                    });
                }
            }
Example #2
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);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
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);
        }