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 * 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;
} }

View File

@ -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

View File

@ -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;
} }
} }