Changeset ff0023a


Ignore:
Timestamp:
May 16, 2004 4:54:50 AM (17 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
6003b29
Parents:
8c6bf5a
git-author:
jrandom <jrandom> (05/16/04 04:54:50)
git-committer:
zzz <zzz@…> (05/16/04 04:54:50)
Message:

big ol' memory, cpu usage, and shutdown handling update. main changes include:

  • rather than have all jobs created hooked into the clock for offset updates, have the jobQueue stay hooked up and update any active jobs accordingly (killing a memory leak of a JobTiming? objects - one per job)
  • dont go totally insane during shutdown and log like mad (though the clientApp things still log like mad, since they don't know the router is going down)
  • adjust memory buffer sizes based on real world values so we don't have to expand/contract a lot
  • dont display things that are completely useless (who cares what the first 32 bytes of a public key are?)
  • reduce temporary object creation
  • use more efficient collections at times
  • on shutdown, log some state information (ready/timed jobs, pending messages, etc)
  • explicit GC every 10 jobs. yeah, not efficient, but just for now we'll keep 'er in there
  • only reread the router config file if it changes (duh)
Files:
32 edited

Legend:

Unmodified
Added
Removed
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java

    r8c6bf5a rff0023a  
    122122            ex.printStackTrace();
    123123            _log.debug("Error forwarding", ex);
     124        } catch (Exception e) {
     125            _log.error("Internal error", e);
    124126        } finally {
    125127            try {
  • apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java

    r8c6bf5a rff0023a  
    77
    88    public ByteCollector() {
    9         contents = new byte[80];
     9        contents = new byte[1024];
    1010        size = 0;
    1111    }
  • core/java/src/net/i2p/data/PrivateKey.java

    r8c6bf5a rff0023a  
    7070        } else {
    7171            buf.append("size: ").append(_data.length);
    72             int len = 32;
    73             if (len > _data.length) len = _data.length;
    74             buf.append(" first ").append(len).append(" bytes: ");
    75             buf.append(DataHelper.toString(_data, len));
     72            //int len = 32;
     73            //if (len > _data.length) len = _data.length;
     74            //buf.append(" first ").append(len).append(" bytes: ");
     75            //buf.append(DataHelper.toString(_data, len));
    7676        }
    7777        buf.append("]");
  • core/java/src/net/i2p/data/PublicKey.java

    r8c6bf5a rff0023a  
    6969        } else {
    7070            buf.append("size: ").append(_data.length);
    71             int len = 32;
    72             if (len > _data.length) len = _data.length;
    73             buf.append(" first ").append(len).append(" bytes: ");
    74             buf.append(DataHelper.toString(_data, len));
     71            //int len = 32;
     72            //if (len > _data.length) len = _data.length;
     73            //buf.append(" first ").append(len).append(" bytes: ");
     74            //buf.append(DataHelper.toString(_data, len));
    7575        }
    7676        buf.append("]");
  • core/java/src/net/i2p/data/RouterInfo.java

    r8c6bf5a rff0023a  
    423423    public String toString() {
    424424        if (_stringified != null) return _stringified;
    425         StringBuffer buf = new StringBuffer(128);
     425        StringBuffer buf = new StringBuffer(5*1024);
    426426        buf.append("[RouterInfo: ");
    427427        buf.append("\n\tIdentity: ").append(getIdentity());
  • core/java/src/net/i2p/data/SessionKey.java

    r8c6bf5a rff0023a  
    6868        } else {
    6969            buf.append("size: ").append(_data.length);
    70             int len = 32;
    71             if (len > _data.length) len = _data.length;
    72             buf.append(" first ").append(len).append(" bytes: ");
    73             buf.append(DataHelper.toString(_data, len));
     70            //int len = 32;
     71            //if (len > _data.length) len = _data.length;
     72            //buf.append(" first ").append(len).append(" bytes: ");
     73            //buf.append(DataHelper.toString(_data, len));
    7474        }
    7575        buf.append("]");
  • core/java/src/net/i2p/data/Signature.java

    r8c6bf5a rff0023a  
    7474        } else {
    7575            buf.append("size: ").append(_data.length);
    76             int len = 32;
    77             if (len > _data.length) len = _data.length;
    78             buf.append(" first ").append(len).append(" bytes: ");
    79             buf.append(DataHelper.toString(_data, len));
     76            //int len = 32;
     77            //if (len > _data.length) len = _data.length;
     78            //buf.append(" first ").append(len).append(" bytes: ");
     79            //buf.append(DataHelper.toString(_data, len));
    8080        }
    8181        buf.append("]");
  • core/java/src/net/i2p/data/SigningPrivateKey.java

    r8c6bf5a rff0023a  
    7070        } else {
    7171            buf.append("size: ").append(_data.length);
    72             int len = 32;
    73             if (len > _data.length) len = _data.length;
    74             buf.append(" first ").append(len).append(" bytes: ");
    75             buf.append(DataHelper.toString(_data, len));
     72            //int len = 32;
     73            //if (len > _data.length) len = _data.length;
     74            //buf.append(" first ").append(len).append(" bytes: ");
     75            //buf.append(DataHelper.toString(_data, len));
    7676        }
    7777        buf.append("]");
  • core/java/src/net/i2p/data/SigningPublicKey.java

    r8c6bf5a rff0023a  
    7070        } else {
    7171            buf.append("size: ").append(_data.length);
    72             int len = 32;
    73             if (len > _data.length) len = _data.length;
    74             buf.append(" first ").append(len).append(" bytes: ");
    75             buf.append(DataHelper.toString(_data, len));
     72            //int len = 32;
     73            //if (len > _data.length) len = _data.length;
     74            //buf.append(" first ").append(len).append(" bytes: ");
     75            //buf.append(DataHelper.toString(_data, len));
    7676        }
    7777        buf.append("]");
  • core/java/src/net/i2p/stat/Rate.java

    r8c6bf5a rff0023a  
    351351
    352352    public void store(OutputStream out, String prefix) throws IOException {
    353         StringBuffer buf = new StringBuffer(2048);
     353        StringBuffer buf = new StringBuffer(16*1048);
    354354        PersistenceHelper.add(buf, prefix, ".period", "Number of milliseconds in the period", _period);
    355355        PersistenceHelper.add(buf, prefix, ".creationDate",
  • core/java/src/net/i2p/stat/RateStat.java

    r8c6bf5a rff0023a  
    7777
    7878    public String toString() {
    79         StringBuffer buf = new StringBuffer(512);
     79        StringBuffer buf = new StringBuffer(4096);
    8080        buf.append(getGroupName()).append('.').append(getName()).append(": ").append(getDescription()).append('\n');
    8181        long periods[] = getPeriods();
     
    104104
    105105    public void store(OutputStream out, String prefix) throws IOException {
    106         StringBuffer buf = new StringBuffer(128);
     106        StringBuffer buf = new StringBuffer(1024);
    107107        buf.append(NL);
    108108        buf.append("################################################################################").append(NL);
     
    113113        buf = null;
    114114        for (int i = 0; i < _rates.length; i++) {
    115             StringBuffer rbuf = new StringBuffer(256);
     115            StringBuffer rbuf = new StringBuffer(1024);
    116116            rbuf.append("#######").append(NL);
    117117            rbuf.append("# Period : ").append(DataHelper.formatDuration(_rates[i].getPeriod())).append(" for rate ")
  • core/java/src/net/i2p/stat/StatManager.java

    r8c6bf5a rff0023a  
    8181
    8282    public void coallesceStats() {
    83         for (Iterator iter = getFrequencyNames().iterator(); iter.hasNext();) {
    84             String name = (String) iter.next();
    85             FrequencyStat stat = getFrequency(name);
    86             if (stat != null) {
    87                 stat.coallesceStats();
     83        synchronized (_frequencyStats) {
     84            for (Iterator iter = _frequencyStats.values().iterator(); iter.hasNext();) {
     85                FrequencyStat stat = (FrequencyStat)iter.next();
     86                if (stat != null) {
     87                    stat.coallesceStats();
     88                }
    8889            }
    8990        }
    90         for (Iterator iter = getRateNames().iterator(); iter.hasNext();) {
    91             String name = (String) iter.next();
    92             RateStat stat = getRate(name);
    93             if (stat != null) {
    94                 stat.coallesceStats();
     91        synchronized (_rateStats) {
     92            for (Iterator iter = _rateStats.values().iterator(); iter.hasNext();) {
     93                RateStat stat = (RateStat)iter.next();
     94                if (stat != null) {
     95                    stat.coallesceStats();
     96                }
    9597            }
    9698        }
     
    106108
    107109    public Set getFrequencyNames() {
    108         return Collections.unmodifiableSet(new HashSet(_frequencyStats.keySet()));
     110        return new HashSet(_frequencyStats.keySet());
    109111    }
    110112
    111113    public Set getRateNames() {
    112         return Collections.unmodifiableSet(new HashSet(_rateStats.keySet()));
     114        return new HashSet(_rateStats.keySet());
    113115    }
    114116
  • core/java/src/net/i2p/util/LogManager.java

    r8c6bf5a rff0023a  
    1919import java.util.List;
    2020import java.util.Properties;
    21 import java.util.Set;
     21import java.util.ArrayList;
    2222import java.util.Map;
    2323import java.util.HashMap;
     
    6969    private String _location;
    7070    private List _records;
    71     private Set _limits;
     71    private List _limits;
    7272    private Map _logs;
    7373    private LogWriter _writer;
     
    8989        _displayOnScreen = true;
    9090        _records = new ArrayList();
    91         _limits = new HashSet();
     91        _limits = new ArrayList(128);
    9292        _logs = new HashMap(128);
    9393        _defaultLimit = Log.DEBUG;
     
    198198
    199199    private void loadConfig() {
    200         Properties p = new Properties();
    201200        File cfgFile = new File(_location);
    202201        if ((_configLastRead > 0) && (_configLastRead >= cfgFile.lastModified())) {
     
    208207                _log.debug("Loading config from " + _location);
    209208        }
     209        Properties p = new Properties();
    210210        FileInputStream fis = null;
    211211        try {
     
    294294                //_log.debug("Limit found for " + name + " as " + val);
    295295                synchronized (_limits) {
    296                     _limits.add(lim);
     296                    if (!_limits.contains(lim))
     297                        _limits.add(lim);
    297298                }
    298299            }
     
    367368
    368369    private List getLimits(Log log) {
    369         ArrayList limits = new ArrayList();
     370        ArrayList limits = new ArrayList(4);
    370371        synchronized (_limits) {
    371             for (Iterator iter = _limits.iterator(); iter.hasNext();) {
    372                 LogLimit limit = (LogLimit) iter.next();
     372            for (int i = 0; i < _limits.size(); i++) {
     373                LogLimit limit = (LogLimit)_limits.get(i);
    373374                if (limit.matches(log)) limits.add(limit);
    374375            }
     
    396397        List vals = null;
    397398        synchronized (_records) {
     399            if (_records.size() <= 0)
     400                return null;
    398401            vals = new ArrayList(_records);
    399402            _records.clear();
     
    432435
    433436    public void shutdown() {
    434         _log.log(Log.CRIT, "Shutting down logger", new Exception("Shutdown"));
     437        _log.log(Log.CRIT, "Shutting down logger");
    435438        _writer.flushRecords();
    436439    }
  • core/java/src/net/i2p/util/LogRecordFormatter.java

    r8c6bf5a rff0023a  
    2828
    2929    public static String formatRecord(LogManager manager, LogRecord rec) {
    30         StringBuffer buf = new StringBuffer();
     30        StringBuffer buf = new StringBuffer(1024);
    3131        char format[] = manager._getFormat();
    3232        for (int i = 0; i < format.length; ++i) {
  • core/java/src/net/i2p/util/LogWriter.java

    r8c6bf5a rff0023a  
    5454        try {
    5555            List records = _manager._removeAll();
     56            if (records == null) return;
    5657            for (int i = 0; i < records.size(); i++) {
    5758                LogRecord rec = (LogRecord) records.get(i);
     
    6566                }
    6667            }
    67             records.clear();
    68             try {
    69                 Thread.sleep(30);
    70             } catch (InterruptedException ie) {
    71             }
    7268        } catch (Throwable t) {
    7369            t.printStackTrace();
     70        } finally {
     71            try { Thread.sleep(100); } catch (InterruptedException ie) {}
    7472        }
    7573        long now = Clock.getInstance().now();
  • router/java/src/net/i2p/data/i2np/TunnelMessage.java

    r8c6bf5a rff0023a  
    9090            throw new I2NPMessageException("Not enough data to write out");
    9191       
    92         ByteArrayOutputStream os = new ByteArrayOutputStream(32);
     92        ByteArrayOutputStream os = new ByteArrayOutputStream(4096);
    9393        try {
    9494            _tunnelId.writeBytes(os);
  • router/java/src/net/i2p/router/JobImpl.java

    r8c6bf5a rff0023a  
    1010
    1111import net.i2p.util.Clock;
     12import net.i2p.util.Log;
    1213/**
    1314 * Base implementation of a Job
     
    4041   
    4142    void addedToQueue() {
    42         _addedBy = new Exception();
     43        if (_context.logManager().getLog(JobImpl.class).shouldLog(Log.DEBUG))
     44            _addedBy = new Exception();
    4345    }
    4446   
  • router/java/src/net/i2p/router/JobQueue.java

    r8c6bf5a rff0023a  
    9191    private final static String PROP_MAX_WAITING_JOBS = "router.maxWaitingJobs";
    9292   
    93     static {
    94     }
    95    
    9693    /**
    9794     * queue runners wait on this whenever they're not doing anything, and
     
    230227   
    231228    public void allowParallelOperation() { _allowParallelOperation = true; }
    232     void shutdown() { _alive = false; }
     229    void shutdown() {
     230        _alive = false;
     231        StringBuffer buf = new StringBuffer(1024);
     232        buf.append("jobs: \nready jobs: ").append(_readyJobs.size()).append("\n\t");
     233        for (int i = 0; i < _readyJobs.size(); i++)
     234            buf.append(_readyJobs.get(i).toString()).append("\n\t");
     235        buf.append("\n\ntimed jobs: ").append(_timedJobs.size()).append("\n\t");
     236        for (int i = 0; i < _timedJobs.size(); i++)
     237            buf.append(_timedJobs.get(i).toString()).append("\n\t");
     238        _log.log(Log.CRIT, buf.toString());
     239    }
    233240    boolean isAlive() { return _alive; }
    234241   
     
    277284        boolean newJobsReady = false;
    278285        long now = _context.clock().now();
    279         ArrayList toAdd = new ArrayList(4);
     286        ArrayList toAdd = null;
    280287        synchronized (_timedJobs) {
    281288            for (int i = 0; i < _timedJobs.size(); i++) {
     
    286293                        ((JobImpl)j).madeReady();
    287294
     295                    if (toAdd == null) toAdd = new ArrayList(4);
    288296                    toAdd.add(j);
    289297                    _timedJobs.remove(i);
     
    295303        int ready = 0;
    296304        synchronized (_readyJobs) {
    297             _readyJobs.addAll(toAdd);
     305            if (toAdd != null) {
     306                // rather than addAll, which allocs a byte array rv before adding,
     307                // we iterate, since toAdd is usually going to only be 1 or 2 entries
     308                // and since readyJobs will often have the space, we can avoid the
     309                // extra alloc.  (no, i'm not just being insane - i'm updating this based
     310                // on some profiling data ;)
     311                for (int i = 0; i < toAdd.size(); i++)
     312                    _readyJobs.add(toAdd.get(i));
     313            }
    298314            ready = _readyJobs.size();
    299315        }
     
    400416            if (_lastLimitUpdated > 0)
    401417                _lastLimitUpdated += delta;
    402         }
    403 
     418            updateJobTimings(delta);
     419        }
     420
     421    }
     422   
     423    /**
     424     * Update the clock data for all jobs in process or scheduled for
     425     * completion.
     426     */
     427    private void updateJobTimings(long delta) {
     428        synchronized (_timedJobs) {
     429            for (int i = 0; i < _timedJobs.size(); i++) {
     430                Job j = (Job)_timedJobs.get(i);
     431                j.getTiming().offsetChanged(delta);
     432            }
     433        }
     434        synchronized (_readyJobs) {
     435            for (int i = 0; i < _readyJobs.size(); i++) {
     436                Job j = (Job)_readyJobs.get(i);
     437                j.getTiming().offsetChanged(delta);
     438            }
     439        }
     440        synchronized (_runnerLock) {
     441            for (Iterator iter = _queueRunners.values().iterator(); iter.hasNext(); ) {
     442                JobQueueRunner runner = (JobQueueRunner)iter.next();
     443                Job job = runner.getCurrentJob();
     444                if (job != null)
     445                    job.getTiming().offsetChanged(delta);
     446            }
     447        }
    404448    }
    405449   
  • router/java/src/net/i2p/router/JobQueueRunner.java

    r8c6bf5a rff0023a  
    3535    public void run() {
    3636        long lastActive = _context.clock().now();
     37        long jobNum = 0;
    3738        while ( (_keepRunning) && (_context.jobQueue().isAlive()) ) {
    3839            try {
    3940                Job job = _context.jobQueue().getNext();
    4041                if (job == null) {
    41                     if (_log.shouldLog(Log.ERROR))
    42                         _log.error("getNext returned null - dead?");
     42                    if (_context.router().isAlive())
     43                        if (_log.shouldLog(Log.ERROR))
     44                            _log.error("getNext returned null - dead?");
    4345                    continue;
    4446                }
     
    8688                _lastJob = _currentJob;
    8789                _currentJob = null;
     90                jobNum++;
     91               
     92                if ( (jobNum % 10) == 0)
     93                    System.gc();
    8894            } catch (Throwable t) {
    8995                if (_log.shouldLog(Log.CRIT))
     
    9197            }
    9298        }
    93         if (_log.shouldLog(Log.CRIT))
    94             _log.log(Log.CRIT, "Queue runner " + _id + " exiting");
     99        if (_context.router().isAlive())
     100            if (_log.shouldLog(Log.CRIT))
     101                _log.log(Log.CRIT, "Queue runner " + _id + " exiting");
    95102        _context.jobQueue().removeRunner(_id);
    96103    }
     
    103110                if (_log.shouldLog(Log.CRIT))
    104111                    _log.log(Log.CRIT, "Router ran out of memory, shutting down", oom);
     112                _log.log(Log.CRIT, _currentJob.getClass().getName());
    105113                _context.router().shutdown();
    106114            } catch (Throwable t) {     
  • router/java/src/net/i2p/router/JobTiming.java

    r8c6bf5a rff0023a  
    2626        _actualStart = 0;
    2727        _actualEnd = 0;
    28         context.clock().addUpdateListener(this);
     28        //context.clock().addUpdateListener(this);
    2929    }
    3030   
  • router/java/src/net/i2p/router/MessageHistory.java

    r8c6bf5a rff0023a  
    66import java.util.Date;
    77import java.util.Iterator;
    8 import java.util.LinkedList;
     8import java.util.ArrayList;
    99import java.util.List;
    1010import java.util.TimeZone;
     
    9595            _historyFile = filename;
    9696            _localIdent = getName(_context.routerHash());
    97             _unwrittenEntries = new LinkedList();
     97            _unwrittenEntries = new ArrayList(64);
    9898            updateSettings();
    9999            addEntry(getPrefix() + "** Router initialized (started up or changed identities)");
     
    339339    public void sendMessage(String messageType, long messageId, Date expiration, Hash peer, boolean sentOk) {
    340340        if (!_doLog) return;
    341         StringBuffer buf = new StringBuffer(128);
     341        StringBuffer buf = new StringBuffer(256);
    342342        buf.append(getPrefix());
    343343        buf.append("send [").append(messageType).append("] message [").append(messageId).append("] ");
     
    364364    public void receiveMessage(String messageType, long messageId, Date expiration, Hash from, boolean isValid) {
    365365        if (!_doLog) return;
    366         StringBuffer buf = new StringBuffer(128);
     366        StringBuffer buf = new StringBuffer(256);
    367367        buf.append(getPrefix());
    368368        buf.append("receive [").append(messageType).append("] with id [").append(messageId).append("] ");
     
    474474        List entries = null;
    475475        synchronized (_unwrittenEntries) {
    476             entries = new LinkedList(_unwrittenEntries);
     476            entries = new ArrayList(_unwrittenEntries);
    477477            _unwrittenEntries.clear();
    478478        }
  • router/java/src/net/i2p/router/MessageValidator.java

    r8c6bf5a rff0023a  
    3636        _log = context.logManager().getLog(MessageValidator.class);
    3737        _receivedIdExpirations = new TreeMap();
    38         _receivedIds = new HashSet(1024);
     38        _receivedIds = new HashSet(32*1024);
    3939        _receivedIdLock = new Object();
    4040        _context = context;
     
    131131            _log.info("Cleaned out " + toRemoveDates.size() + " expired messageIds, leaving " + _receivedIds.size() + " remaining");
    132132    }
     133   
     134    void shutdown() {
     135        StringBuffer buf = new StringBuffer(1024);
     136        buf.append("Validated messages: ").append(_receivedIds.size());
     137        _log.log(Log.CRIT, buf.toString());
     138    }
    133139}
  • router/java/src/net/i2p/router/OutNetMessage.java

    r8c6bf5a rff0023a  
    116116        if (_messageSize <= 0) {
    117117            try {
    118                 ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); // large enough to hold most messages
     118                ByteArrayOutputStream baos = new ByteArrayOutputStream(2048); // large enough to hold most messages
    119119                _message.writeBytes(baos);
    120120                long sz = baos.size();
     
    137137                _message.writeBytes(baos);
    138138                byte data[] = baos.toByteArray();
    139                 baos.reset();
     139                _messageSize = data.length;
    140140                return data;
    141141            } catch (DataFormatException dfe) {
  • router/java/src/net/i2p/router/Router.java

    r8c6bf5a rff0023a  
    393393        try { _context.commSystem().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the comm system", t); }
    394394        try { _context.peerManager().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the peer manager", t); }
     395        try { _context.messageRegistry().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the message registry", t); }
     396        try { _context.messageValidator().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the message validator", t); }
    395397        try { _sessionKeyPersistenceHelper.shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the session key manager", t); }
    396398        dumpStats();
     
    414416    private class ShutdownHook extends Thread {
    415417        public void run() {
    416             _log.log(Log.CRIT, "Shutting down the router...", new Exception("Shutting down"));
     418            _log.log(Log.CRIT, "Shutting down the router...");
    417419            shutdown();
    418420        }
  • router/java/src/net/i2p/router/StatisticsManager.java

    r8c6bf5a rff0023a  
    163163   
    164164    private static String renderRate(Rate rate, boolean fudgeQuantity) {
    165         StringBuffer buf = new StringBuffer(255);
     165        StringBuffer buf = new StringBuffer(128);
    166166        buf.append(num(rate.getAverageValue())).append(';');
    167167        buf.append(num(rate.getExtremeAverageValue())).append(';');
  • router/java/src/net/i2p/router/client/ClientConnectionRunner.java

    r8c6bf5a rff0023a  
    110110    void stopRunning() {
    111111        if (_dead) return;
    112         _log.error("Stop the I2CP connection!  current leaseSet: "
    113                    + _currentLeaseSet, new Exception("Stop client connection"));
     112        if (_context.router().isAlive())
     113            _log.error("Stop the I2CP connection!  current leaseSet: "
     114                       + _currentLeaseSet, new Exception("Stop client connection"));
    114115        _dead = true;
    115116        // we need these keys to unpublish the leaseSet
  • router/java/src/net/i2p/router/client/ClientListenerRunner.java

    r8c6bf5a rff0023a  
    7474                        }
    7575                    } catch (IOException ioe) {
    76                         _log.error("Server error accepting", ioe);
     76                        if (_context.router().isAlive())
     77                            _log.error("Server error accepting", ioe);
    7778                    } catch (Throwable t) {
    78                         _log.error("Fatal error running client listener - killing the thread!", t);
     79                        if (_context.router().isAlive())
     80                            _log.error("Fatal error running client listener - killing the thread!", t);
    7981                        return;
    8082                    }
    8183                }
    8284            } catch (IOException ioe) {
    83                 _log.error("Error listening on port " + _port, ioe);
     85                if (_context.router().isAlive())
     86                    _log.error("Error listening on port " + _port, ioe);
    8487            }
    8588
     
    8891                _socket = null;
    8992            }
    90 
     93           
     94            if (!_context.router().isAlive()) break;
     95           
    9196            _log.error("Error listening, waiting " + _nextFailDelay + "ms before we try again");
    9297            try { Thread.sleep(_nextFailDelay); } catch (InterruptedException ie) {}
     
    95100        }
    96101
    97         _log.error("CANCELING I2CP LISTEN.  delay = " + curDelay, new Exception("I2CP Listen cancelled!!!"));
     102        if (_context.router().isAlive())
     103            _log.error("CANCELING I2CP LISTEN.  delay = " + curDelay, new Exception("I2CP Listen cancelled!!!"));
    98104        _running = false;
    99105    }
  • router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java

    r8c6bf5a rff0023a  
    7676        _context = context;
    7777        _log = context.logManager().getLog(ProfileOrganizer.class);
    78         _fastAndReliablePeers = new HashMap(64);
    79         _reliablePeers = new HashMap(512);
    80         _wellIntegratedPeers = new HashMap(256);
    81         _notFailingPeers = new HashMap(1024);
    82         _failingPeers = new HashMap(4096);
     78        _fastAndReliablePeers = new HashMap(16);
     79        _reliablePeers = new HashMap(16);
     80        _wellIntegratedPeers = new HashMap(16);
     81        _notFailingPeers = new HashMap(16);
     82        _failingPeers = new HashMap(16);
    8383        _strictReliabilityOrder = new TreeSet(new InverseReliabilityComparator());
    8484        _thresholdSpeedValue = 0.0d;
     
    467467        howMany -= matches.size();
    468468        Collections.shuffle(all, _random);
    469         Set rv = new HashSet(howMany);
    470469        for (int i = 0; i < howMany && i < all.size(); i++) {
    471             rv.add(all.get(i));
    472         }
    473         matches.addAll(rv);
     470            matches.add(all.get(i));
     471        }
    474472    }
    475473   
  • router/java/src/net/i2p/router/startup/ReadConfigJob.java

    r8c6bf5a rff0023a  
    2727public class ReadConfigJob extends JobImpl {
    2828    private final static long DELAY = 30*1000; // reread every 30 seconds
     29    private long _lastRead = -1;
    2930
    3031    public ReadConfigJob(RouterContext ctx) {
     
    3435    public String getName() { return "Read Router Configuration"; }
    3536    public void runJob() {
    36         doRead(_context);
     37        if (shouldReread()) {
     38            doRead(_context);
     39            _lastRead = _context.clock().now();
     40        }
    3741        getTiming().setStartAfter(_context.clock().now() + DELAY);
    3842        _context.jobQueue().addJob(this);
     43    }
     44   
     45    private boolean shouldReread() {
     46        File configFile = new File(_context.router().getConfigFilename());
     47        if (!configFile.exists()) return false;
     48        if (configFile.lastModified() > _lastRead)
     49            return true;
     50        else
     51            return false;
    3952    }
    4053   
  • router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java

    r8c6bf5a rff0023a  
    4040        _pendingMessages = new TreeMap();
    4141        _context.jobQueue().addJob(new CleanupPendingMessagesJob());
     42    }
     43   
     44    public void shutdown() {
     45        StringBuffer buf = new StringBuffer(1024);
     46        buf.append("Pending messages: ").append(_pendingMessages.size()).append("\n");
     47        for (Iterator iter = _pendingMessages.values().iterator(); iter.hasNext(); ) {
     48            buf.append(iter.next().toString()).append("\n\t");
     49        }
     50        _log.log(Log.CRIT, buf.toString());
    4251    }
    4352   
  • router/java/src/net/i2p/router/transport/VMCommSystem.java

    r8c6bf5a rff0023a  
    6262            _context.jobQueue().addJob(msg.getOnSendJob());
    6363            _context.profileManager().messageSent(msg.getTarget().getIdentity().getHash(), "vm", sendTime, msg.getMessageSize());
    64             _context.statManager().addRateData("transport.sendMessageSize", msg.getMessageSize(), sendTime);
    65             peerSys.receive(msg.getMessage().toByteArray(), _context.routerHash());
     64            byte data[] = msg.getMessageData();
     65            _context.statManager().addRateData("transport.sendMessageSize", data.length, sendTime);
     66            peerSys.receive(data, _context.routerHash());
    6667            //_context.jobQueue().addJob(new SendJob(peerSys, msg.getMessage(), _context));
    6768            sendSuccessful = true;
  • router/java/src/net/i2p/router/tunnelmanager/TunnelPool.java

    r8c6bf5a rff0023a  
    569569    public void shutdown() {
    570570        if (_log.shouldLog(Log.INFO)) _log.info("Shutting down tunnel pool");
    571         _persistenceHelper.writePool(this);
     571        if (_persistenceHelper != null)
     572            _persistenceHelper.writePool(this);
    572573        _isLive = false; // the subjobs [should] check getIsLive() on each run
    573574        _outboundTunnels = null;
Note: See TracChangeset for help on using the changeset viewer.