Changeset 6bb156a4


Ignore:
Timestamp:
Nov 6, 2015 7:01:44 PM (5 years ago)
Author:
zab2 <zab2@…>
Branches:
master
Children:
ca4642e
Parents:
1909034
Message:

Do not expose ISJ lock

File:
1 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/networkdb/kademlia/IterativeSearchJob.java

    r1909034 r6bb156a4  
    188188            }
    189189        }
    190         _toTry.addAll(floodfillPeers);
    191         // don't ask ourselves or the target
    192         _toTry.remove(getContext().routerHash());
    193         _toTry.remove(_key);
    194         if (_toTry.isEmpty()) {
     190        final boolean empty;
     191        synchronized(this) {
     192            _toTry.addAll(floodfillPeers);
     193            // don't ask ourselves or the target
     194            _toTry.remove(getContext().routerHash());
     195            _toTry.remove(_key);
     196            empty = _toTry.isEmpty();
     197        }
     198        if (empty) {
    195199            if (_log.shouldLog(Log.WARN))
    196200                _log.warn(getJobId() + ": ISJ for " + _key + " had no peers to send to");
     
    228232        while (true) {
    229233            Hash peer;
     234            final int done, pend;
    230235            synchronized (this) {
    231236                if (_dead) return;
    232                 int pend = _unheardFrom.size();
     237                pend = _unheardFrom.size();
    233238                if (pend >= MAX_CONCURRENT)
    234239                    return;
    235                 int done = _failedPeers.size();
    236                 if (done >= _totalSearchLimit) {
    237                     failed();
    238                     return;
    239                 }
    240                 // even if pend and todo are empty, we don't fail, as there may be more peers
    241                 // coming via newPeerToTry()
    242                 if (done + pend >= _totalSearchLimit)
    243                     return;
     240                done = _failedPeers.size();
     241            }
     242            if (done >= _totalSearchLimit) {
     243                failed();
     244                return;
     245            }
     246            // even if pend and todo are empty, we don't fail, as there may be more peers
     247            // coming via newPeerToTry()
     248            if (done + pend >= _totalSearchLimit)
     249                return;
     250            synchronized(this) {
    244251                if (_alwaysQueryHash != null &&
    245                     !_unheardFrom.contains(_alwaysQueryHash) &&
    246                     !_failedPeers.contains(_alwaysQueryHash)) {
     252                        !_unheardFrom.contains(_alwaysQueryHash) &&
     253                        !_failedPeers.contains(_alwaysQueryHash)) {
    247254                    // For testing or local networks... we will
    248255                    // pretend that the specified router is floodfill, and always closest-to-the-key.
     
    514521        getContext().messageRegistry().unregisterPending(_out);
    515522        int tries;
     523        final List<Hash> unheard;
    516524        synchronized(this) {
    517525            tries = _unheardFrom.size() + _failedPeers.size();
    518             // blame the unheard-from (others already blamed in failed() above)
    519             for (Hash h : _unheardFrom)
    520                 getContext().profileManager().dbLookupFailed(h);
    521         }
     526            unheard = new ArrayList<Hash>(_unheardFrom);
     527        }
     528        // blame the unheard-from (others already blamed in failed() above)
     529        for (Hash h : unheard)
     530            getContext().profileManager().dbLookupFailed(h);
    522531        long time = System.currentTimeMillis() - _created;
    523532        if (_log.shouldLog(Log.INFO)) {
Note: See TracChangeset for help on using the changeset viewer.