Poll contacts in series rather than parallel.

This commit is contained in:
akwizgran
2018-03-05 11:24:15 +00:00
parent 46cd7e3719
commit da0a32c613

View File

@@ -26,7 +26,10 @@ import org.briarproject.bramble.util.StringUtils;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
@@ -252,28 +255,35 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
@Override
public void poll(Collection<ContactId> connected) {
if (!isRunning() || !shouldAllowContactConnections()) return;
backoff.increment();
// Try to connect to known devices in parallel
// Try to connect to known devices in a random order
Map<ContactId, TransportProperties> remote =
callback.getRemoteProperties();
List<Entry<ContactId, TransportProperties>> entries = new ArrayList<>();
for (Entry<ContactId, TransportProperties> e : remote.entrySet()) {
ContactId c = e.getKey();
if (connected.contains(c)) continue;
String address = e.getValue().get(PROP_ADDRESS);
if (StringUtils.isNullOrEmpty(address)) continue;
String uuid = e.getValue().get(PROP_UUID);
if (StringUtils.isNullOrEmpty(uuid)) continue;
ioExecutor.execute(() -> {
if (connected.contains(e.getKey())) continue;
TransportProperties p = e.getValue();
if (StringUtils.isNullOrEmpty(p.get(PROP_ADDRESS))) continue;
if (StringUtils.isNullOrEmpty(p.get(PROP_UUID))) continue;
entries.add(e);
}
if (entries.isEmpty()) return;
Collections.shuffle(entries);
backoff.increment();
ioExecutor.execute(() -> {
for (Entry<ContactId, TransportProperties> e : entries) {
if (!isRunning() || !shouldAllowContactConnections()) return;
if (!connectionLimiter.canOpenContactConnection()) return;
TransportProperties p = e.getValue();
String address = p.get(PROP_ADDRESS);
String uuid = p.get(PROP_UUID);
DuplexTransportConnection conn = connect(address, uuid);
if (conn != null) {
backoff.reset();
if (connectionLimiter.contactConnectionOpened(conn))
callback.outgoingConnectionCreated(c, conn);
callback.outgoingConnectionCreated(e.getKey(), conn);
}
});
}
}
});
}
@Nullable