mirror of
https://github.com/ChronosX88/KademliaDHT.git
synced 2024-11-22 02:02:21 +00:00
ContentLookupOperation
Had a bug in the content lookup operation, if the total amount of content needed was not found, a Routing exception was thrown instead of returning what was found. Fixed the issue!
This commit is contained in:
parent
8e6052de23
commit
6503c79681
@ -274,30 +274,32 @@ public class Kademlia
|
|||||||
* Get some content stored on the DHT
|
* Get some content stored on the DHT
|
||||||
* The content returned is a JSON String in byte format; this string is parsed into a class
|
* The content returned is a JSON String in byte format; this string is parsed into a class
|
||||||
*
|
*
|
||||||
* @param param The parameters used to search for the content
|
* @param param The parameters used to search for the content
|
||||||
* @param numResultsReq How many results are required from different nodes
|
* @param numNodesToQuery How many nodes should we query to get this content. We return all content on these nodes.
|
||||||
*
|
*
|
||||||
* @return DHTContent The content
|
* @return DHTContent The content
|
||||||
*
|
*
|
||||||
* @throws java.io.IOException
|
* @throws java.io.IOException
|
||||||
*/
|
*/
|
||||||
public List<StorageEntry> get(GetParameter param, int numResultsReq) throws NoSuchElementException, IOException
|
public List<StorageEntry> get(GetParameter param, int numNodesToQuery) throws NoSuchElementException, IOException
|
||||||
{
|
{
|
||||||
List contentFound;
|
List contentFound = new ArrayList<>();;
|
||||||
if (this.dht.contains(param))
|
if (this.dht.contains(param))
|
||||||
{
|
{
|
||||||
/* If the content exist in our own DHT, then return it. */
|
/* If the content exist in our own DHT, then return it. */
|
||||||
contentFound = new ArrayList<>();
|
|
||||||
contentFound.add(this.dht.get(param));
|
contentFound.add(this.dht.get(param));
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (contentFound.size() == numNodesToQuery)
|
||||||
{
|
{
|
||||||
/* Seems like it doesn't exist in our DHT, get it from other Nodes */
|
return contentFound;
|
||||||
ContentLookupOperation clo = new ContentLookupOperation(server, localNode, param, numResultsReq, this.config);
|
|
||||||
clo.execute();
|
|
||||||
contentFound = clo.getContentFound();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Seems like it doesn't exist in our DHT, get it from other Nodes */
|
||||||
|
ContentLookupOperation clo = new ContentLookupOperation(server, localNode, param, numNodesToQuery, this.config);
|
||||||
|
clo.execute();
|
||||||
|
contentFound = clo.getContentFound();
|
||||||
|
|
||||||
return contentFound;
|
return contentFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public class StorageEntryMetadata
|
|||||||
{
|
{
|
||||||
return this.contentHash;
|
return this.contentHash;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getLastUpdatedTimestamp()
|
public long getLastUpdatedTimestamp()
|
||||||
{
|
{
|
||||||
return this.updatedTs;
|
return this.updatedTs;
|
||||||
@ -76,7 +76,12 @@ public class StorageEntryMetadata
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check that key matches */
|
/* Check that key matches */
|
||||||
return (params.getKey() != null) && (params.getKey().equals(this.key));
|
if ((params.getKey() != null) && (!params.getKey().equals(this.key)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -43,7 +43,7 @@ public class ContentLookupOperation implements Operation, Receiver
|
|||||||
private final Node localNode;
|
private final Node localNode;
|
||||||
private final GetParameter params;
|
private final GetParameter params;
|
||||||
private final List<StorageEntry> contentFound;
|
private final List<StorageEntry> contentFound;
|
||||||
private final int numResultsReq;
|
private final int numNodesToQuery;
|
||||||
private final KadConfiguration config;
|
private final KadConfiguration config;
|
||||||
|
|
||||||
private final ContentLookupMessage lookupMessage;
|
private final ContentLookupMessage lookupMessage;
|
||||||
@ -67,11 +67,11 @@ public class ContentLookupOperation implements Operation, Receiver
|
|||||||
/**
|
/**
|
||||||
* @param server
|
* @param server
|
||||||
* @param localNode
|
* @param localNode
|
||||||
* @param params The parameters to search for the content which we need to find
|
* @param params The parameters to search for the content which we need to find
|
||||||
* @param numResultsReq The number of results for this content from different nodes required
|
* @param numNodesToQuery The number of nodes to query to get this content. We return the content among these nodes.
|
||||||
* @param config
|
* @param config
|
||||||
*/
|
*/
|
||||||
public ContentLookupOperation(KadServer server, Node localNode, GetParameter params, int numResultsReq, KadConfiguration config)
|
public ContentLookupOperation(KadServer server, Node localNode, GetParameter params, int numNodesToQuery, KadConfiguration config)
|
||||||
{
|
{
|
||||||
/* Construct our lookup message */
|
/* Construct our lookup message */
|
||||||
this.lookupMessage = new ContentLookupMessage(localNode, params);
|
this.lookupMessage = new ContentLookupMessage(localNode, params);
|
||||||
@ -79,7 +79,7 @@ public class ContentLookupOperation implements Operation, Receiver
|
|||||||
this.server = server;
|
this.server = server;
|
||||||
this.localNode = localNode;
|
this.localNode = localNode;
|
||||||
this.params = params;
|
this.params = params;
|
||||||
this.numResultsReq = numResultsReq;
|
this.numNodesToQuery = numNodesToQuery;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -99,14 +99,15 @@ public class ContentLookupOperation implements Operation, Receiver
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
error = true;
|
|
||||||
|
|
||||||
/* Set the local node as already asked */
|
/* Set the local node as already asked */
|
||||||
nodes.put(this.localNode, ASKED);
|
nodes.put(this.localNode, ASKED);
|
||||||
|
|
||||||
this.addNodes(this.localNode.getRoutingTable().getAllNodes());
|
this.addNodes(this.localNode.getRoutingTable().getAllNodes());
|
||||||
|
|
||||||
/* If we haven't finished as yet, wait for a maximum of config.operationTimeout() time */
|
/**
|
||||||
|
* If we haven't found the requested amount of content as yet,
|
||||||
|
* keey trying until config.operationTimeout() time has expired
|
||||||
|
*/
|
||||||
int totalTimeWaited = 0;
|
int totalTimeWaited = 0;
|
||||||
int timeInterval = 100; // We re-check every 300 milliseconds
|
int timeInterval = 100; // We re-check every 300 milliseconds
|
||||||
while (totalTimeWaited < this.config.operationTimeout())
|
while (totalTimeWaited < this.config.operationTimeout())
|
||||||
@ -121,29 +122,6 @@ public class ContentLookupOperation implements Operation, Receiver
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
/* If we still haven't received any responses by then, do a routing timeout */
|
|
||||||
throw new RoutingException("ContentLookupOperation: Lookup Timeout.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated - replaced by the above code
|
|
||||||
* We just keep this code in case any problems are encountered later
|
|
||||||
*/
|
|
||||||
// if (!this.askNodesorFinish())
|
|
||||||
// {
|
|
||||||
// /* If we haven't finished as yet, wait a while */
|
|
||||||
// wait(this.config.operationTimeout());
|
|
||||||
//
|
|
||||||
// /* If we still haven't received any responses by then, do a routing timeout */
|
|
||||||
// if (error)
|
|
||||||
// {
|
|
||||||
// /* Lets not throw any exception */
|
|
||||||
//
|
|
||||||
// //throw new RoutingException("Content Lookup Operation Timeout.");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
{
|
{
|
||||||
@ -274,11 +252,9 @@ public class ContentLookupOperation implements Operation, Receiver
|
|||||||
/*@todo Check if the content matches the given criteria */
|
/*@todo Check if the content matches the given criteria */
|
||||||
this.contentFound.add(content);
|
this.contentFound.add(content);
|
||||||
|
|
||||||
if (this.contentFound.size() == this.numResultsReq)
|
if (this.contentFound.size() == this.numNodesToQuery)
|
||||||
{
|
{
|
||||||
/* We've got all the content required, let's stop the loopup operation */
|
/* We've got all the content required, let's stop the loopup operation */
|
||||||
System.out.println("We good");
|
|
||||||
this.error = false;
|
|
||||||
this.contentsFound = true;
|
this.contentsFound = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user