Fix PNP CDS sync bug.

This commit is contained in:
Greyson Parrelli 2022-11-01 17:47:35 -04:00 committed by Cody Henthorne
parent 3692d87531
commit 473c8b199e
3 changed files with 34 additions and 10 deletions

View file

@ -186,13 +186,16 @@ object ContactDiscoveryRefreshV2 {
SignalDatabase.recipients.rewritePhoneNumbers(fuzzyOutput.rewrites)
stopwatch.split("rewrite-e164")
val existingIds: Set<RecipientId> = SignalDatabase.recipients.getAllPossiblyRegisteredByE164(recipientE164s + rewrites.values)
val inactiveIds: Set<RecipientId> = (existingIds - registeredIds).removeRegisteredButUnlisted()
registeredIds += SignalDatabase.recipients.bulkProcessCdsV2Result(fuzzyOutput.numbers)
rewrites += fuzzyOutput.rewrites
stopwatch.split("process-result")
val existingIds: Set<RecipientId> = SignalDatabase.recipients.getAllPossiblyRegisteredByE164(recipientE164s + rewrites.values)
stopwatch.split("get-ids")
val inactiveIds: Set<RecipientId> = (existingIds - registeredIds).removeRegisteredButUnlisted()
stopwatch.split("registered-but-unlisted")
SignalDatabase.recipients.bulkUpdatedRegisteredStatusV2(registeredIds, inactiveIds)
stopwatch.split("update-registered")
}

View file

@ -475,8 +475,8 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
else -> processPnpTuple(e164 = e164, pni = pni, aci = ACI.fromNullable(serviceId), pniVerified = pniVerified, changeSelf = changeSelf)
}
if (result.operations.isNotEmpty()) {
Log.i(TAG, "[getAndPossiblyMergePnp] ($serviceId, $pni, $e164) BreadCrumbs: ${result.breadCrumbs}, Operations: ${result.operations}")
if (result.operations.isNotEmpty() || result.requiredInsert) {
Log.i(TAG, "[getAndPossiblyMerge] ($serviceId, $pni, $e164) BreadCrumbs: ${result.breadCrumbs}, Operations: ${result.operations}, RequiredInsert: ${result.requiredInsert}, FinalId: ${result.finalId}")
}
db.setTransactionSuccessful()
@ -601,11 +601,11 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
}
fun getOrInsertFromServiceId(serviceId: ServiceId): RecipientId {
return getOrInsertByColumn(SERVICE_ID, serviceId.toString()).recipientId
return getAndPossiblyMerge(serviceId = serviceId, e164 = null)
}
fun getOrInsertFromE164(e164: String): RecipientId {
return getOrInsertByColumn(PHONE, e164).recipientId
return getAndPossiblyMerge(serviceId = null, e164 = e164)
}
fun getOrInsertFromEmail(email: String): RecipientId {
@ -2183,6 +2183,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
UNREGISTERED_TIMESTAMP to 0
)
if (update(id, contentValues)) {
Log.i(TAG, "Newly marked $id as registered.")
setStorageIdIfNotSet(id)
ApplicationDependencies.getDatabaseObserver().notifyRecipientChanged(id)
}
@ -2191,11 +2192,11 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
fun markUnregistered(id: RecipientId) {
val contentValues = contentValuesOf(
REGISTERED to RegisteredState.NOT_REGISTERED.id,
STORAGE_SERVICE_ID to null,
UNREGISTERED_TIMESTAMP to System.currentTimeMillis()
)
if (update(id, contentValues)) {
Log.i(TAG, "Newly marked $id as unregistered.")
ApplicationDependencies.getDatabaseObserver().notifyRecipientChanged(id)
}
}
@ -2306,24 +2307,37 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
UNREGISTERED_TIMESTAMP to 0
)
val newlyRegistered: MutableSet<RecipientId> = mutableSetOf()
for (id in registered) {
if (update(id, registeredValues)) {
newlyRegistered += id
setStorageIdIfNotSet(id)
ApplicationDependencies.getDatabaseObserver().notifyRecipientChanged(id)
}
}
if (newlyRegistered.isNotEmpty()) {
Log.i(TAG, "Newly marked the following as registered: $newlyRegistered")
}
val newlyUnregistered: MutableSet<RecipientId> = mutableSetOf()
val unregisteredValues = contentValuesOf(
REGISTERED to RegisteredState.NOT_REGISTERED.id,
STORAGE_SERVICE_ID to null,
UNREGISTERED_TIMESTAMP to System.currentTimeMillis()
)
for (id in unregistered) {
if (update(id, unregisteredValues)) {
newlyUnregistered += id
ApplicationDependencies.getDatabaseObserver().notifyRecipientChanged(id)
}
}
if (newlyUnregistered.isNotEmpty()) {
Log.i(TAG, "Newly marked the following as unregistered: $newlyUnregistered")
}
}
}
@ -2364,6 +2378,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
return ProcessPnpTupleResult(
finalId = finalId,
requiredInsert = changeSet.id is PnpIdResolver.PnpInsert,
affectedIds = affectedIds,
oldIds = oldIds,
changedNumberId = changedNumberId,
@ -4408,6 +4423,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
data class ProcessPnpTupleResult(
val finalId: RecipientId,
val requiredInsert: Boolean,
val affectedIds: Set<RecipientId>,
val oldIds: Set<RecipientId>,
val changedNumberId: RecipientId?,

View file

@ -76,11 +76,16 @@ public class StorageForcePushJob extends BaseJob {
return;
}
if (!SignalStore.account().isRegistered() || SignalStore.account().getE164() == null || Recipient.self().getStorageServiceId() == null) {
if (!SignalStore.account().isRegistered() || SignalStore.account().getE164() == null) {
Log.w(TAG, "User not registered. Skipping.");
return;
}
if (Recipient.self().getStorageServiceId() == null) {
Log.w(TAG, "No storage ID set for self! Skipping.");
return;
}
StorageKey storageServiceKey = SignalStore.storageService().getOrCreateStorageKey();
SignalServiceAccountManager accountManager = ApplicationDependencies.getSignalServiceAccountManager();
RecipientDatabase recipientDatabase = SignalDatabase.recipients();