mirror of
https://github.com/ChronosX88/KademliaDHT.git
synced 2024-11-25 03:32:19 +00:00
d242e0a13a
- Before we were doing this by just adding incrementing a value everytime we get a set of nodes as the reply of a FIND_NODE or FIND_VALUE RPC -- This may be wrong since nodes the same distance away may reply and we'll still be incrementing for both - Created a route length checker class to properly check route lengths ContentLookupOperation - Added the route length check to the CLO operation Didn't add it to the NodeLookupOperation since I'm not sure we're using it anywhere... Though it can be useful there
93 lines
2.3 KiB
Java
93 lines
2.3 KiB
Java
package kademlia.util;
|
|
|
|
import java.util.Collection;
|
|
import java.util.HashMap;
|
|
import kademlia.node.Node;
|
|
|
|
/**
|
|
* Class that helps compute the route length taken to complete an operation.
|
|
*
|
|
* Only used for routing operations - mainly the NodeLookup and ContentLookup Operations.
|
|
*
|
|
* Idea:
|
|
* - Add the original set of nodes with route length 0;
|
|
* - When we get a node reply with a set of nodes, we add those nodes and set the route length to their sender route length + 1
|
|
*
|
|
* @author Joshua Kissoon
|
|
* @since 20140510
|
|
*/
|
|
public class RouteLengthChecker
|
|
{
|
|
|
|
/* Store the nodes and their route length (RL) */
|
|
private final HashMap<Node, Integer> nodes;
|
|
|
|
/* Lets cache the max route length instead of having to go and search for it later */
|
|
private int maxRouteLength;
|
|
|
|
|
|
{
|
|
this.nodes = new HashMap<>();
|
|
this.maxRouteLength = 1;
|
|
}
|
|
|
|
/**
|
|
* Add the initial nodes in the routing operation
|
|
*
|
|
* @param initialNodes The set of initial nodes
|
|
*/
|
|
public void addInitialNodes(Collection<Node> initialNodes)
|
|
{
|
|
for (Node n : initialNodes)
|
|
{
|
|
this.nodes.put(n, 1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add any nodes that we get from a node reply.
|
|
*
|
|
* The route length of these nodes will be their sender + 1;
|
|
*
|
|
* @param inputSet The set of nodes we receive
|
|
* @param sender The node who send the set
|
|
*/
|
|
public void addNodes(Collection<Node> inputSet, Node sender)
|
|
{
|
|
if (!this.nodes.containsKey(sender))
|
|
{
|
|
return;
|
|
}
|
|
|
|
/* Get the route length of the input set - sender RL + 1 */
|
|
int inputSetRL = this.nodes.get(sender) + 1;
|
|
|
|
if (inputSetRL > this.maxRouteLength)
|
|
{
|
|
this.maxRouteLength = inputSetRL;
|
|
}
|
|
|
|
/* Add the nodes to our set */
|
|
for (Node n : inputSet)
|
|
{
|
|
/* We only add if the node is not already there... */
|
|
if (!this.nodes.containsKey(n))
|
|
{
|
|
this.nodes.put(n, inputSetRL);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the route length of the operation!
|
|
*
|
|
* It will be the max route length of all the nodes here.
|
|
*
|
|
* @return The route length
|
|
*/
|
|
public int getRouteLength()
|
|
{
|
|
return this.maxRouteLength;
|
|
}
|
|
}
|