package net.i2p.router.networkdb.kademlia;
import net.i2p.data.Hash;
import net.i2p.data.router.RouterInfo;
import net.i2p.data.i2np.DatabaseSearchReplyMessage;
import net.i2p.router.JobImpl;
import net.i2p.router.RouterContext;
//import net.i2p.util.Log;
/**
* Ask the peer who sent us the DSRM for the RouterInfos...
*
* ... but If we have the routerInfo already, try to refetch it from that router itself,
* (if the info is old or we don't think it is floodfill)
* which will help us establish that router as a good floodfill and speed our
* integration into the network.
*
* A simple version of SearchReplyJob in SearchJob.java.
* Skip the profile updates - this should be rare.
*
*/
class SingleLookupJob extends JobImpl {
//private final Log _log;
private final DatabaseSearchReplyMessage _dsrm;
/**
* I2NP spec allows 255, max actually sent (in ../HDLMJ) is 3,
* so just to prevent trouble, we don't want to queue 255 jobs at once
*/
public static final int MAX_TO_FOLLOW = 8;
public SingleLookupJob(RouterContext ctx, DatabaseSearchReplyMessage dsrm) {
super(ctx);
//_log = ctx.logManager().getLog(getClass());
_dsrm = dsrm;
}
public void runJob() {
Hash from = _dsrm.getFromHash();
int limit = Math.min(_dsrm.getNumReplies(), MAX_TO_FOLLOW);
for (int i = 0; i < limit; i++) {
Hash peer = _dsrm.getReply(i);
if (peer.equals(getContext().routerHash())) // us
continue;
if (peer.equals(from)) // unusual?
continue;
RouterInfo ri = getContext().netDb().lookupRouterInfoLocally(peer);
if (ri == null)
getContext().jobQueue().addJob(new SingleSearchJob(getContext(), peer, from));
else if (ri.getPublished() < getContext().clock().now() - 60*60*1000 ||
!FloodfillNetworkDatabaseFacade.isFloodfill(ri))
getContext().jobQueue().addJob(new SingleSearchJob(getContext(), peer, peer));
}
}
public String getName() { return "NetDb process DSRM"; }
}