* 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
This commit is contained in:
zzz
2013-07-04 14:54:46 +00:00
parent b9a5dd48f6
commit 6f5f4d179b
7 changed files with 32 additions and 4 deletions

View File

@@ -990,7 +990,7 @@ class Connection {
// fall through // fall through
default: default:
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("Closing connection due to inactivity"); _log.warn("Closing (inactivity) " + toString());
if (_log.shouldLog(Log.DEBUG)) { if (_log.shouldLog(Log.DEBUG)) {
StringBuilder buf = new StringBuilder(128); StringBuilder buf = new StringBuilder(128);
buf.append("last sent was: ").append(_context.clock().now() - _lastSendTime); buf.append("last sent was: ").append(_context.clock().now() - _lastSendTime);

View File

@@ -484,6 +484,7 @@ class ConnectionManager {
* Something b0rked hard, so kill all of our connections without mercy. * Something b0rked hard, so kill all of our connections without mercy.
* Don't bother sending close packets. * Don't bother sending close packets.
* *
* CAN continue to use the manager.
*/ */
public void disconnectAllHard() { public void disconnectAllHard() {
for (Iterator<Connection> iter = _connectionByInboundId.values().iterator(); iter.hasNext(); ) { for (Iterator<Connection> iter = _connectionByInboundId.values().iterator(); iter.hasNext(); ) {
@@ -491,6 +492,18 @@ class ConnectionManager {
con.disconnect(false, false); con.disconnect(false, false);
iter.remove(); 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(); _tcbShare.stop();
_timer.stop(); _timer.stop();
} }

View File

@@ -38,6 +38,7 @@ public class I2PSocketManagerFull implements I2PSocketManager {
private String _name; private String _name;
private static int __managerId = 0; private static int __managerId = 0;
private final ConnectionManager _connectionManager; private final ConnectionManager _connectionManager;
private volatile boolean _isDestroyed;
/** /**
* How long to wait for the client app to accept() before sending back CLOSE? * 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 { private void verifySession() throws I2PException {
if (_isDestroyed)
throw new I2PException("destroyed");
if (!_connectionManager.getSession().isClosed()) if (!_connectionManager.getSession().isClosed())
return; return;
_connectionManager.getSession().connect(); _connectionManager.getSession().connect();
@@ -304,12 +307,14 @@ public class I2PSocketManagerFull implements I2PSocketManager {
/** /**
* Destroy the socket manager, freeing all the associated resources. This * 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() { public void destroySocketManager() {
_isDestroyed = true;
_connectionManager.setAllowIncomingConnections(false); _connectionManager.setAllowIncomingConnections(false);
_connectionManager.disconnectAllHard(); _connectionManager.shutdown();
// should we destroy the _session too? // should we destroy the _session too?
// yes, since the old lib did (and SAM wants it to, and i dont know why not) // yes, since the old lib did (and SAM wants it to, and i dont know why not)
if ( (_session != null) && (!_session.isClosed()) ) { if ( (_session != null) && (!_session.isClosed()) ) {

View File

@@ -41,8 +41,12 @@ class TCBShare {
_cleaner.schedule(CLEAN_TIME); _cleaner.schedule(CLEAN_TIME);
} }
/**
* Cannot be restarted.
*/
public void stop() { public void stop() {
_cleaner.cancel(); _cleaner.cancel();
_cache.clear();
} }
/** retrieve from cache */ /** retrieve from cache */

View File

@@ -87,6 +87,7 @@ public class SimpleTimer2 {
/** /**
* Stops the SimpleTimer. * Stops the SimpleTimer.
* Subsequent executions should not throw a RejectedExecutionException. * Subsequent executions should not throw a RejectedExecutionException.
* Cannot be restarted.
*/ */
public void stop() { public void stop() {
_executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); _executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());

View File

@@ -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 2013-07-03 zzz
* Console: Hide dead tunnel pools on /tunnels * Console: Hide dead tunnel pools on /tunnels
* Updater: Fix plugin update checker (ticket #897) * Updater: Fix plugin update checker (ticket #897)

View File

@@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */ /** deprecated */
public final static String ID = "Monotone"; public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION; public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 16; public final static long BUILD = 17;
/** for example "-test" */ /** for example "-test" */
public final static String EXTRA = "-rc"; public final static String EXTRA = "-rc";