From 47d65586cd82e5b948b88e558b102baef7e5d6e9 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 30 Jan 2025 19:57:44 +0100 Subject: [PATCH] Improve handling of unknown storage records Fixes #1696 --- .../signal/manager/helper/StorageHelper.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java index bb53479b..14db7c13 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java @@ -210,12 +210,6 @@ public class StorageHelper { remoteOnlyRecords.size()); } - final var unknownInserts = processKnownRecords(connection, remoteOnlyRecords); - final var unknownDeletes = idDifference.localOnlyIds() - .stream() - .filter(id -> !KNOWN_TYPES.contains(id.getType())) - .toList(); - if (!idDifference.localOnlyIds().isEmpty()) { final var updated = account.getRecipientStore() .removeStorageIdsFromLocalOnlyUnregisteredRecipients(connection, @@ -228,6 +222,12 @@ public class StorageHelper { } } + final var unknownInserts = processKnownRecords(connection, remoteOnlyRecords); + final var unknownDeletes = idDifference.localOnlyIds() + .stream() + .filter(id -> !KNOWN_TYPES.contains(id.getType())) + .toList(); + logger.debug("Storage ids with unknown type: {} inserts, {} deletes", unknownInserts.size(), unknownDeletes.size()); @@ -279,10 +279,22 @@ public class StorageHelper { try (final var connection = account.getAccountDatabase().getConnection()) { connection.setAutoCommit(false); - final var localStorageIds = getAllLocalStorageIds(connection); - final var idDifference = findIdDifference(remoteManifest.storageIds, localStorageIds); + var localStorageIds = getAllLocalStorageIds(connection); + var idDifference = findIdDifference(remoteManifest.storageIds, localStorageIds); logger.debug("ID Difference :: {}", idDifference); + final var unknownOnlyLocal = idDifference.localOnlyIds() + .stream() + .filter(id -> !KNOWN_TYPES.contains(id.getType())) + .toList(); + + if (!unknownOnlyLocal.isEmpty()) { + logger.debug("Storage ids with unknown type: {} to delete", unknownOnlyLocal.size()); + account.getUnknownStorageIdStore().deleteUnknownStorageIds(connection, unknownOnlyLocal); + localStorageIds = getAllLocalStorageIds(connection); + idDifference = findIdDifference(remoteManifest.storageIds, localStorageIds); + } + final var remoteDeletes = idDifference.remoteOnlyIds().stream().map(StorageId::getRaw).toList(); final var remoteInserts = buildLocalStorageRecords(connection, idDifference.localOnlyIds()); // TODO check if local storage record proto matches remote, then reset to remote storage_id @@ -595,7 +607,7 @@ public class StorageHelper { final var remote = remoteByRawId.get(rawId); final var local = localByRawId.get(rawId); - if (remote.getType() != local.getType() && local.getType() != 0) { + if (remote.getType() != local.getType() && KNOWN_TYPES.contains(local.getType())) { remoteOnlyRawIds.remove(rawId); localOnlyRawIds.remove(rawId); hasTypeMismatch = true; -- 2.50.1