Changeset 78203aac


Ignore:
Timestamp:
Sep 7, 2012 8:10:01 PM (8 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
489f4352
Parents:
3c95f0b6
Message:
  • i2psnark:
    • Implement blacklist for unreachable DHT peers
    • Reduce threshold for unreachable
    • Log tweaks
Location:
apps/i2psnark/java/src/org/klomp/snark/dht
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java

    r3c95f0b6 r78203aac  
    3939import net.i2p.data.Hash;
    4040import net.i2p.data.SimpleDataStructure;
     41import net.i2p.util.ConcurrentHashSet;
    4142import net.i2p.util.I2PAppThread;
    4243import net.i2p.util.Log;
     
    9899    /** index to incoming opaque tokens, received in a peers or nodes reply */
    99100    private final ConcurrentHashMap<NID, Token> _incomingTokens;
     101    /** recently unreachable, with lastSeen() as the added-to-blacklist time  */
     102    private final Set<NID> _blacklist;
    100103
    101104    /** hook to inject and receive datagrams */
     
    148151    private static final long CLEAN_TIME = 63*1000;
    149152    private static final long EXPLORE_TIME = 877*1000;
     153    private static final long BLACKLIST_CLEAN_TIME = 17*60*1000;
    150154    private static final String DHT_FILE = "i2psnark.dht.dat";
    151155
     
    162166        _outgoingTokens = new ConcurrentHashMap();
    163167        _incomingTokens = new ConcurrentHashMap();
     168        _blacklist = new ConcurrentHashSet();
    164169
    165170        // Construct my NodeInfo
     
    263268            int replyType = waiter.getReplyCode();
    264269            if (replyType == REPLY_NONE) {
    265                  if (_log.shouldLog(Log.INFO))
    266                      _log.info("Got no reply");
     270                 if (_log.shouldLog(Log.DEBUG))
     271                     _log.debug("Got no reply");
    267272            } else if (replyType == REPLY_NODES) {
    268273                 List<NodeInfo> reply = (List<NodeInfo>) waiter.getReplyObject();
    269274                 // It seems like we are just going to get back ourselves all the time
    270                  if (_log.shouldLog(Log.INFO))
    271                      _log.info("Got " + reply.size() + " nodes");
     275                 if (_log.shouldLog(Log.DEBUG))
     276                     _log.debug("Got " + reply.size() + " nodes");
    272277                 for (NodeInfo ni : reply) {
    273278                     if (! (ni.equals(_myNodeInfo) || (toTry.contains(ni) && tried.contains(ni))))
     
    349354            int replyType = waiter.getReplyCode();
    350355            if (replyType == REPLY_NONE) {
    351                  if (_log.shouldLog(Log.INFO))
    352                      _log.info("Got no reply");
     356                 if (_log.shouldLog(Log.DEBUG))
     357                     _log.debug("Got no reply");
    353358            } else if (replyType == REPLY_PONG) {
    354                  if (_log.shouldLog(Log.INFO))
    355                      _log.info("Got pong");
     359                 if (_log.shouldLog(Log.DEBUG))
     360                     _log.debug("Got pong");
    356361            } else if (replyType == REPLY_PEERS) {
    357                  if (_log.shouldLog(Log.INFO))
    358                      _log.info("Got peers");
     362                 if (_log.shouldLog(Log.DEBUG))
     363                     _log.debug("Got peers");
    359364                 List<Hash> reply = (List<Hash>) waiter.getReplyObject();
    360365                 if (!reply.isEmpty()) {
     
    368373            } else if (replyType == REPLY_NODES) {
    369374                 List<NodeInfo> reply = (List<NodeInfo>) waiter.getReplyObject();
    370                  if (_log.shouldLog(Log.INFO))
    371                      _log.info("Got " + reply.size() + " nodes");
     375                 if (_log.shouldLog(Log.DEBUG))
     376                     _log.debug("Got " + reply.size() + " nodes");
    372377                 for (NodeInfo ni : reply) {
    373378                     if (! (ni.equals(_myNodeInfo) || tried.contains(ni) || toTry.contains(ni)))
     
    577582        _outgoingTokens.clear();
    578583        _incomingTokens.clear();
     584        _blacklist.clear();
    579585    }
    580586
     
    593599    public String renderStatusHTML() {
    594600        long uptime = Math.max(1000, _context.clock().now() - _started);
    595         StringBuilder buf = new StringBuilder();
     601        StringBuilder buf = new StringBuilder(256);
    596602        buf.append("<br><b>DHT DEBUG</b><br>TX: ").append(_txPkts.get()).append(" pkts / ")
    597603           .append(DataHelper.formatSize2(_txBytes.get())).append("B / ")
     
    601607           .append(DataHelper.formatSize2(_rxBytes.get() * 1000 / uptime)).append("Bps<br>" +
    602608                   "DHT Peers: ").append( _knownNodes.size()).append("<br>" +
     609                   "Blacklisted: ").append(_blacklist.size()).append("<br>" +
    603610                   "Sent tokens: ").append(_outgoingTokens.size()).append("<br>" +
    604611                   "Rcvd tokens: ").append(_incomingTokens.size()).append("<br>" +
     
    10801087                oldInfo.setDestination(nInfo.getDestination());
    10811088        }
    1082         oldInfo.getNID().setLastSeen();
     1089        nID = oldInfo.getNID();
     1090        nID.setLastSeen();
     1091        if (_blacklist.remove(nID)) {
     1092            if (_log.shouldLog(Log.INFO))
     1093                _log.info("UN-blacklisted: " + nID);
     1094        }
    10831095        return oldInfo;
    10841096    }
     
    11091121                if (_log.shouldLog(Log.INFO))
    11101122                    _log.info("Removed after consecutive timeouts: " + nInfo);
     1123            }
     1124            if (!_blacklist.contains(nid)) {
     1125                // used as when-added time
     1126                nid.setLastSeen();
     1127                _blacklist.add(nid);
     1128                if (_log.shouldLog(Log.INFO))
     1129                    _log.info("Blacklisted: " + nid);
    11111130            }
    11121131        }
     
    12241243                Token token = new Token(_context, tok);
    12251244                _incomingTokens.put(nInfo.getNID(), token);
    1226                 if (_log.shouldLog(Log.INFO))
    1227                     _log.info("Got token: " + token + ", must be a response to get_peers");
     1245                if (_log.shouldLog(Log.DEBUG))
     1246                    _log.debug("Got token: " + token + ", must be a response to get_peers");
    12281247            } else {
    1229                 if (_log.shouldLog(Log.INFO))
    1230                     _log.info("No token and saved infohash, must be a response to find_node");
     1248                if (_log.shouldLog(Log.DEBUG))
     1249                    _log.debug("No token and saved infohash, must be a response to find_node");
    12311250            }
    12321251        }
     
    12601279        for (int off = 0; off < ids.length; off += NodeInfo.LENGTH) {
    12611280            NodeInfo nInf = new NodeInfo(ids, off);
     1281            if (_blacklist.contains(nInf.getNID())) {
     1282                if (_log.shouldLog(Log.INFO))
     1283                    _log.info("Ignoring blacklisted " + nInf.getNID() + " from: " + nInfo);
     1284                continue;
     1285            }
    12621286            nInf = heardAbout(nInf);
    12631287            rv.add(nInf);
     
    15021526            if (_log.shouldLog(Log.DEBUG))
    15031527                _log.debug("KRPC cleaner starting with " +
     1528                          _blacklist.size() + " in blacklist, " +
    15041529                          _outgoingTokens.size() + " sent Tokens, " +
    15051530                          _incomingTokens.size() + " rcvd Tokens");
     
    15141539                    iter.remove();
    15151540            }
     1541            for (Iterator<NID> iter = _blacklist.iterator(); iter.hasNext(); ) {
     1542                NID nid = iter.next();
     1543                // lastSeen() is actually when-added
     1544                if (now > nid.lastSeen() + BLACKLIST_CLEAN_TIME)
     1545                    iter.remove();
     1546            }
    15161547            // TODO sent queries?
    15171548            if (_log.shouldLog(Log.DEBUG))
    15181549                _log.debug("KRPC cleaner done, now with " +
     1550                          _blacklist.size() + " in blacklist, " +
    15191551                          _outgoingTokens.size() + " sent Tokens, " +
    15201552                          _incomingTokens.size() + " rcvd Tokens, " +
  • apps/i2psnark/java/src/org/klomp/snark/dht/NID.java

    r3c95f0b6 r78203aac  
    1919    private int fails;
    2020
    21     private static final int MAX_FAILS = 3;
     21    private static final int MAX_FAILS = 2;
    2222
    2323    public NID() {
     
    4242     */
    4343    public boolean timeout() {
    44         return fails++ > MAX_FAILS;
     44        return ++fails > MAX_FAILS;
    4545    }
    4646}
Note: See TracChangeset for help on using the changeset viewer.