Changeset 3d33524


Ignore:
Timestamp:
Sep 2, 2011 5:25:26 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
454c7f1
Parents:
b2263ef
Message:
  • NetDB: Hopefully fix ISJ deadlock, thx dream
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • history.txt

    rb2263ef r3d33524  
     12011-09-02 zzz
     2  * Console: Cache user-agent processing
     3  * NetDB: Hopefully fix ISJ deadlock, thx dream
     4
    152011-09-02 sponge
    26  * I2PSnark: Fix GUI html tag for adding a torrent, it was missing a space.
  • router/java/src/net/i2p/router/RouterVersion.java

    rb2263ef r3d33524  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 8;
     21    public final static long BUILD = 9;
    2222
    2323    /** for example "-test" */
  • router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java

    rb2263ef r3d33524  
    222222        _facade.complete(_key);
    223223        getContext().statManager().addRateData("netDb.failedTime", time, 0);
    224         synchronized (_onFailed) {
    225             for (int i = 0; i < _onFailed.size(); i++) {
    226                 Job j = _onFailed.remove(0);
    227                 getContext().jobQueue().addJob(j);
    228             }
    229         }
     224        for (Job j : _onFailed) {
     225            getContext().jobQueue().addJob(j);
     226        }
     227        _onFailed.clear();
    230228    }
    231229
     
    255253        _facade.complete(_key);
    256254        getContext().statManager().addRateData("netDb.successTime", time, 0);
    257         synchronized (_onFind) {
    258             while (!_onFind.isEmpty())
    259                 getContext().jobQueue().addJob(_onFind.remove(0));
     255        for (Job j : _onFind) {
     256            getContext().jobQueue().addJob(j);
    260257        }
    261258    }
  • router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java

    rb2263ef r3d33524  
    11package net.i2p.router.networkdb.kademlia;
    22
    3 import java.util.ArrayList;
    43import java.util.List;
     4import java.util.concurrent.CopyOnWriteArrayList;
    55
    66import net.i2p.data.Hash;
     
    4242    protected final long _created;
    4343
     44    /**
     45     *  @param onFind may be null
     46     *  @param onFailed may be null
     47     */
    4448    public FloodSearchJob(RouterContext ctx, FloodfillNetworkDatabaseFacade facade, Hash key, Job onFind, Job onFailed, int timeoutMs, boolean isLease) {
    4549        super(ctx);
     
    4751        _facade = facade;
    4852        _key = key;
    49         _onFind = new ArrayList(4);
    50         _onFind.add(onFind);
    51         _onFailed = new ArrayList(4);
    52         _onFailed.add(onFailed);
     53        _onFind = new CopyOnWriteArrayList();
     54        if (onFind != null)
     55            _onFind.add(onFind);
     56        _onFailed = new CopyOnWriteArrayList();
     57        if (onFailed != null)
     58            _onFailed.add(onFailed);
    5359        int timeout = timeoutMs / FLOOD_SEARCH_TIME_FACTOR;
    5460        if (timeout < timeoutMs)
     
    6571    /**
    6672     *  Add jobs to an existing search
     73     *  @param onFind may be null
     74     *  @param onFailed may be null
     75     *  @param timeoutMs ignored
     76     *  @param isLease ignored
    6777     */
    6878    void addDeferred(Job onFind, Job onFailed, long timeoutMs, boolean isLease) {
    69         if (_dead) {
    70             getContext().jobQueue().addJob(onFailed);
    71         } else {
    72             if (onFind != null) synchronized (_onFind) { _onFind.add(onFind); }
    73             if (onFailed != null) synchronized (_onFailed) { _onFailed.add(onFailed); }
    74         }
     79        synchronized (this) {
     80            if (!_dead) {
     81                if (onFind != null)
     82                    _onFind.add(onFind);
     83                if (onFailed != null)
     84                    _onFailed.add(onFailed);
     85                return;
     86            }
     87        }
     88        // outside synch to avoid deadlock with job queue
     89        getContext().jobQueue().addJob(onFailed);
    7590    }
    7691
  • router/java/src/net/i2p/router/networkdb/kademlia/IterativeSearchJob.java

    rb2263ef r3d33524  
    321321        getContext().statManager().addRateData("netDb.failedTime", time, 0);
    322322        getContext().statManager().addRateData("netDb.retries", Math.max(0, tries - 1), 0);
    323         synchronized (_onFailed) {
    324             for (int i = 0; i < _onFailed.size(); i++) {
    325                 Job j = _onFailed.remove(0);
    326                 getContext().jobQueue().addJob(j);
    327             }
    328         }
     323        for (Job j : _onFailed) {
     324            getContext().jobQueue().addJob(j);
     325        }
     326        _onFailed.clear();
    329327    }
    330328
     
    357355        getContext().statManager().addRateData("netDb.successTime", time, 0);
    358356        getContext().statManager().addRateData("netDb.retries", tries - 1, 0);
    359         synchronized (_onFind) {
    360             while (!_onFind.isEmpty())
    361                 getContext().jobQueue().addJob(_onFind.remove(0));
    362         }
     357        for (Job j : _onFind) {
     358            getContext().jobQueue().addJob(j);
     359        }
     360        _onFind.clear();
    363361    }
    364362}
Note: See TracChangeset for help on using the changeset viewer.