fix connection pool not handling removes
This commit is contained in:
parent
0c4771e2a8
commit
b2414434dc
|
@ -34,7 +34,8 @@ public class Account extends AccountIdentifier {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hashCode(super.hashCode(), randomSeed);
|
// careful with hashCode and equals for byte arrays
|
||||||
|
return Objects.hashCode(super.hashCode(), Arrays.hashCode(randomSeed));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOnion() {
|
public boolean isOnion() {
|
||||||
|
|
|
@ -15,6 +15,7 @@ import im.conversations.android.database.model.AccountIdentifier;
|
||||||
import im.conversations.android.database.model.Connection;
|
import im.conversations.android.database.model.Connection;
|
||||||
import im.conversations.android.tls.ScopeFingerprint;
|
import im.conversations.android.tls.ScopeFingerprint;
|
||||||
import im.conversations.android.xmpp.ConnectionPool;
|
import im.conversations.android.xmpp.ConnectionPool;
|
||||||
|
import im.conversations.android.xmpp.ConnectionState;
|
||||||
import im.conversations.android.xmpp.XmppConnection;
|
import im.conversations.android.xmpp.XmppConnection;
|
||||||
import im.conversations.android.xmpp.manager.RegistrationManager;
|
import im.conversations.android.xmpp.manager.RegistrationManager;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -129,6 +130,13 @@ public class AccountRepository extends AbstractRepository {
|
||||||
return database.accountDao().getAccounts();
|
return database.accountDao().getAccounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ConnectionState getConnectionState(final Account account) {
|
||||||
|
return ConnectionPool.getInstance(context)
|
||||||
|
.get(account)
|
||||||
|
.transform(XmppConnection::getStatus)
|
||||||
|
.orNull();
|
||||||
|
}
|
||||||
|
|
||||||
public LiveData<Boolean> hasNoAccounts() {
|
public LiveData<Boolean> hasNoAccounts() {
|
||||||
return database.accountDao().hasNoAccounts();
|
return database.accountDao().hasNoAccounts();
|
||||||
}
|
}
|
||||||
|
|
|
@ -263,7 +263,13 @@ public class SetupViewModel extends AndroidViewModel {
|
||||||
private void setAccount(@NonNull final Account account) {
|
private void setAccount(@NonNull final Account account) {
|
||||||
this.account = account;
|
this.account = account;
|
||||||
this.registerTrustDecisionCallback();
|
this.registerTrustDecisionCallback();
|
||||||
// TODO if the connection is already TLS_ERROR then do a quick reconnect
|
final var state = this.accountRepository.getConnectionState(account);
|
||||||
|
if (Arrays.asList(ConnectionState.TLS_ERROR).contains(state)) {
|
||||||
|
LOGGER.info(
|
||||||
|
"Connection had already failed when trust decision callback was registered."
|
||||||
|
+ " reconnecting");
|
||||||
|
this.accountRepository.reconnect(account);
|
||||||
|
}
|
||||||
this.decideNextStep(Target.ENTER_ADDRESS, account);
|
this.decideNextStep(Target.ENTER_ADDRESS, account);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,11 @@ public class ConnectionPool {
|
||||||
final Set<Account> current = getAccounts();
|
final Set<Account> current = getAccounts();
|
||||||
final Set<Account> removed = Sets.difference(current, accounts);
|
final Set<Account> removed = Sets.difference(current, accounts);
|
||||||
final Set<Account> added = Sets.difference(accounts, current);
|
final Set<Account> added = Sets.difference(accounts, current);
|
||||||
|
LOGGER.info(
|
||||||
|
"reconfiguring. current {} added {} removed {}",
|
||||||
|
current.size(),
|
||||||
|
added.size(),
|
||||||
|
removed.size());
|
||||||
for (final Account account : added) {
|
for (final Account account : added) {
|
||||||
this.setupXmppConnection(context, account);
|
this.setupXmppConnection(context, account);
|
||||||
}
|
}
|
||||||
|
@ -145,10 +150,14 @@ public class ConnectionPool {
|
||||||
final Optional<XmppConnection> connectionOptional =
|
final Optional<XmppConnection> connectionOptional =
|
||||||
Iterables.tryFind(connections, c -> c.getAccount().equals(account));
|
Iterables.tryFind(connections, c -> c.getAccount().equals(account));
|
||||||
if (connectionOptional.isPresent()) {
|
if (connectionOptional.isPresent()) {
|
||||||
final XmppConnection connection = connectionOptional.get();
|
final var connection = connectionOptional.get();
|
||||||
|
if (connections.remove(connection)) {
|
||||||
|
LOGGER.info("Removed connection for {}", account.address);
|
||||||
|
}
|
||||||
disconnect(connection, false);
|
disconnect(connection, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LOGGER.info("now managing {} connections", connections.size());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue