From 6f5f4d179be0a018ce30e86cdaba3032e10d97b5 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 4 Jul 2013 14:54:46 +0000 Subject: [PATCH] * Streaming: - Don't stop timers when session disconnects (tickets #644, #810) - Throw exception on attempt to use destroyed socket manager - Clear TCBShare cache when stopped - Javadocs --- .../src/net/i2p/client/streaming/Connection.java | 2 +- .../net/i2p/client/streaming/ConnectionManager.java | 13 +++++++++++++ .../i2p/client/streaming/I2PSocketManagerFull.java | 9 +++++++-- .../java/src/net/i2p/client/streaming/TCBShare.java | 4 ++++ core/java/src/net/i2p/util/SimpleTimer2.java | 1 + history.txt | 5 +++++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- 7 files changed, 32 insertions(+), 4 deletions(-) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java index dce484500c..39f8de817b 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java @@ -990,7 +990,7 @@ class Connection { // fall through default: if (_log.shouldLog(Log.WARN)) - _log.warn("Closing connection due to inactivity"); + _log.warn("Closing (inactivity) " + toString()); if (_log.shouldLog(Log.DEBUG)) { StringBuilder buf = new StringBuilder(128); buf.append("last sent was: ").append(_context.clock().now() - _lastSendTime); diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java index 57e485a517..8e108f27dd 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java @@ -484,6 +484,7 @@ class ConnectionManager { * Something b0rked hard, so kill all of our connections without mercy. * Don't bother sending close packets. * + * CAN continue to use the manager. */ public void disconnectAllHard() { for (Iterator iter = _connectionByInboundId.values().iterator(); iter.hasNext(); ) { @@ -491,6 +492,18 @@ class ConnectionManager { con.disconnect(false, false); iter.remove(); } + } + + /** + * Kill all connections and the timers. + * Don't bother sending close packets. + * + * CANNOT continue to use the manager or restart. + * + * @since 0.9.7 + */ + public void shutdown() { + disconnectAllHard(); _tcbShare.stop(); _timer.stop(); } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java index 768f59c938..2e65bd0aea 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java @@ -38,6 +38,7 @@ public class I2PSocketManagerFull implements I2PSocketManager { private String _name; private static int __managerId = 0; private final ConnectionManager _connectionManager; + private volatile boolean _isDestroyed; /** * How long to wait for the client app to accept() before sending back CLOSE? @@ -200,6 +201,8 @@ public class I2PSocketManagerFull implements I2PSocketManager { } private void verifySession() throws I2PException { + if (_isDestroyed) + throw new I2PException("destroyed"); if (!_connectionManager.getSession().isClosed()) return; _connectionManager.getSession().connect(); @@ -304,12 +307,14 @@ public class I2PSocketManagerFull implements I2PSocketManager { /** * Destroy the socket manager, freeing all the associated resources. This - * method will block untill all the managed sockets are closed. + * method will block until all the managed sockets are closed. * + * CANNOT be restarted. */ public void destroySocketManager() { + _isDestroyed = true; _connectionManager.setAllowIncomingConnections(false); - _connectionManager.disconnectAllHard(); + _connectionManager.shutdown(); // should we destroy the _session too? // yes, since the old lib did (and SAM wants it to, and i dont know why not) if ( (_session != null) && (!_session.isClosed()) ) { diff --git a/apps/streaming/java/src/net/i2p/client/streaming/TCBShare.java b/apps/streaming/java/src/net/i2p/client/streaming/TCBShare.java index d412aa36a1..3925af49be 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/TCBShare.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/TCBShare.java @@ -41,8 +41,12 @@ class TCBShare { _cleaner.schedule(CLEAN_TIME); } + /** + * Cannot be restarted. + */ public void stop() { _cleaner.cancel(); + _cache.clear(); } /** retrieve from cache */ diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index ab8cf05269..e22b6fb709 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -87,6 +87,7 @@ public class SimpleTimer2 { /** * Stops the SimpleTimer. * Subsequent executions should not throw a RejectedExecutionException. + * Cannot be restarted. */ public void stop() { _executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); diff --git a/history.txt b/history.txt index 9ed17d2895..18532e2143 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,8 @@ +2013-07-04 zzz + * Streaming: + - Don't stop timers when session disconnects (tickets #644, #810) + - Throw exception on attempt to use destroyed socket manager + 2013-07-03 zzz * Console: Hide dead tunnel pools on /tunnels * Updater: Fix plugin update checker (ticket #897) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 421ff4f630..098e16d499 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 16; + public final static long BUILD = 17; /** for example "-test" */ public final static String EXTRA = "-rc";