diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java index cd6d0f37c..14c9f9a3f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java @@ -28,7 +28,7 @@ import net.i2p.util.SimpleTimer; * @since 0.8.4 * @author zzz */ -public class DHTNodes extends ConcurrentHashMap { +class DHTNodes extends ConcurrentHashMap { private final I2PAppContext _context; private long _expireTime; diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/InfoHash.java b/apps/i2psnark/java/src/org/klomp/snark/dht/InfoHash.java index 2b439c6c4..221d79af4 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/InfoHash.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/InfoHash.java @@ -11,7 +11,7 @@ import net.i2p.crypto.SHA1Hash; * @since 0.8.4 * @author zzz */ -public class InfoHash extends SHA1Hash { +class InfoHash extends SHA1Hash { public InfoHash(byte[] data) { super(data); diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java index e0608df4e..c4190bd3b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java @@ -127,6 +127,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { private static final long MAX_NODEINFO_AGE = 60*60*1000; /** how long since generated do we delete - BEP 5 says 10 minutes */ private static final long MAX_TOKEN_AGE = 60*60*1000; + private static final long MAX_INBOUND_TOKEN_AGE = MAX_TOKEN_AGE - 5*60*1000; /** how long since sent do we wait for a reply */ private static final long MAX_MSGID_AGE = 2*60*1000; /** how long since sent do we wait for a reply */ @@ -679,6 +680,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { // TODO sendQuery with onReply / onTimeout args /** + * Blocking if repliable and we must lookup b32 * @param repliable true for all but announce * @return null on error */ @@ -691,11 +693,19 @@ public class KRPC implements I2PSessionMuxedListener, DHT { NodeInfo newInfo = _knownNodes.get(nInfo.getNID()); if (newInfo != null && newInfo.getDestination() != null) { nInfo = newInfo; - } else { - // lookup b32? + } else if (!repliable) { + // Don't lookup for announce query, we should already have it if (_log.shouldLog(Log.WARN)) - _log.warn("No destination for: " + nInfo); + _log.warn("Dropping non-repliable query, no dest for " + nInfo); return null; + } else { + // Lookup the dest for the hash + // TODO spin off into thread or queue? We really don't want to block here + if (!lookupDest(nInfo)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Dropping repliable query, no dest for " + nInfo); + return null; + } } } map.put("y", "q"); @@ -734,7 +744,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { } else { // lookup b32? if (_log.shouldLog(Log.WARN)) - _log.warn("No destination for: " + nInfo); + _log.warn("Dropping response, no dest for " + nInfo); return false; } } @@ -763,7 +773,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { } else { // lookup b32? if (_log.shouldLog(Log.WARN)) - _log.warn("No destination for: " + nInfo); + _log.warn("Dropping sendError, no dest for " + nInfo); return false; } } @@ -772,6 +782,32 @@ public class KRPC implements I2PSessionMuxedListener, DHT { return sendMessage(nInfo.getDestination(), nInfo.getPort() + 1, map, false); } + /** + * Get the dest for a NodeInfo lacking it, and store it there. + * Blocking. + * @return success + */ + private boolean lookupDest(NodeInfo nInfo) { + if (_log.shouldLog(Log.INFO)) + _log.info("looking up dest for " + nInfo); + try { + // use a short timeout for now + Destination dest = _session.lookupDest(nInfo.getHash(), 5*1000); + if (dest != null) { + nInfo.setDestination(dest); + if (_log.shouldLog(Log.INFO)) + _log.info("lookup success for " + nInfo); + return true; + } + } catch (I2PSessionException ise) { + if (_log.shouldLog(Log.WARN)) + _log.warn("lookup fail", ise); + } + if (_log.shouldLog(Log.INFO)) + _log.info("lookup fail for " + nInfo); + return false; + } + /** * Lowest-level send message call. * @param repliable true for all but announce @@ -1345,7 +1381,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { } for (Iterator iter = _incomingTokens.values().iterator(); iter.hasNext(); ) { Token tok = iter.next(); - if (tok.lastSeen() < now - MAX_TOKEN_AGE) + if (tok.lastSeen() < now - MAX_INBOUND_TOKEN_AGE) iter.remove(); } // TODO sent queries? diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/MsgID.java b/apps/i2psnark/java/src/org/klomp/snark/dht/MsgID.java index 94b37a690..6d53f7c8f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/MsgID.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/MsgID.java @@ -12,7 +12,7 @@ import net.i2p.data.ByteArray; * @since 0.8.4 * @author zzz */ -public class MsgID extends ByteArray { +class MsgID extends ByteArray { private static final int MY_TOK_LEN = 8; diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/NID.java b/apps/i2psnark/java/src/org/klomp/snark/dht/NID.java index 3d0d0a496..87407720b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/NID.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/NID.java @@ -11,7 +11,7 @@ import net.i2p.crypto.SHA1Hash; * @since 0.8.4 * @author zzz */ -public class NID extends SHA1Hash { +class NID extends SHA1Hash { public NID(byte[] data) { super(data); diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java b/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java index 7c74a506e..1d82b268a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java @@ -21,7 +21,7 @@ import net.i2p.data.SimpleDataStructure; * @author zzz */ -public class NodeInfo extends SimpleDataStructure { +class NodeInfo extends SimpleDataStructure { private long lastSeen; private NID nID; diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/dht/Peer.java index 8943c06b5..84fc263a7 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/Peer.java @@ -12,7 +12,7 @@ import net.i2p.data.Hash; * @since 0.8.4 * @author zzz */ -public class Peer extends Hash { +class Peer extends Hash { private long lastSeen; diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/Peers.java b/apps/i2psnark/java/src/org/klomp/snark/dht/Peers.java index 2a2452e95..f16d903ec 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/Peers.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/Peers.java @@ -13,7 +13,7 @@ import net.i2p.data.Hash; * @since 0.8.4 * @author zzz */ -public class Peers extends ConcurrentHashMap { +class Peers extends ConcurrentHashMap { public Peers() { super(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/Token.java b/apps/i2psnark/java/src/org/klomp/snark/dht/Token.java index 46b3e1097..37a43575d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/Token.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/Token.java @@ -15,7 +15,7 @@ import net.i2p.data.DataHelper; * @since 0.8.4 * @author zzz */ -public class Token extends ByteArray { +class Token extends ByteArray { private static final int MY_TOK_LEN = 8; private final long lastSeen; diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/TokenKey.java b/apps/i2psnark/java/src/org/klomp/snark/dht/TokenKey.java index d2217a015..996d43351 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/TokenKey.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/TokenKey.java @@ -12,7 +12,7 @@ import net.i2p.data.DataHelper; * @since 0.8.4 * @author zzz */ -public class TokenKey extends SHA1Hash { +class TokenKey extends SHA1Hash { public TokenKey(NID nID, InfoHash ih) { super(DataHelper.xor(nID.getData(), ih.getData())); diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/Torrents.java b/apps/i2psnark/java/src/org/klomp/snark/dht/Torrents.java index c791e7077..304b7c949 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/Torrents.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/Torrents.java @@ -11,7 +11,7 @@ import java.util.concurrent.ConcurrentHashMap; * @since 0.8.4 * @author zzz */ -public class Torrents extends ConcurrentHashMap { +class Torrents extends ConcurrentHashMap { public Torrents() { super();