Changeset 1e5fe1f6


Ignore:
Timestamp:
Sep 6, 2011 3:32:23 PM (8 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
72abe9d
Parents:
dc2198d (diff), 29ef116 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge of '4f61b159a4d39db3c8eddf2539e9012f5bb375a2'

and '57a19829917d3dc2ad19e95c7b3bafd3673c3903'

Files:
17 edited

Legend:

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

    rdc2198d r1e5fe1f6  
    690690            } catch (IllegalArgumentException iae) {
    691691                String msg = "Invalid I2PTunnel configuration to create an HTTP Proxy connecting to the router at " + host + ':'+ port +
    692                              " and listening on " + listenHost + ':' + port;
     692                             " and listening on " + listenHost + ':' + portNum;
    693693                _log.error(getPrefix() + msg, iae);
    694694                l.log(msg);
     
    766766            } catch (IllegalArgumentException iae) {
    767767                String msg = "Invalid I2PTunnel configuration to create an HTTP Proxy connecting to the router at " + host + ':'+ port +
    768                              " and listening on " + listenHost + ':' + port;
     768                             " and listening on " + listenHost + ':' + clientPort;
    769769                _log.error(getPrefix() + msg, iae);
    770770                l.log(msg);
     
    834834            } catch (IllegalArgumentException iae) {
    835835                String msg = "Invalid I2PTunnel configuration to create a CONNECT client connecting to the router at " + host + ':'+ port +
    836                              " and listening on " + listenHost + ':' + port;
     836                             " and listening on " + listenHost + ':' + _port;
    837837                _log.error(getPrefix() + msg, iae);
    838838                l.log(msg);
     
    900900            } catch (IllegalArgumentException iae) {
    901901                String msg = "Invalid I2PTunnel configuration to create an IRC client connecting to the router at " + host + ':'+ port +
    902                              " and listening on " + listenHost + ':' + port;
     902                             " and listening on " + listenHost + ':' + _port;
    903903                _log.error(getPrefix() + msg, iae);
    904904                l.log(msg);
     
    954954            } catch (IllegalArgumentException iae) {
    955955                String msg = "Invalid I2PTunnel configuration to create a SOCKS Proxy connecting to the router at " + host + ':'+ port +
    956                              " and listening on " + listenHost + ':' + port;
     956                             " and listening on " + listenHost + ':' + _port;
    957957                _log.error(getPrefix() + msg, iae);
    958958                l.log(msg);
     
    10011001            } catch (IllegalArgumentException iae) {
    10021002                String msg = "Invalid I2PTunnel configuration to create a SOCKS IRC Proxy connecting to the router at " + host + ':'+ port +
    1003                              " and listening on " + listenHost + ':' + port;
     1003                             " and listening on " + listenHost + ':' + _port;
    10041004                _log.error(getPrefix() + msg, iae);
    10051005                l.log(msg);
     
    10511051            } catch (IllegalArgumentException iae) {
    10521052                String msg = "Invalid I2PTunnel configuration to create a Streamr Client connecting to the router at " + host + ':'+ port +
    1053                              " and sending to " + _host + ':' + port;
     1053                             " and sending to " + _host + ':' + _port;
    10541054                _log.error(getPrefix() + msg, iae);
    10551055                l.log(msg);
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java

    rdc2198d r1e5fe1f6  
    156156                _log.warn("Cannot start the tunnel - no type specified");
    157157            return;
     158        }
     159        // Config options may have changed since instantiation, so do this again.
     160        // Or should we take it out of the constructor completely?
     161        if (type.endsWith("server") || getPersistentClientKey()) {
     162            boolean ok = createPrivateKey();
     163            if (!ok) {
     164                log("Failed to start tunnel " + getName() + " as the private key file could not be created");
     165                return;
     166            }
    158167        }
    159168        setI2CPOptions();
  • apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java

    rdc2198d r1e5fe1f6  
    44import java.io.IOException;
    55import java.io.OutputStreamWriter;
     6import java.io.Writer;
     7import java.util.ArrayList;
     8import java.util.Collections;
     9import java.util.Comparator;
     10import java.util.List;
     11import java.util.Map;
     12import java.util.TreeMap;
    613
     14import net.i2p.data.DataHelper;
     15import net.i2p.router.Job;
     16import net.i2p.router.JobStats;
    717
    818public class JobQueueHelper extends HelperBase {
    9     public JobQueueHelper() {}
    1019   
    1120    public String getJobQueueSummary() {
    1221        try {
    1322            if (_out != null) {
    14                 _context.jobQueue().renderStatusHTML(_out);
     23                renderStatusHTML(_out);
    1524                return "";
    1625            } else {
    1726                ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024);
    18                 _context.jobQueue().renderStatusHTML(new OutputStreamWriter(baos));
     27                renderStatusHTML(new OutputStreamWriter(baos));
    1928                return new String(baos.toByteArray());
    2029            }
     
    2433        }
    2534    }
     35
     36    /**
     37     *  Moved from JobQueue
     38     *  @since 0.8.9
     39     */
     40    private void renderStatusHTML(Writer out) throws IOException {
     41        List<Job> readyJobs = new ArrayList(8);
     42        List<Job> timedJobs = new ArrayList(128);
     43        List<Job> activeJobs = new ArrayList(8);
     44        List<Job> justFinishedJobs = new ArrayList(8);
     45       
     46        int numRunners = _context.jobQueue().getJobs(readyJobs, timedJobs, activeJobs, justFinishedJobs);
     47       
     48        StringBuilder buf = new StringBuilder(32*1024);
     49        buf.append("<b><div class=\"joblog\"><h3>I2P Job Queue</h3><div class=\"wideload\">Job runners: ").append(numRunners);
     50        buf.append("</b><br>\n");
     51
     52        long now = _context.clock().now();
     53
     54        buf.append("<hr><b>Active jobs: ").append(activeJobs.size()).append("</b><ol>\n");
     55        for (int i = 0; i < activeJobs.size(); i++) {
     56            Job j = activeJobs.get(i);
     57            buf.append("<li>[started ").append(DataHelper.formatDuration2(now-j.getTiming().getStartAfter())).append(" ago]: ");
     58            buf.append(j.toString()).append("</li>\n");
     59        }
     60        buf.append("</ol>\n");
     61        buf.append("<hr><b>Just finished jobs: ").append(justFinishedJobs.size()).append("</b><ol>\n");
     62        for (int i = 0; i < justFinishedJobs.size(); i++) {
     63            Job j = justFinishedJobs.get(i);
     64            buf.append("<li>[finished ").append(DataHelper.formatDuration2(now-j.getTiming().getActualEnd())).append(" ago]: ");
     65            buf.append(j.toString()).append("</li>\n");
     66        }
     67        buf.append("</ol>\n");
     68        buf.append("<hr><b>Ready/waiting jobs: ").append(readyJobs.size()).append("</b><ol>\n");
     69        for (int i = 0; i < readyJobs.size(); i++) {
     70            Job j = readyJobs.get(i);
     71            buf.append("<li>[waiting ");
     72            buf.append(DataHelper.formatDuration2(now-j.getTiming().getStartAfter()));
     73            buf.append("]: ");
     74            buf.append(j.toString()).append("</li>\n");
     75        }
     76        buf.append("</ol>\n");
     77        out.flush();
     78
     79        buf.append("<hr><b>Scheduled jobs: ").append(timedJobs.size()).append("</b><ol>\n");
     80        TreeMap<Long, Job> ordered = new TreeMap();
     81        for (int i = 0; i < timedJobs.size(); i++) {
     82            Job j = timedJobs.get(i);
     83            ordered.put(Long.valueOf(j.getTiming().getStartAfter()), j);
     84        }
     85        for (Job j : ordered.values()) {
     86            long time = j.getTiming().getStartAfter() - now;
     87            buf.append("<li>").append(j.getName()).append(" in ");
     88            buf.append(DataHelper.formatDuration2(time)).append("</li>\n");
     89        }
     90        buf.append("</ol></div>\n");
     91       
     92        out.flush();
     93       
     94        getJobStats(buf);
     95       
     96        out.flush();
     97       
     98        out.write(buf.toString());
     99    }
     100   
     101    /**
     102     *  Render the HTML for the job stats.
     103     *  Moved from JobQueue
     104     *  @since 0.8.9
     105     */
     106    private void getJobStats(StringBuilder buf) {
     107        buf.append("<table>\n" +
     108                   "<tr><th>Job</th><th>Runs</th>" +
     109                   "<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>" +
     110                   "<th>Pending</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th></tr>\n");
     111        long totRuns = 0;
     112        long totExecTime = 0;
     113        long avgExecTime = 0;
     114        long maxExecTime = -1;
     115        long minExecTime = -1;
     116        long totPendingTime = 0;
     117        long avgPendingTime = 0;
     118        long maxPendingTime = -1;
     119        long minPendingTime = -1;
     120
     121        List<JobStats> tstats = new ArrayList(_context.jobQueue().getJobStats());
     122        Collections.sort(tstats, new JobStatsComparator());
     123       
     124        for (JobStats stats : tstats) {
     125            buf.append("<tr>");
     126            buf.append("<td><b>").append(stats.getName()).append("</b></td>");
     127            buf.append("<td align=\"right\">").append(stats.getRuns()).append("</td>");
     128            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getTotalTime())).append("</td>");
     129            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getAvgTime())).append("</td>");
     130            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMaxTime())).append("</td>");
     131            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMinTime())).append("</td>");
     132            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getTotalPendingTime())).append("</td>");
     133            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getAvgPendingTime())).append("</td>");
     134            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMaxPendingTime())).append("</td>");
     135            buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(stats.getMinPendingTime())).append("</td>");
     136            buf.append("</tr>\n");
     137            totRuns += stats.getRuns();
     138            totExecTime += stats.getTotalTime();
     139            if (stats.getMaxTime() > maxExecTime)
     140                maxExecTime = stats.getMaxTime();
     141            if ( (minExecTime < 0) || (minExecTime > stats.getMinTime()) )
     142                minExecTime = stats.getMinTime();
     143            totPendingTime += stats.getTotalPendingTime();
     144            if (stats.getMaxPendingTime() > maxPendingTime)
     145                maxPendingTime = stats.getMaxPendingTime();
     146            if ( (minPendingTime < 0) || (minPendingTime > stats.getMinPendingTime()) )
     147                minPendingTime = stats.getMinPendingTime();
     148        }
     149
     150        if (totRuns != 0) {
     151            if (totExecTime != 0)
     152                avgExecTime = totExecTime / totRuns;
     153            if (totPendingTime != 0)
     154                avgPendingTime = totPendingTime / totRuns;
     155        }
     156
     157        buf.append("<tr class=\"tablefooter\">");
     158        buf.append("<td><b>").append("SUMMARY").append("</b></td>");
     159        buf.append("<td align=\"right\">").append(totRuns).append("</td>");
     160        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(totExecTime)).append("</td>");
     161        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(avgExecTime)).append("</td>");
     162        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(maxExecTime)).append("</td>");
     163        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(minExecTime)).append("</td>");
     164        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(totPendingTime)).append("</td>");
     165        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(avgPendingTime)).append("</td>");
     166        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(maxPendingTime)).append("</td>");
     167        buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(minPendingTime)).append("</td>");
     168        buf.append("</tr></table></div>\n");
     169    }
     170
     171    /** @since 0.8.9 */
     172    private static class JobStatsComparator implements Comparator<JobStats> {
     173         public int compare(JobStats l, JobStats r) {
     174             return l.getName().compareTo(r.getName());
     175        }
     176    }
     177
    26178}
  • core/java/src/net/i2p/crypto/AESEngine.java

    rdc2198d r1e5fe1f6  
    1616import net.i2p.util.Log;
    1717import net.i2p.util.RandomSource;
     18import net.i2p.util.SimpleByteCache;
    1819
    1920/**
     
    6566
    6667    /**
    67      * Encrypt the SHA-256 Hash of the payload, the 4 byte length, and the payload,
     68     * Encrypt the SHA-256 Hash of the IV, the 4 byte length, and the payload,
    6869     * with random padding up to the paddedSize, rounded up to the next multiple of 16.
    6970     *
     
    8283       
    8384        byte data[] = new byte[size + padding];
    84         Hash h = _context.sha().calculateHash(iv);
    85        
    86         int cur = 0;
    87         System.arraycopy(h.getData(), 0, data, cur, Hash.HASH_LENGTH);
    88         cur += Hash.HASH_LENGTH;
     85        _context.sha().calculateHash(iv, 0, 16, data, 0);
     86        int cur = Hash.HASH_LENGTH;
    8987       
    9088        DataHelper.toLong(data, cur, 4, payload.length);
     
    117115        }
    118116
    119         int cur = 0;
    120         byte h[] = _context.sha().calculateHash(iv).getData();
    121         for (int i = 0; i < Hash.HASH_LENGTH; i++) {
    122             if (decr[i] != h[i]) {
     117        byte h[] = SimpleByteCache.acquire(Hash.HASH_LENGTH);
     118        _context.sha().calculateHash(iv, 0, 16, h, 0);
     119        boolean eq = DataHelper.eq(decr, 0, h, 0, Hash.HASH_LENGTH);
     120        SimpleByteCache.release(h);
     121        if (!eq) {
    123122                _log.error("Hash does not match [key=" + sessionKey + " / iv =" + DataHelper.toString(iv, iv.length)
    124123                           + "]", new Exception("Hash error"));
    125124                return null;
    126             }
    127125        }
    128         cur += Hash.HASH_LENGTH;
     126        int cur = Hash.HASH_LENGTH;
    129127       
    130128        long len = DataHelper.fromLong(decr, cur, 4);
  • core/java/src/net/i2p/crypto/ElGamalAESEngine.java

    rdc2198d r1e5fe1f6  
    2727import net.i2p.data.SessionTag;
    2828import net.i2p.util.Log;
     29import net.i2p.util.SimpleByteCache;
    2930
    3031/**
     
    8889
    8990        byte tag[] = new byte[32];
    90         System.arraycopy(data, 0, tag, 0, tag.length);
     91        System.arraycopy(data, 0, tag, 0, 32);
    9192        SessionTag st = new SessionTag(tag);
    9293        SessionKey key = keyManager.consumeTag(st);
     
    186187        }
    187188
    188         byte preIV[] = null;
    189        
    190189        int offset = 0;
    191190        byte key[] = new byte[SessionKey.KEYSIZE_BYTES];
     
    193192        offset += SessionKey.KEYSIZE_BYTES;
    194193        usedKey.setData(key);
    195         preIV = new byte[32];
     194        byte[] preIV = SimpleByteCache.acquire(32);
    196195        System.arraycopy(elgDecr, offset, preIV, 0, 32);
    197196        offset += 32;
     
    199198        //_log.debug("Pre IV for decryptNewSession: " + DataHelper.toString(preIV, 32));
    200199        //_log.debug("SessionKey for decryptNewSession: " + DataHelper.toString(key.getData(), 32));
    201         Hash ivHash = _context.sha().calculateHash(preIV);
    202         byte iv[] = new byte[16];
    203         System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     200
     201        // use alternate calculateHash() method to avoid object churn and caching
     202        //Hash ivHash = _context.sha().calculateHash(preIV);
     203        //byte iv[] = new byte[16];
     204        //System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     205        byte[] iv = halfHash(preIV);
     206        SimpleByteCache.release(preIV);
    204207
    205208        // feed the extra bytes into the PRNG
     
    207210
    208211        byte aesDecr[] = decryptAESBlock(data, 514, data.length-514, usedKey, iv, null, foundTags, foundKey);
     212        SimpleByteCache.release(iv);
    209213
    210214        //if (_log.shouldLog(Log.DEBUG))
     
    239243    private byte[] decryptExistingSession(byte data[], SessionKey key, PrivateKey targetPrivateKey, Set foundTags,
    240244                                         SessionKey usedKey, SessionKey foundKey) throws DataFormatException {
    241         byte preIV[] = new byte[32];
    242         System.arraycopy(data, 0, preIV, 0, preIV.length);
    243         Hash ivHash = _context.sha().calculateHash(preIV);
    244         byte iv[] = new byte[16];
    245         System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     245        byte preIV[] = SimpleByteCache.acquire(32);
     246        System.arraycopy(data, 0, preIV, 0, 32);
     247        // use alternate calculateHash() method to avoid object churn and caching
     248        //Hash ivHash = _context.sha().calculateHash(preIV);
     249        //byte iv[] = new byte[16];
     250        //System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     251        byte[] iv = halfHash(preIV);
     252        SimpleByteCache.release(preIV);
    246253
    247254        //_log.debug("Pre IV for decryptExistingSession: " + DataHelper.toString(preIV, 32));
    248255        //_log.debug("SessionKey for decryptNewSession: " + DataHelper.toString(key.getData(), 32));
    249256        byte decrypted[] = decryptAESBlock(data, 32, data.length-32, key, iv, preIV, foundTags, foundKey);
     257        SimpleByteCache.release(iv);
    250258        if (decrypted == null) {
    251259            // it begins with a valid session tag, but thats just a coincidence.
     
    337345            //readHash = new Hash();
    338346            //readHash.setData(hashval);
    339             readHash = Hash.create(decrypted, cur);
     347            //readHash = Hash.create(decrypted, cur);
     348            int hashIndex = cur;
    340349            cur += Hash.HASH_LENGTH;
    341350            byte flag = decrypted[cur++];
     
    349358            byte unencrData[] = new byte[(int) len];
    350359            System.arraycopy(decrypted, cur, unencrData, 0, (int)len);
    351             cur += len;
    352             Hash calcHash = _context.sha().calculateHash(unencrData);
    353             boolean eq = calcHash.equals(readHash);
     360            cur += (int) len;
     361            // use alternate calculateHash() method to avoid object churn and caching
     362            //Hash calcHash = _context.sha().calculateHash(unencrData);
     363            //boolean eq = calcHash.equals(readHash);
     364            byte[] calcHash = SimpleByteCache.acquire(32);
     365            _context.sha().calculateHash(unencrData, 0, (int) len, calcHash, 0);
     366            boolean eq = DataHelper.eq(decrypted, hashIndex, calcHash, 0, 32);
     367            SimpleByteCache.release(calcHash);
    354368           
    355369            if (eq) {
     
    458472        byte elgSrcData[] = new byte[SessionKey.KEYSIZE_BYTES+32+158];
    459473        System.arraycopy(key.getData(), 0, elgSrcData, 0, SessionKey.KEYSIZE_BYTES);
    460         byte preIV[] = new byte[32];
     474        byte preIV[] = SimpleByteCache.acquire(32);
    461475        _context.random().nextBytes(preIV);
    462476        System.arraycopy(preIV, 0, elgSrcData, SessionKey.KEYSIZE_BYTES, 32);
     
    485499        // should we also feed the encrypted elG block into the harvester?
    486500
    487         Hash ivHash = _context.sha().calculateHash(preIV);
    488         byte iv[] = new byte[16];
    489         System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     501        // use alternate calculateHash() method to avoid object churn and caching
     502        //Hash ivHash = _context.sha().calculateHash(preIV);
     503        //byte iv[] = new byte[16];
     504        //System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     505        byte[] iv = halfHash(preIV);
     506        SimpleByteCache.release(preIV);
     507
    490508        byte aesEncr[] = encryptAESBlock(data, key, iv, tagsForDelivery, newKey, paddedSize);
     509        SimpleByteCache.release(iv);
    491510        //_log.debug("AES encrypted length: " + aesEncr.length);
    492511
     
    523542        //_log.debug("Pre IV for encryptExistingSession (aka tag): " + currentTag.toString());
    524543        //_log.debug("SessionKey for encryptNewSession: " + DataHelper.toString(key.getData(), 32));
    525         Hash ivHash = _context.sha().calculateHash(rawTag);
    526         byte iv[] = new byte[16];
    527         System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     544        // use alternate calculateHash() method to avoid object churn and caching
     545        //Hash ivHash = _context.sha().calculateHash(rawTag);
     546        //byte iv[] = new byte[16];
     547        //System.arraycopy(ivHash.getData(), 0, iv, 0, 16);
     548        byte[] iv = halfHash(rawTag);
    528549       
    529550        byte aesEncr[] = encryptAESBlock(data, key, iv, tagsForDelivery, newKey, paddedSize, SessionTag.BYTE_LENGTH);
     551        SimpleByteCache.release(iv);
    530552        // that prepended SessionTag.BYTE_LENGTH bytes at the beginning of the buffer
    531553        System.arraycopy(rawTag, 0, aesEncr, 0, rawTag.length);
    532554        return aesEncr;
     555    }
     556
     557    /**
     558     *  Generate the first 16 bytes of the SHA-256 hash of the data.
     559     *
     560     *  Here we are careful to use the SHA256Generator method that does not
     561     *  generate a Hash object or cache the result.
     562     *
     563     *  @param preIV the 32 byte pre-IV. Caller should call SimpleByteCache.release(data) after use.
     564     *  @return a 16 byte array. Caller should call SimpleByteCache.release(rv) after use.
     565     *  @since 0.8.9
     566     */
     567    private byte[] halfHash(byte[] preIV) {
     568        byte[] ivHash = SimpleByteCache.acquire(32);
     569        _context.sha().calculateHash(preIV, 0, 32, ivHash, 0);
     570        byte iv[] = SimpleByteCache.acquire(16);
     571        System.arraycopy(ivHash, 0, iv, 0, 16);
     572        SimpleByteCache.release(ivHash);
     573        return iv;
    533574    }
    534575
     
    582623        cur += 4;
    583624        //_log.debug("data length: " + data.length);
    584         Hash hash = _context.sha().calculateHash(data);
    585         System.arraycopy(hash.getData(), 0, aesData, cur, Hash.HASH_LENGTH);
     625        // use alternate calculateHash() method to avoid object churn and caching
     626        //Hash hash = _context.sha().calculateHash(data);
     627        //System.arraycopy(hash.getData(), 0, aesData, cur, Hash.HASH_LENGTH);
     628        _context.sha().calculateHash(data, 0, data.length, aesData, cur);
    586629        cur += Hash.HASH_LENGTH;
    587630       
  • core/java/src/net/i2p/crypto/ElGamalEngine.java

    rdc2198d r1e5fe1f6  
    4242import net.i2p.util.NativeBigInteger;
    4343import net.i2p.util.RandomSource;
     44import net.i2p.util.SimpleByteCache;
    4445
    4546/**
     
    124125        // FIXME this isn't a random nonzero byte!
    125126        d2[0] = (byte)0xFF;
    126         Hash hash = _context.sha().calculateHash(data);
    127         System.arraycopy(hash.getData(), 0, d2, 1, Hash.HASH_LENGTH);
     127        _context.sha().calculateHash(data, 0, data.length, d2, 1);
    128128        System.arraycopy(data, 0, d2, 1+Hash.HASH_LENGTH, data.length);
    129129       
     
    222222        //System.arraycopy(val, i + 1, hashData, 0, Hash.HASH_LENGTH);
    223223        //Hash hash = new Hash(hashData);
    224         Hash hash = Hash.create(val, i + 1);
     224        //Hash hash = Hash.create(val, i + 1);
    225225        byte rv[] = new byte[payloadLen];
    226226        System.arraycopy(val, i + 1 + Hash.HASH_LENGTH, rv, 0, rv.length);
    227227
    228         Hash calcHash = _context.sha().calculateHash(rv);
    229         boolean ok = calcHash.equals(hash);
     228        byte[] calcHash = SimpleByteCache.acquire(Hash.HASH_LENGTH);
     229        _context.sha().calculateHash(rv, 0, payloadLen, calcHash, 0);
     230        boolean ok = DataHelper.eq(calcHash, 0, val, i + 1, Hash.HASH_LENGTH);
     231        SimpleByteCache.release(calcHash);
    230232       
    231233        long end = _context.clock().now();
     
    244246        }
    245247        if (_log.shouldLog(Log.DEBUG))
    246             _log.debug("Doesn't match hash [sent hash=" + hash + "]\ndata = "
     248            _log.debug("Doesn't match hash data = "
    247249                       + Base64.encode(rv), new Exception("Doesn't match"));
    248250        return null;
  • core/java/src/net/i2p/data/PrivateKeyFile.java

    rdc2198d r1e5fe1f6  
    128128    }
    129129   
     130    /** @since 0.8.9 */
     131    public PrivateKeyFile(File file, I2PSession session) {
     132        this(file, session.getMyDestination(), session.getDecryptionKey(), session.getPrivateKey());
     133    }
     134   
     135    /** @since 0.8.9 */
     136    public PrivateKeyFile(File file, Destination dest, PrivateKey pk, SigningPrivateKey spk) {
     137        this.file = file;
     138        this.client = null;
     139        this.dest = dest;
     140        this.privKey = pk;
     141        this.signingPrivKey = spk;
     142    }
     143   
     144    /** @since 0.8.9 */
     145    public PrivateKeyFile(File file, PublicKey pubkey, SigningPublicKey spubkey, Certificate cert,
     146                          PrivateKey pk, SigningPrivateKey spk) {
     147        this.file = file;
     148        this.client = null;
     149        this.dest = new Destination();
     150        this.dest.setPublicKey(pubkey);
     151        this.dest.setSigningPublicKey(spubkey);
     152        this.dest.setCertificate(cert);
     153        this.privKey = pk;
     154        this.signingPrivKey = spk;
     155    }
    130156   
    131157    /** Also reads in the file to get the privKey and signingPrivKey,
     
    137163            try {
    138164                out = new FileOutputStream(this.file);
    139                 this.client.createDestination(out);
     165                if (this.client != null)
     166                    this.client.createDestination(out);
     167                else
     168                    write();
    140169            } finally {
    141170                if (out != null) {
     
    412441   
    413442   
    414     private File file;
    415     private I2PClient client;
     443    private final File file;
     444    private final I2PClient client;
    416445    private Destination dest;
    417446    private PrivateKey privKey;
  • core/java/src/net/i2p/data/PublicKey.java

    rdc2198d r1e5fe1f6  
    2222public class PublicKey extends SimpleDataStructure {
    2323    public final static int KEYSIZE_BYTES = 256;
    24     private static final int CACHE_SIZE = 256;
     24    private static final int CACHE_SIZE = 1024;
    2525
    2626    private static final SDSCache<PublicKey> _cache = new SDSCache(PublicKey.class, KEYSIZE_BYTES, CACHE_SIZE);
  • core/java/src/net/i2p/data/RoutingKeyGenerator.java

    rdc2198d r1e5fe1f6  
    121121    }
    122122
     123/****
    123124    public static void main(String args[]) {
    124125        Hash k1 = new Hash();
     
    138139        }
    139140    }
     141****/
    140142}
  • core/java/src/net/i2p/data/SDSCache.java

    rdc2198d r1e5fe1f6  
    44import java.io.IOException;
    55import java.io.InputStream;
     6import java.lang.ref.WeakReference;
    67import java.lang.reflect.Constructor;
    78import java.lang.reflect.InvocationTargetException;
     
    5758
    5859    /** the LRU cache */
    59     private final Map<Integer, V> _cache;
     60    private final Map<Integer, WeakReference<V>> _cache;
    6061    /** the byte array length for the class we are caching */
    6162    private final int _datalen;
     
    112113        Integer key = hashCodeOf(data);
    113114        synchronized(_cache) {
    114             rv = _cache.get(key);
     115            WeakReference<V> ref = _cache.get(key);
     116            if (ref != null)
     117                rv = ref.get();
     118            else
     119                rv = null;
    115120            if (rv != null && DataHelper.eq(data, rv.getData())) {
    116121                // found it, we don't need the data passed in any more
     
    128133                    throw new RuntimeException("SDSCache error", e);
    129134                }
    130                 _cache.put(key, rv);
     135                _cache.put(key, new WeakReference(rv));
    131136               found = 0;
    132137            }
  • core/java/src/net/i2p/data/SigningPublicKey.java

    rdc2198d r1e5fe1f6  
    2323public class SigningPublicKey extends SimpleDataStructure {
    2424    public final static int KEYSIZE_BYTES = 128;
    25     private static final int CACHE_SIZE = 256;
     25    private static final int CACHE_SIZE = 1024;
    2626
    2727    private static final SDSCache<SigningPublicKey> _cache = new SDSCache(SigningPublicKey.class, KEYSIZE_BYTES, CACHE_SIZE);
  • core/java/src/net/i2p/stat/Rate.java

    rdc2198d r1e5fe1f6  
    1515 */
    1616public class Rate {
    17     private final static Log _log = new Log(Rate.class);
     17    //private final static Log _log = new Log(Rate.class);
    1818    private volatile double _currentTotalValue;
    1919    private volatile long _currentEventCount;
     
    3636
    3737    /** locked during coalesce and addData */
    38     private final Object _lock = new Object();
     38    // private final Object _lock = new Object();
    3939
    4040    /** in the current (partial) period, what is the total value acrued through all events? */
     
    158158     */
    159159    public void addData(long value) {
    160         synchronized (_lock) {
     160        synchronized (this) {
    161161            _currentTotalValue += value;
    162162            _currentEventCount++;
     
    200200     */
    201201    public void addData(long value, long eventDuration) {
    202         synchronized (_lock) {
     202        synchronized (this) {
    203203            _currentTotalValue += value;
    204204            _currentEventCount++;
     
    216216        long now = now();
    217217        double correctedTotalValue; // for summaryListener which divides by rounded EventCount
    218         synchronized (_lock) {
     218        synchronized (this) {
    219219            long measuredPeriod = now - _lastCoalesceDate;
    220220            if (measuredPeriod < _period - SLACK) {
  • history.txt

    rdc2198d r1e5fe1f6  
     12011-09-06 zzz
     2  * Console: Move configservice.jsp rendering code from
     3    the router to the console
     4  * Crypto: Rework use of SHA256 for efficiency and
     5    to avoid clogging the Hash cache with one-time hashes,
     6    and avoiding the global cache lock.
     7    This also greatly increases Hash cache hit rates.
     8    Also use SimpleByteCache for temporary byte buffers.
     9  * I2PTunnel: Save keys to privkey file when enabling
     10    persistent key after tunnel creation (ticket #480)
     11  * JobQueue: Change queue from a List to a Set for efficiency
     12  * PrivateKeyFile: Add more constructors
     13  * SDSCache: Use weak refs; increase size for pub keys
     14
    1152011-09-04 zzz
    216  * NetDB:
  • router/java/src/net/i2p/router/JobImpl.java

    rdc2198d r1e5fe1f6  
    1818    private static long _idSrc = 0;
    1919    private final long _id;
    20     private Exception _addedBy;
     20    //private Exception _addedBy;
    2121    private long _madeReadyOn;
    2222   
     
    3535    public String toString() {
    3636        StringBuilder buf = new StringBuilder(128);
    37         buf.append(super.toString());
     37        buf.append(getClass().getSimpleName());
    3838        buf.append(": Job ").append(_id).append(": ").append(getName());
    3939        return buf.toString();
     
    5555     *  @return null always
    5656     */
    57     public Exception getAddedBy() { return _addedBy; }
     57    public Exception getAddedBy() { return null; }
    5858    public long getMadeReadyOn() { return _madeReadyOn; }
    5959    public void madeReady() { _madeReadyOn = _context.clock().now(); }
  • router/java/src/net/i2p/router/JobQueue.java

    rdc2198d r1e5fe1f6  
    1414import java.util.Collection;
    1515import java.util.Collections;
     16import java.util.HashSet;
    1617import java.util.Iterator;
    1718import java.util.List;
     
    1920import java.util.SortedMap;
    2021import java.util.TreeMap;
     22import java.util.Set;
    2123import java.util.concurrent.ConcurrentHashMap;
    2224import java.util.concurrent.BlockingQueue;
     
    4547    private final BlockingQueue<Job> _readyJobs;
    4648    /** list of jobs that are scheduled for running in the future */
    47     private final List<Job> _timedJobs;
     49    private final Set<Job> _timedJobs;
    4850    /** job name to JobStat for that job */
    4951    private final Map<String, JobStats> _jobStats;
     
    136138        _alive = true;
    137139        _readyJobs = new LinkedBlockingQueue();
    138         _timedJobs = new ArrayList(64);
     140        _timedJobs = new HashSet(64);
    139141        _jobLock = new Object();
    140142        _queueRunners = new ConcurrentHashMap(RUNNERS);
     
    455457                    try {
    456458                        synchronized (_jobLock) {
    457                             for (int i = 0; i < _timedJobs.size(); i++) {
    458                                 Job j = _timedJobs.get(i);
     459                            for (Iterator<Job> iter = _timedJobs.iterator(); iter.hasNext(); ) {
     460                                Job j = iter.next();
    459461                                // find jobs due to start before now
    460462                                long timeLeft = j.getTiming().getStartAfter() - now;
     
    465467                                    if (toAdd == null) toAdd = new ArrayList(4);
    466468                                    toAdd.add(j);
    467                                     _timedJobs.remove(i);
    468                                     i--; // so the index stays consistent
     469                                    iter.remove();
    469470                                } else {
    470471                                    if ( (timeToWait <= 0) || (timeLeft < timeToWait) )
     
    520521    private void updateJobTimings(long delta) {
    521522        synchronized (_jobLock) {
    522             for (int i = 0; i < _timedJobs.size(); i++) {
    523                 Job j = _timedJobs.get(i);
     523            for (Job j : _timedJobs) {
    524524                j.getTiming().offsetChanged(delta);
    525525            }
     
    610610    }
    611611
    612     ////
    613     // the remainder are utility methods for dumping status info
    614     ////
    615    
     612    /**
     613     *  Dump the current state.
     614     *  For the router console jobs status page.
     615     *
     616     *  @param readyJobs out parameter
     617     *  @param timedJobs out parameter
     618     *  @param activeJobs out parameter
     619     *  @param justFinishedJobs out parameter
     620     *  @return number of job runners
     621     *  @since 0.8.9
     622     */
     623    public int getJobs(Collection<Job> readyJobs, Collection<Job> timedJobs,
     624                        Collection<Job> activeJobs, Collection<Job> justFinishedJobs) {
     625        for (JobQueueRunner runner :_queueRunners.values()) {
     626            Job job = runner.getCurrentJob();
     627            if (job != null) {
     628                activeJobs.add(job);
     629            } else {
     630                job = runner.getLastJob();
     631                if (job != null)
     632                    justFinishedJobs.add(job);
     633            }
     634        }
     635        synchronized (_jobLock) {
     636            readyJobs.addAll(_readyJobs);
     637            timedJobs.addAll(_timedJobs);
     638        }
     639        return _queueRunners.size();
     640    }
     641
     642    /**
     643     *  Current job stats.
     644     *  For the router console jobs status page.
     645     *
     646     *  @since 0.8.9
     647     */
     648    public Collection<JobStats> getJobStats() {
     649        return Collections.unmodifiableCollection(_jobStats.values());
     650    }
     651
     652    /** @deprecated moved to router console */
    616653    public void renderStatusHTML(Writer out) throws IOException {
    617         List<Job> readyJobs = null;
    618         List<Job> timedJobs = null;
    619         List<Job> activeJobs = new ArrayList(RUNNERS);
    620         List<Job> justFinishedJobs = new ArrayList(RUNNERS);
    621         //out.write("<!-- jobQueue rendering -->\n");
    622         out.flush();
    623        
    624         //int states[] = null;
    625         int numRunners = 0;
    626 
    627         {
    628             //states = new int[_queueRunners.size()];
    629             int i = 0;
    630             for (Iterator<JobQueueRunner> iter = _queueRunners.values().iterator(); iter.hasNext(); i++) {
    631                 JobQueueRunner runner = iter.next();
    632                 //states[i] = runner.getState();
    633                 Job job = runner.getCurrentJob();
    634                 if (job != null) {
    635                     activeJobs.add(job);
    636                 } else {
    637                     job = runner.getLastJob();
    638                     if (job != null)
    639                         justFinishedJobs.add(job);
    640                 }
    641             }
    642             numRunners = _queueRunners.size();
    643         }
    644        
    645 /*******
    646         StringBuilder str = new StringBuilder(128);
    647         str.append("<!-- after queueRunner sync: states: ");
    648         for (int i = 0; states != null && i < states.length; i++)
    649             str.append(states[i]).append(" ");
    650         str.append(" -->\n");
    651         str.append("<!-- jobs: ");
    652         for (int i = 0; i < activeJobs.size(); i++)
    653             str.append(activeJobs.get(i).toString()).append(" ");
    654         str.append("-->\n");
    655         out.write(str.toString());
    656         out.flush();
    657 *******/
    658        
    659         synchronized (_jobLock) {
    660             readyJobs = new ArrayList(_readyJobs);
    661             timedJobs = new ArrayList(_timedJobs);
    662         }
    663         //out.write("<!-- jobQueue rendering: after jobLock sync -->\n");
    664         //out.flush();
    665        
    666         StringBuilder buf = new StringBuilder(32*1024);
    667         buf.append("<b><div class=\"joblog\"><h3>I2P Job Queue</h3><div class=\"wideload\">Job runners: ").append(numRunners);
    668         //buf.append(" [states=");
    669         //if (states != null)
    670         //    for (int i = 0; i < states.length; i++)
    671         //        buf.append(states[i]).append(" ");
    672         //buf.append(']');
    673         buf.append("</b><br>\n");
    674 
    675         long now = _context.clock().now();
    676 
    677         buf.append("<hr><b>Active jobs: ").append(activeJobs.size()).append("</b><ol>\n");
    678         for (int i = 0; i < activeJobs.size(); i++) {
    679             Job j = activeJobs.get(i);
    680             buf.append("<li>[started ").append(DataHelper.formatDuration(now-j.getTiming().getStartAfter())).append(" ago]: ");
    681             buf.append(j.toString()).append("</li>\n");
    682         }
    683         buf.append("</ol>\n");
    684         buf.append("<hr><b>Just finished jobs: ").append(justFinishedJobs.size()).append("</b><ol>\n");
    685         for (int i = 0; i < justFinishedJobs.size(); i++) {
    686             Job j = justFinishedJobs.get(i);
    687             buf.append("<li>[finished ").append(DataHelper.formatDuration(now-j.getTiming().getActualEnd())).append(" ago]: ");
    688             buf.append(j.toString()).append("</li>\n");
    689         }
    690         buf.append("</ol>\n");
    691         buf.append("<hr><b>Ready/waiting jobs: ").append(readyJobs.size()).append("</b><ol>\n");
    692         for (int i = 0; i < readyJobs.size(); i++) {
    693             Job j = readyJobs.get(i);
    694             buf.append("<li>[waiting ");
    695             buf.append(DataHelper.formatDuration(now-j.getTiming().getStartAfter()));
    696             buf.append("]: ");
    697             buf.append(j.toString()).append("</li>\n");
    698         }
    699         buf.append("</ol>\n");
    700         out.flush();
    701 
    702         buf.append("<hr><b>Scheduled jobs: ").append(timedJobs.size()).append("</b><ol>\n");
    703         TreeMap<Long, Job> ordered = new TreeMap();
    704         for (int i = 0; i < timedJobs.size(); i++) {
    705             Job j = timedJobs.get(i);
    706             ordered.put(Long.valueOf(j.getTiming().getStartAfter()), j);
    707         }
    708         for (Iterator<Job> iter = ordered.values().iterator(); iter.hasNext(); ) {
    709             Job j = iter.next();
    710             long time = j.getTiming().getStartAfter() - now;
    711             buf.append("<li>").append(j.getName()).append(" in ");
    712             buf.append(DataHelper.formatDuration(time)).append("</li>\n");
    713         }
    714         buf.append("</ol></div>\n");
    715        
    716         //out.write("<!-- jobQueue rendering: after main buffer, before stats -->\n");
    717         out.flush();
    718        
    719         getJobStats(buf);
    720        
    721         //out.write("<!-- jobQueue rendering: after stats -->\n");
    722         out.flush();
    723        
    724         out.write(buf.toString());
    725     }
    726    
    727     /** render the HTML for the job stats */
    728     private void getJobStats(StringBuilder buf) {
    729         buf.append("<table>\n" +
    730                    "<tr><th>Job</th><th>Runs</th>" +
    731                    "<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>" +
    732                    "<th>Pending</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th></tr>\n");
    733         long totRuns = 0;
    734         long totExecTime = 0;
    735         long avgExecTime = 0;
    736         long maxExecTime = -1;
    737         long minExecTime = -1;
    738         long totPendingTime = 0;
    739         long avgPendingTime = 0;
    740         long maxPendingTime = -1;
    741         long minPendingTime = -1;
    742 
    743         TreeMap<String, JobStats> tstats = new TreeMap(_jobStats);
    744        
    745         for (Iterator<JobStats> iter = tstats.values().iterator(); iter.hasNext(); ) {
    746             JobStats stats = iter.next();
    747             buf.append("<tr>");
    748             buf.append("<td><b>").append(stats.getName()).append("</b></td>");
    749             buf.append("<td align=\"right\">").append(stats.getRuns()).append("</td>");
    750             buf.append("<td align=\"right\">").append(stats.getTotalTime()).append("</td>");
    751             buf.append("<td align=\"right\">").append(stats.getAvgTime()).append("</td>");
    752             buf.append("<td align=\"right\">").append(stats.getMaxTime()).append("</td>");
    753             buf.append("<td align=\"right\">").append(stats.getMinTime()).append("</td>");
    754             buf.append("<td align=\"right\">").append(stats.getTotalPendingTime()).append("</td>");
    755             buf.append("<td align=\"right\">").append(stats.getAvgPendingTime()).append("</td>");
    756             buf.append("<td align=\"right\">").append(stats.getMaxPendingTime()).append("</td>");
    757             buf.append("<td align=\"right\">").append(stats.getMinPendingTime()).append("</td>");
    758             buf.append("</tr>\n");
    759             totRuns += stats.getRuns();
    760             totExecTime += stats.getTotalTime();
    761             if (stats.getMaxTime() > maxExecTime)
    762                 maxExecTime = stats.getMaxTime();
    763             if ( (minExecTime < 0) || (minExecTime > stats.getMinTime()) )
    764                 minExecTime = stats.getMinTime();
    765             totPendingTime += stats.getTotalPendingTime();
    766             if (stats.getMaxPendingTime() > maxPendingTime)
    767                 maxPendingTime = stats.getMaxPendingTime();
    768             if ( (minPendingTime < 0) || (minPendingTime > stats.getMinPendingTime()) )
    769                 minPendingTime = stats.getMinPendingTime();
    770         }
    771 
    772         if (totRuns != 0) {
    773             if (totExecTime != 0)
    774                 avgExecTime = totExecTime / totRuns;
    775             if (totPendingTime != 0)
    776                 avgPendingTime = totPendingTime / totRuns;
    777         }
    778 
    779         buf.append("<tr class=\"tablefooter\">");
    780         buf.append("<td><b>").append("SUMMARY").append("</b></td>");
    781         buf.append("<td align=\"right\">").append(totRuns).append("</td>");
    782         buf.append("<td align=\"right\">").append(totExecTime).append("</td>");
    783         buf.append("<td align=\"right\">").append(avgExecTime).append("</td>");
    784         buf.append("<td align=\"right\">").append(maxExecTime).append("</td>");
    785         buf.append("<td align=\"right\">").append(minExecTime).append("</td>");
    786         buf.append("<td align=\"right\">").append(totPendingTime).append("</td>");
    787         buf.append("<td align=\"right\">").append(avgPendingTime).append("</td>");
    788         buf.append("<td align=\"right\">").append(maxPendingTime).append("</td>");
    789         buf.append("<td align=\"right\">").append(minPendingTime).append("</td>");
    790         buf.append("</tr></table></div>\n");
    791654    }
    792655}
  • router/java/src/net/i2p/router/JobStats.java

    rdc2198d r1e5fe1f6  
    33import net.i2p.data.DataHelper;
    44
    5 /** glorified struct to contain basic job stats */
    6 class JobStats {
     5/**
     6 *  Glorified struct to contain basic job stats.
     7 *  Public for router console only.
     8 */
     9public class JobStats {
    710    private final String _job;
    811    private volatile long _numRuns;
  • router/java/src/net/i2p/router/RouterVersion.java

    rdc2198d r1e5fe1f6  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 11;
     21    public final static long BUILD = 12;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.