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:
Joshua Kissoon 2014-04-19 15:09:07 +05:30
parent 8e6052de23
commit 6503c79681
3 changed files with 29 additions and 46 deletions

View File

@ -274,30 +274,32 @@ public class Kademlia
* Get some content stored on the DHT
* 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 numResultsReq How many results are required from different nodes
* @param param The parameters used to search for the content
* @param numNodesToQuery How many nodes should we query to get this content. We return all content on these nodes.
*
* @return DHTContent The content
*
* @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 the content exist in our own DHT, then return it. */
contentFound = new ArrayList<>();
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 */
ContentLookupOperation clo = new ContentLookupOperation(server, localNode, param, numResultsReq, this.config);
clo.execute();
contentFound = clo.getContentFound();
return contentFound;
}
/* 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;
}

View File

@ -47,7 +47,7 @@ public class StorageEntryMetadata
{
return this.contentHash;
}
public long getLastUpdatedTimestamp()
{
return this.updatedTs;
@ -76,7 +76,12 @@ public class StorageEntryMetadata
}
/* 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

View File

@ -43,7 +43,7 @@ public class ContentLookupOperation implements Operation, Receiver
private final Node localNode;
private final GetParameter params;
private final List<StorageEntry> contentFound;
private final int numResultsReq;
private final int numNodesToQuery;
private final KadConfiguration config;
private final ContentLookupMessage lookupMessage;
@ -67,11 +67,11 @@ public class ContentLookupOperation implements Operation, Receiver
/**
* @param server
* @param localNode
* @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 params The parameters to search for the content which we need to find
* @param numNodesToQuery The number of nodes to query to get this content. We return the content among these nodes.
* @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 */
this.lookupMessage = new ContentLookupMessage(localNode, params);
@ -79,7 +79,7 @@ public class ContentLookupOperation implements Operation, Receiver
this.server = server;
this.localNode = localNode;
this.params = params;
this.numResultsReq = numResultsReq;
this.numNodesToQuery = numNodesToQuery;
this.config = config;
/**
@ -99,14 +99,15 @@ public class ContentLookupOperation implements Operation, Receiver
{
try
{
error = true;
/* Set the local node as already asked */
nodes.put(this.localNode, ASKED);
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 timeInterval = 100; // We re-check every 300 milliseconds
while (totalTimeWaited < this.config.operationTimeout())
@ -121,29 +122,6 @@ public class ContentLookupOperation implements Operation, Receiver
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)
{
@ -274,11 +252,9 @@ public class ContentLookupOperation implements Operation, Receiver
/*@todo Check if the content matches the given criteria */
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 */
System.out.println("We good");
this.error = false;
this.contentsFound = true;
}
}