diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java index dc56282da..d7d44d267 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -665,11 +665,6 @@ public class AccountsManager { dynamoAccount.getMasterDevice().get().getSignedPreKey())) { return Optional.of("masterDeviceSignedPreKey"); } - - if (!Objects.equals(databaseAccount.getMasterDevice().get().getPushTimestamp(), - dynamoAccount.getMasterDevice().get().getPushTimestamp())) { - return Optional.of("masterDevicePushTimestamp"); - } } try { @@ -681,6 +676,15 @@ public class AccountsManager { return Optional.of("version"); } + if (databaseAccount.getMasterDevice().isPresent() && dynamoAccount.getMasterDevice().isPresent()) { + if (Math.abs(databaseAccount.getMasterDevice().get().getPushTimestamp() - + dynamoAccount.getMasterDevice().get().getPushTimestamp()) > 60 * 1_000L) { + // These are generally few milliseconds off, because the setter uses System.currentTimeMillis() internally, + // but we can be more relaxed + return Optional.of("masterDevicePushTimestamp"); + } + } + if (!serializedEquals(databaseAccount, dynamoAccount)) { return Optional.of("serialization"); } @@ -756,6 +760,9 @@ public class AccountsManager { @JsonIgnore private long lastSeen; + @JsonIgnore + private long pushTimestamp; + } private boolean serializedEquals(final Object database, final Object dynamo) throws JsonProcessingException { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java index 40c75bff1..fbc5edc36 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java @@ -513,7 +513,7 @@ class AccountsManagerTest { Thread.sleep(5); device2.setApnId("123"); - assertEquals(Optional.of("masterDevicePushTimestamp"), accountsManager.compareAccounts(Optional.of(a1), Optional.of(a2))); + assertEquals(Optional.empty(), accountsManager.compareAccounts(Optional.of(a1), Optional.of(a2))); a1.removeDevice(1L); a2.removeDevice(1L);