Pass the reason for displacement to presence displacement listeners

This commit is contained in:
Jon Chambers
2022-03-09 16:54:43 -05:00
committed by Jon Chambers
parent 1dd7d33e23
commit 1ba00a66eb
4 changed files with 16 additions and 16 deletions

View File

@@ -158,7 +158,7 @@ public class ClientPresenceManager extends RedisClusterPubSubAdapter<String, Str
try (final Timer.Context ignored = setPresenceTimer.time()) {
final String presenceKey = getPresenceKey(accountUuid, deviceId);
displacePresence(presenceKey);
displacePresence(presenceKey, true);
displacementListenersByPresenceKey.put(presenceKey, displacementListener);
@@ -182,7 +182,7 @@ public class ClientPresenceManager extends RedisClusterPubSubAdapter<String, Str
final String presenceKey = getPresenceKey(accountUuid, deviceId);
if (isLocallyPresent(accountUuid, deviceId)) {
displacePresence(presenceKey);
displacePresence(presenceKey, false);
}
// If connected locally, we still need to clean up the presence key.
@@ -190,11 +190,11 @@ public class ClientPresenceManager extends RedisClusterPubSubAdapter<String, Str
presenceCluster.useCluster(connection -> connection.sync().del(presenceKey));
}
private void displacePresence(final String presenceKey) {
private void displacePresence(final String presenceKey, final boolean connectedElsewhere) {
final DisplacedPresenceListener displacementListener = displacementListenersByPresenceKey.get(presenceKey);
if (displacementListener != null) {
displacementListener.handleDisplacement();
displacementListener.handleDisplacement(connectedElsewhere);
}
clearPresence(presenceKey);
@@ -287,12 +287,13 @@ public class ClientPresenceManager extends RedisClusterPubSubAdapter<String, Str
if ("set".equals(message) || "del".equals(message)) {
// for "set", another process has overwritten this presence key, which means the client has connected to another host.
// for "del", another process has indicated the client should be disconnected
final boolean connectedElsewhere = "set".equals(message);
// At this point, we're on a Lettuce IO thread and need to dispatch to a separate thread before making
// synchronous Lettuce calls to avoid deadlocking.
keyspaceNotificationExecutorService.execute(() -> {
try {
displacePresence(channel.substring("__keyspace@0__:".length()));
displacePresence(channel.substring("__keyspace@0__:".length()), connectedElsewhere);
remoteDisplacementMeter.mark();
} catch (final Exception e) {
log.warn("Error displacing presence", e);

View File

@@ -12,5 +12,5 @@ package org.whispersystems.textsecuregcm.push;
@FunctionalInterface
public interface DisplacedPresenceListener {
void handleDisplacement();
void handleDisplacement(boolean connectedElsewhere);
}

View File

@@ -382,7 +382,7 @@ public class WebSocketConnection implements MessageAvailabilityListener, Displac
}
@Override
public void handleDisplacement() {
public void handleDisplacement(final boolean connectedElsewhere) {
Metrics.counter(DISPLACEMENT_COUNTER_NAME, List.of(UserAgentTagUtil.getPlatformTag(client.getUserAgent()))).increment();
try {