From 6dcad6c42539a3465ffe1ed7de1896982f93e130 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 4 Jun 2020 11:16:05 +0100 Subject: [PATCH] Count stable connections, but don't impose a connection limit. --- .../AndroidBluetoothPluginFactory.java | 2 +- .../AndroidBluetoothTransportConnection.java | 2 +- .../bluetooth/BluetoothConnectionLimiter.java | 11 +++++++- .../BluetoothConnectionLimiterImpl.java | 27 +++++++++++++++++-- .../bramble/plugin/DesktopPluginModule.java | 6 +++-- .../bluetooth/JavaBluetoothPluginFactory.java | 7 +++-- .../JavaBluetoothTransportConnection.java | 2 +- 7 files changed, 47 insertions(+), 10 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java index 9ebabbd66..5fd73d285 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java @@ -67,7 +67,7 @@ public class AndroidBluetoothPluginFactory implements DuplexPluginFactory { @Override public DuplexPlugin createPlugin(PluginCallback callback) { BluetoothConnectionLimiter connectionLimiter = - new BluetoothConnectionLimiterImpl(eventBus); + new BluetoothConnectionLimiterImpl(eventBus, clock); Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, MAX_POLLING_INTERVAL, BACKOFF_BASE); AndroidBluetoothPlugin plugin = new AndroidBluetoothPlugin( diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java index bf6b3d69f..20876a814 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java @@ -50,7 +50,7 @@ class AndroidBluetoothTransportConnection try { socket.close(); } finally { - connectionLimiter.connectionClosed(this); + connectionLimiter.connectionClosed(this, exception); } } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiter.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiter.java index c3b115e58..e72b6779a 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiter.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiter.java @@ -3,9 +3,16 @@ package org.briarproject.bramble.plugin.bluetooth; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; +import static java.util.concurrent.TimeUnit.SECONDS; + @NotNullByDefault interface BluetoothConnectionLimiter { + /** + * How long a connection must remain open before it's considered stable. + */ + long STABILITY_PERIOD_MS = SECONDS.toMillis(90); + /** * Informs the limiter that key agreement has started. */ @@ -29,8 +36,10 @@ interface BluetoothConnectionLimiter { /** * Informs the limiter that the given connection has been closed. + * + * @param exception True if the connection was closed due to an exception. */ - void connectionClosed(DuplexTransportConnection conn); + void connectionClosed(DuplexTransportConnection conn, boolean exception); /** * Informs the limiter that all connections have been closed. diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiterImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiterImpl.java index e76bbafc6..612bf857f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiterImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothConnectionLimiterImpl.java @@ -4,6 +4,7 @@ import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.sync.event.CloseSyncConnectionsEvent; +import org.briarproject.bramble.api.system.Clock; import java.util.LinkedList; import java.util.List; @@ -24,6 +25,7 @@ class BluetoothConnectionLimiterImpl implements BluetoothConnectionLimiter { getLogger(BluetoothConnectionLimiterImpl.class.getName()); private final EventBus eventBus; + private final Clock clock; private final Object lock = new Object(); @GuardedBy("lock") @@ -31,9 +33,12 @@ class BluetoothConnectionLimiterImpl implements BluetoothConnectionLimiter { new LinkedList<>(); @GuardedBy("lock") private boolean keyAgreementInProgress = false; + @GuardedBy("lock") + private long timeOfLastChange = 0; - BluetoothConnectionLimiterImpl(EventBus eventBus) { + BluetoothConnectionLimiterImpl(EventBus eventBus, Clock clock) { this.eventBus = eventBus; + this.clock = clock; } @Override @@ -69,7 +74,10 @@ class BluetoothConnectionLimiterImpl implements BluetoothConnectionLimiter { @Override public void connectionOpened(DuplexTransportConnection conn) { synchronized (lock) { + long now = clock.currentTimeMillis(); + countStableConnections(now); connections.add(conn); + timeOfLastChange = now; if (LOG.isLoggable(INFO)) { LOG.info("Connection opened, " + connections.size() + " open"); } @@ -77,9 +85,13 @@ class BluetoothConnectionLimiterImpl implements BluetoothConnectionLimiter { } @Override - public void connectionClosed(DuplexTransportConnection conn) { + public void connectionClosed(DuplexTransportConnection conn, + boolean exception) { synchronized (lock) { + long now = clock.currentTimeMillis(); + if (!exception) countStableConnections(now); connections.remove(conn); + timeOfLastChange = now; if (LOG.isLoggable(INFO)) { LOG.info("Connection closed, " + connections.size() + " open"); } @@ -89,8 +101,19 @@ class BluetoothConnectionLimiterImpl implements BluetoothConnectionLimiter { @Override public void allConnectionsClosed() { synchronized (lock) { + long now = clock.currentTimeMillis(); + countStableConnections(now); connections.clear(); + timeOfLastChange = now; LOG.info("All connections closed"); } } + + private void countStableConnections(long now) { + if (now - timeOfLastChange >= STABILITY_PERIOD_MS) { + if (LOG.isLoggable(INFO)) { + LOG.info(connections.size() + " connections are stable"); + } + } + } } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java index 53578ccc4..12a1e81bc 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java @@ -13,6 +13,7 @@ import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.reliability.ReliabilityLayerFactory; +import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.plugin.bluetooth.JavaBluetoothPluginFactory; import org.briarproject.bramble.plugin.modem.ModemPluginFactory; import org.briarproject.bramble.plugin.tcp.LanTcpPluginFactory; @@ -39,10 +40,11 @@ public class DesktopPluginModule extends PluginModule { PluginConfig getPluginConfig(@IoExecutor Executor ioExecutor, SecureRandom random, BackoffFactory backoffFactory, ReliabilityLayerFactory reliabilityFactory, - ShutdownManager shutdownManager, EventBus eventBus, + ShutdownManager shutdownManager, EventBus eventBus, Clock clock, TimeoutMonitor timeoutMonitor) { DuplexPluginFactory bluetooth = new JavaBluetoothPluginFactory( - ioExecutor, random, eventBus, timeoutMonitor, backoffFactory); + ioExecutor, random, eventBus, clock, timeoutMonitor, + backoffFactory); DuplexPluginFactory modem = new ModemPluginFactory(ioExecutor, reliabilityFactory); DuplexPluginFactory lan = new LanTcpPluginFactory(ioExecutor, diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothPluginFactory.java index c931061cd..3e608b87b 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothPluginFactory.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothPluginFactory.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; +import org.briarproject.bramble.api.system.Clock; import java.security.SecureRandom; import java.util.concurrent.Executor; @@ -30,15 +31,17 @@ public class JavaBluetoothPluginFactory implements DuplexPluginFactory { private final Executor ioExecutor; private final SecureRandom secureRandom; private final EventBus eventBus; + private final Clock clock; private final TimeoutMonitor timeoutMonitor; private final BackoffFactory backoffFactory; public JavaBluetoothPluginFactory(Executor ioExecutor, - SecureRandom secureRandom, EventBus eventBus, + SecureRandom secureRandom, EventBus eventBus, Clock clock, TimeoutMonitor timeoutMonitor, BackoffFactory backoffFactory) { this.ioExecutor = ioExecutor; this.secureRandom = secureRandom; this.eventBus = eventBus; + this.clock = clock; this.timeoutMonitor = timeoutMonitor; this.backoffFactory = backoffFactory; } @@ -56,7 +59,7 @@ public class JavaBluetoothPluginFactory implements DuplexPluginFactory { @Override public DuplexPlugin createPlugin(PluginCallback callback) { BluetoothConnectionLimiter connectionLimiter = - new BluetoothConnectionLimiterImpl(eventBus); + new BluetoothConnectionLimiterImpl(eventBus, clock); Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, MAX_POLLING_INTERVAL, BACKOFF_BASE); JavaBluetoothPlugin plugin = new JavaBluetoothPlugin(connectionLimiter, diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothTransportConnection.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothTransportConnection.java index 319d9af76..12e7630e8 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothTransportConnection.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/bluetooth/JavaBluetoothTransportConnection.java @@ -45,7 +45,7 @@ class JavaBluetoothTransportConnection try { stream.close(); } finally { - connectionLimiter.connectionClosed(this); + connectionLimiter.connectionClosed(this, exception); } } }