* Increased the default minimum tunnel test time to 5 seconds, since we
still see the occational message processing time spike to 2 seconds.
* Update the SimpleTimer to allow rescheduling a task thats already
queued (useful for the new streaming lib).
* Replaced old minimum tunnel test timeout of 1s with a configurable
value (router.config property "router.tunnelTestMinimum", with the
default of 2s).
* Tunnel rejection is no longer a sign of an overwhelmingly loaded
peer, so don't use it as a key point of the IsFailing calculator.
We still use it as a key point of the Capacity calculator, however.
* Allow for a configurable tunnel "growth factor", rather than trying
to achieve a steady state. This will let us grow gradually when
the router is needed more, rather than blindly accepting the request
or arbitrarily choking it at an averaged value. Configure this with
"router.tunnelGrowthFactor" in the router.config (default "1.5").
* Adjust the tunnel test timeouts dynamically - rather than the old
flat 30s (!!!) timeout, we set the timeout to 2x the average tunnel
test time (the deviation factor can be adjusted by setting
"router.tunnelTestDeviation" to "3.0" or whatever). This should help
find the 'good' tunnels.
* Added some crazy debugging to try and track down an intermittent hang.
* Fix the probabalistic tunnel reject (we always accepted everything,
since the docs on java.util.Random.nextDouble() are wrong..)
* Fixed a race on startup (thanks Quadn!)
* Disable the probabalistic drop by default (enable via the router config
property "tcp.dropProbabalistically=true")
* Disable the actual watchdog shutdown by default, but keep track of more
variables and log a lot more when it occurs (enable via the router
config property "watchdog.haltOnHang=true")
* Implement some tunnel participation smoothing by refusing requests
probabalistically as our participating tunnel count exceeds the previous
hour's, or when the 10 minute average tunnel test time exceeds the 60
minute average tunnel test time. The probabilities in both cases are
oldAverage / #current, so if you're suddenly flooded with 200 tunnels
and you had previously only participated in 50, you'll have a 25% chance
of accepting a subsequent request.
* Added a watchdog timer to do some baseline liveliness checking to help
debug some odd errors.
* Added a pair of summary stats for bandwidth usage, allowing easy export
with the other stats ("bw.sendBps" and "bw.receiveBps")
* Trimmed another memory allocation on message reception.
* Don't kill the establisher threads during a soft restart.
* Attempt to validate the peer's routerInfo earlier during handshaking.
* Revamp the AESOutputStream so it doesn't allocate any temporary objects
during its operation.
* Reimplement the I2NP reading with less temporary memory allocation.
There is still significant GC churn, especially under load, but this
should help.
* Catch some oddball errors in the transport (message timeout while
establishing).
* Expire queued messages even when the writer is blocked.
* Reimplement most of the I2NP writing with less temporary memory
allocations (I2NP reading still gobbles memory).
* Implement an active queue management scheme on the TCP transports,
dropping messages probabalistically as the queue fills up. The
estimated queue capacity is determined by the rate at which messages
have been sent to the peer (averaged at 1, 5, and 60m periods). As
we exceed 1/2 of the estimated capacity, we drop messages throughout
the queue probabalistically with regards to their size. This is based
on RFC 2309's RED, with the minimum threshold set to 1/2 the
estimated connection capacity. We may want to consider using a send
rate and queue size measured across all connections, to deal with our
own local bandwidth saturation, but we'll try the per-con metrics first.
* Enable explicit disabling of the systray entirely for windows machines
with strange configurations: add -Dsystray.disable=true to the java
command line. (thanks mihi!)
* Don't go into a fast busy if an I2PTunnel 'server' is explicitly killed
(thanks mule!)
* Handle some more error conditions regarding abruptly closing sockets
(thanks Jonva!)
* Update the shitlist to reject a peer for an exponentially increasing
period of time (with an upper bounds of an hour).
* Various minor stat and debugging fixes
* Add a new stat logging component to optionally dump the raw stats to
disk as they are generated, rather than rely upon the summarized data.
By default, this is off, but the router property "stat.logFilters" can
be set to a comma delimited list of stats (e.g. "client.sendAckTime")
which will be written to the file "stats.log" (or whatever the property
"stat.logFile" is set to). This can also log profile related stats,
such as "dbResponseTime" or "tunnelTestResponseTime".
* Assure that we quickly fail messages bound for shitlisted peers.
* Address a race on startup where the first peer contacted could hang the
router (thanks Romster!)
* Only whine about an intermittent inability to query the time server once
* Command line utility to verify a peer's reachability - simply run
net.i2p.router.transport.tcp.ConnectionHandler hostname port# and it
will print out whether that peer is reachable or not (using a simple
verification handshake).