Changeset 8937c4b


Ignore:
Timestamp:
Jul 17, 2013 6:13:42 PM (7 years ago)
Author:
zab2 <zab2@…>
Branches:
master
Children:
171f0d2
Parents:
2902a708
Message:

Store stdev of rtt in the TCB cache as per RFC 2140

Location:
apps
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java

    r2902a708 r8937c4b  
    9494    }
    9595   
     96    protected static double getDouble(Properties opts, String name, double defaultVal) {
     97        if (opts == null) return defaultVal;
     98        String val = opts.getProperty(name);
     99        if (val == null) {
     100            return defaultVal;
     101        } else {
     102            try {
     103                return Double.parseDouble(val);
     104            } catch (NumberFormatException nfe) {
     105                return defaultVal;
     106            }
     107        }
     108    }
     109   
    96110    /**
    97111     * How long we will wait for the ACK from a SYN, in milliseconds.
  • apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java

    r2902a708 r8937c4b  
    518518    public int getRTT() { return _rtt; }
    519519    public void setRTT(int ms) {
    520         if (_rto == 0) {
     520        if (_rto == 0) { // TODO: move this out
    521521            _rttDev = ms / 2;
    522522            _rto = ms + ms / 2;
     
    540540    public int getRTO() { return _rto; }
    541541
    542     /** for debugging @since 0.7.13 */
     542    /** used in TCB @since 0.9.8 */
    543543    int getRTTDev() { return _rttDev; }
     544    /** used in TCB @since 0.9.8 */
     545    void setRTTDev(int rttDev) { _rttDev = rttDev; }
    544546   
    545547    /**
  • apps/streaming/java/src/net/i2p/client/streaming/TCBShare.java

    r2902a708 r8937c4b  
    99import net.i2p.util.Log;
    1010import net.i2p.util.SimpleTimer2;
     11
     12import static net.i2p.client.streaming.I2PSocketOptionsImpl.getDouble;
    1113
    1214/**
     
    2628    private final Map<Destination, Entry> _cache;
    2729    private final CleanEvent _cleaner;
     30    private final double _rttDampening, _wdwDampening, _rttDevDampening;
    2831
    2932    private static final long EXPIRE_TIME = 30*60*1000;
    3033    private static final long CLEAN_TIME = 10*60*1000;
     34    ///// constants defined in rfc 2140
     35    ///// do not change unless you know what you're doing
    3136    private static final double RTT_DAMPENING = 0.75;
     37    private static final double RTTDEV_DAMPENING = 0.75;
    3238    private static final double WDW_DAMPENING = 0.75;
     39    private static final String RTT_DAMP_PROP="i2p.streaming.tcbcache.rttDampening";
     40    private static final String WDW_DAMP_PROP="i2p.streaming.tcbcache.wdwDampening";
     41    private static final String RTTDEV_DAMP_PROP="i2p.streaming.tcbcache.rttDampening";
     42    /////
    3343    private static final int MAX_RTT = ((int) Connection.MAX_RESEND_DELAY) / 2;
     44    private static final int MAX_RTT_DEV = (int) (MAX_RTT * 1.5);
    3445    private static final int MAX_WINDOW_SIZE = ConnectionPacketHandler.MAX_SLOW_START_WINDOW;
    3546   
     
    3748        _context = ctx;
    3849        _log = ctx.logManager().getLog(TCBShare.class);
     50       
     51        _rttDampening = getDouble(ctx.getProperties(), RTT_DAMP_PROP, RTT_DAMPENING);
     52        _wdwDampening = getDouble(ctx.getProperties(), WDW_DAMP_PROP, WDW_DAMPENING);
     53        _rttDevDampening = getDouble(ctx.getProperties(), RTTDEV_DAMP_PROP, RTTDEV_DAMPENING);
     54       
    3955        _cache = new ConcurrentHashMap<Destination,Entry>(4);
    4056        _cleaner = new CleanEvent(timer);
    4157        _cleaner.schedule(CLEAN_TIME);
     58       
     59        if (_log.shouldLog(Log.DEBUG)) {
     60            String log = "Creating TCBCache with rttDamp=%s, rttDevDamp=%s, wdwDamp=%s, "+
     61                    "expire=%d, clean=%d";
     62            log = String.format(log,_rttDampening,_rttDevDampening,_wdwDampening,
     63                    EXPIRE_TIME,CLEAN_TIME);
     64             _log.debug(log);
     65        }
    4266    }
    4367
     
    6185        if (e == null || e.isExpired())
    6286            return;
    63         if (_log.shouldLog(Log.DEBUG))
     87        final int rtt, rttDev, wdw;
     88        synchronized(e) {
     89            rtt = e.getRTT();
     90            rttDev = e.getRTTDev();
     91            wdw = e.getWindowSize();
     92        }
     93        if (_log.shouldLog(Log.DEBUG)) {
    6494            _log.debug("From cache: " +
    6595                       con.getSession().getMyDestination().calculateHash().toBase64().substring(0, 4) +
    6696                       '-' +
    6797                       dest.calculateHash().toBase64().substring(0, 4) +
    68                        " RTT: " + e.getRTT() + " wdw: " + e.getWindowSize());
    69         opts.setRTT(e.getRTT());
    70         opts.setWindowSize(e.getWindowSize());
     98                       " RTT: " + rtt +
     99                       " RTTDev: "+ rttDev +
     100                       " wdw: " + wdw );
     101        }
     102        opts.setRTT(rtt);
     103        opts.setRTTDev(rttDev);
     104        opts.setWindowSize(wdw);
    71105    }
    72106
     
    83117        int old = -1;
    84118        int oldw = -1;
     119        int oldDev = -1;
    85120        Entry e = _cache.get(dest);
    86121        if (e == null || e.isExpired()) {
    87             e = new Entry(opts.getRTT(), opts.getWindowSize());
     122            e = new Entry(opts.getRTT(), opts.getWindowSize(), opts.getRTTDev());
    88123            _cache.put(dest, e);
    89124        } else {
     
    91126                old = e.getRTT();
    92127                oldw = e.getWindowSize();
     128                oldDev = e.getRTTDev();
    93129                e.setRTT(opts.getRTT());
    94130                e.setWindowSize(opts.getWindowSize());
     131                e.setRTTDev(opts.getRTTDev());
    95132            }
    96133        }
    97         if (_log.shouldLog(Log.DEBUG))
     134        if (_log.shouldLog(Log.DEBUG)) {
    98135            _log.debug("To cache: " +
    99136                       con.getSession().getMyDestination().calculateHash().toBase64().substring(0, 4) +
     
    101138                       dest.calculateHash().toBase64().substring(0, 4) +
    102139                       " old: " + old + " con: " + opts.getRTT() + " new: " + e.getRTT() +
     140                       " oldDev: " + oldDev + " conDev: " + opts.getRTTDev() + " newDev: " + e.getRTTDev() +
    103141                       " oldw: " + oldw + " conw: " + opts.getWindowSize() + " neww: " + e.getWindowSize());
     142        }
    104143    }
    105144
     
    107146        int _rtt;
    108147        int _wdw;
     148        int _rttDev;
    109149        long _updated;
    110150
    111         public Entry(int ms, int wdw) {
     151        public Entry(int ms, int wdw, int rttDev) {
    112152            _rtt = ms;
    113153            _wdw = wdw;
     154            _rttDev = rttDev;
    114155            _updated = _context.clock().now();
    115156        }
    116157        public synchronized int getRTT() { return _rtt; }
    117158        public synchronized void setRTT(int ms) {
    118             _rtt = (int)(RTT_DAMPENING*_rtt + (1-RTT_DAMPENING)*ms);       
     159            _rtt = (int)(_rttDampening*_rtt + (1-_rttDampening)*ms);       
    119160            if (_rtt > MAX_RTT)
    120161                _rtt = MAX_RTT;
    121162            _updated = _context.clock().now();
    122163        }
     164        public synchronized int getRTTDev() { return _rttDev; }
     165        public synchronized void setRTTDev(int count) {
     166            _rttDev = (int)(_rttDevDampening*_rttDev + (1-_rttDevDampening)*count);       
     167            if (_rttDev > MAX_RTT_DEV)
     168                _rttDev = MAX_RTT_DEV;
     169            _updated = _context.clock().now();
     170        }
    123171        public synchronized int getWindowSize() { return _wdw; }
    124172        public synchronized void setWindowSize(int wdw) {
    125             _wdw = (int)(0.5 + WDW_DAMPENING*_wdw + (1-WDW_DAMPENING)*wdw);       
     173            _wdw = (int)(0.5 + _wdwDampening*_wdw + (1-_wdwDampening)*wdw);       
    126174            if (_wdw > MAX_WINDOW_SIZE)
    127175                _wdw = MAX_WINDOW_SIZE;
Note: See TracChangeset for help on using the changeset viewer.