From 1998f5f6cc5655bee8b62cbc3204d0c5cb316168 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 9 Aug 2024 16:11:17 +1000 Subject: [PATCH] fix: postpone first sync after start --- ts/receiver/contentMessage.ts | 7 ++++++- .../job_runners/jobs/ConfigurationSyncJob.ts | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 2f1a15962..f930dc4d2 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -306,10 +306,15 @@ async function shouldDropIncomingPrivateMessage( envelope: EnvelopePlus, content: SignalService.Content ) { + const isUs = UserUtils.isUsFromCache(envelope.source); // sentAtMoreRecentThanWrapper is going to be true, if the latest contact wrapper we processed was roughly more recent that this message timestamp - const moreRecentOrNah = await sentAtMoreRecentThanWrapper(sentAtTimestamp, 'ContactsConfig'); + const moreRecentOrNah = await sentAtMoreRecentThanWrapper( + sentAtTimestamp, + isUs ? 'UserConfig' : 'ContactsConfig' + ); const isSyncedMessage = isUsFromCache(envelope.source); + if (moreRecentOrNah === 'wrapper_more_recent') { // we need to check if that conversation is already in the wrapper try { diff --git a/ts/session/utils/job_runners/jobs/ConfigurationSyncJob.ts b/ts/session/utils/job_runners/jobs/ConfigurationSyncJob.ts index 9692cba80..f2dbdfe20 100644 --- a/ts/session/utils/job_runners/jobs/ConfigurationSyncJob.ts +++ b/ts/session/utils/job_runners/jobs/ConfigurationSyncJob.ts @@ -21,6 +21,7 @@ import { PersistedJob, RunJobResult, } from '../PersistedJob'; +import { DURATION } from '../../../constants'; const defaultMsBetweenRetries = 15000; // a long time between retries, to avoid running multiple jobs at the same time, when one was postponed at the same time as one already planned (5s) const defaultMaxAttempts = 2; @@ -55,6 +56,8 @@ async function retrieveSingleDestinationChanges( return { messages: outgoingConfResults, allOldHashes: compactedHashes }; } +let firstJobStart: number | undefined; + /** * This function is run once we get the results from the multiple batch-send. */ @@ -191,6 +194,18 @@ class ConfigurationSyncJob extends PersistedJob return RunJobResult.Success; } const singleDestChanges = await retrieveSingleDestinationChanges(thisJobDestination); + if (!firstJobStart) { + firstJobStart = Date.now(); + } + + // not ideal, but we need to postpone the first sync job to after we've handled the incoming config messages + // otherwise we are pushing an incomplete config to the network, which will need to be merged and that action alone + // will bump the timestamp of the config. + // We rely on the timestamp of configs to know when to drop messages that would unhide/unremove a conversation. + // The whole thing is a dirty fix of a dirty fix, that will **eventually** need proper fixing + if (Date.now() - firstJobStart <= 20 * DURATION.SECONDS) { + return RunJobResult.RetryJobIfPossible; + } // If there are no pending changes then the job can just complete (next time something // is updated we want to try and run immediately so don't scuedule another run in this case)