Add jitter to backup scheduling.

This commit is contained in:
Nicholas
2023-05-09 10:38:54 -04:00
committed by Cody Henthorne
parent 77751c1d28
commit e46564cb7e
5 changed files with 77 additions and 10 deletions

View File

@@ -38,6 +38,7 @@ import org.thoughtcrime.securesms.migrations.AttachmentCleanupMigrationJob;
import org.thoughtcrime.securesms.migrations.AttributesMigrationJob;
import org.thoughtcrime.securesms.migrations.AvatarIdRemovalMigrationJob;
import org.thoughtcrime.securesms.migrations.AvatarMigrationJob;
import org.thoughtcrime.securesms.migrations.BackupJitterMigrationJob;
import org.thoughtcrime.securesms.migrations.BackupNotificationMigrationJob;
import org.thoughtcrime.securesms.migrations.BlobStorageLocationMigrationJob;
import org.thoughtcrime.securesms.migrations.CachedAttachmentsMigrationJob;
@@ -100,7 +101,7 @@ public final class JobManagerFactories {
put(CheckServiceReachabilityJob.KEY, new CheckServiceReachabilityJob.Factory());
put(CleanPreKeysJob.KEY, new CleanPreKeysJob.Factory());
put(ClearFallbackKbsEnclaveJob.KEY, new ClearFallbackKbsEnclaveJob.Factory());
put(ConversationShortcutRankingUpdateJob.KEY, new ConversationShortcutRankingUpdateJob.Factory());
put(ConversationShortcutRankingUpdateJob.KEY, new ConversationShortcutRankingUpdateJob.Factory());
put(ConversationShortcutUpdateJob.KEY, new ConversationShortcutUpdateJob.Factory());
put(CreateReleaseChannelJob.KEY, new CreateReleaseChannelJob.Factory());
put(DirectoryRefreshJob.KEY, new DirectoryRefreshJob.Factory());
@@ -220,6 +221,7 @@ public final class JobManagerFactories {
put(AttributesMigrationJob.KEY, new AttributesMigrationJob.Factory());
put(AvatarIdRemovalMigrationJob.KEY, new AvatarIdRemovalMigrationJob.Factory());
put(AvatarMigrationJob.KEY, new AvatarMigrationJob.Factory());
put(BackupJitterMigrationJob.KEY, new BackupJitterMigrationJob.Factory());
put(BackupNotificationMigrationJob.KEY, new BackupNotificationMigrationJob.Factory());
put(BlobStorageLocationMigrationJob.KEY, new BlobStorageLocationMigrationJob.Factory());
put(CachedAttachmentsMigrationJob.KEY, new CachedAttachmentsMigrationJob.Factory());

View File

@@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.webrtc.CallBandwidthMode;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
@SuppressWarnings("deprecation")
public final class SettingsValues extends SignalStoreValues {
@@ -72,6 +73,9 @@ public final class SettingsValues extends SignalStoreValues {
private static final String KEEP_MUTED_CHATS_ARCHIVED = "settings.keepMutedChatsArchived";
private static final String USE_COMPACT_NAVIGATION_BAR = "settings.useCompactNavigationBar";
public static final int BACKUP_DEFAULT_HOUR = 2;
public static final int BACKUP_DEFAULT_MINUTE = 0;
private final SingleLiveEvent<String> onConfigurationSettingChanged = new SingleLiveEvent<>();
SettingsValues(@NonNull KeyValueStore store) {
@@ -80,10 +84,15 @@ public final class SettingsValues extends SignalStoreValues {
@Override
void onFirstEverAppLaunch() {
if (!getStore().containsKey(LINK_PREVIEWS)) {
getStore().beginWrite()
.putBoolean(LINK_PREVIEWS, true)
.apply();
final KeyValueStore store = getStore();
if (!store.containsKey(LINK_PREVIEWS)) {
store.beginWrite()
.putBoolean(LINK_PREVIEWS, true)
.apply();
}
if (!store.containsKey(BACKUPS_SCHEDULE_HOUR)) {
// Initialize backup time to a 5min interval between 1-5am
setBackupSchedule(new Random().nextInt(5) + 1, new Random().nextInt(12) * 5);
}
}
@@ -267,11 +276,11 @@ public final class SettingsValues extends SignalStoreValues {
}
public int getBackupHour() {
return getInteger(BACKUPS_SCHEDULE_HOUR, 2);
return getInteger(BACKUPS_SCHEDULE_HOUR, BACKUP_DEFAULT_HOUR);
}
public int getBackupMinute() {
return getInteger(BACKUPS_SCHEDULE_MINUTE, 0);
return getInteger(BACKUPS_SCHEDULE_MINUTE, BACKUP_DEFAULT_MINUTE);
}
public void setBackupSchedule(int hour, int minute) {
@@ -449,7 +458,7 @@ public final class SettingsValues extends SignalStoreValues {
}
public void setKeepMutedChatsArchived(boolean enabled) {
putBoolean(KEEP_MUTED_CHATS_ARCHIVED, enabled);
putBoolean(KEEP_MUTED_CHATS_ARCHIVED, enabled);
}
public boolean shouldKeepMutedChatsArchived() {

View File

@@ -12,7 +12,6 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobs.RefreshAttributesJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.stickers.BlessedPacks;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
@@ -128,9 +127,10 @@ public class ApplicationMigrations {
static final int REBUILD_MESSAGE_FTS_INDEX_4 = 83;
static final int INDEX_DATABASE_MIGRATION = 84;
static final int ACCOUNT_CONSISTENCY_CHECK = 85;
static final int BACKUP_JITTER = 86;
}
public static final int CURRENT_VERSION = 85;
public static final int CURRENT_VERSION = 86;
/**
* This *must* be called after the {@link JobManager} has been instantiated, but *before* the call
@@ -572,6 +572,10 @@ public class ApplicationMigrations {
jobs.put(Version.ACCOUNT_CONSISTENCY_CHECK, new AccountConsistencyMigrationJob());
}
if (lastSeenVersion < Version.BACKUP_JITTER) {
jobs.put(Version.BACKUP_JITTER, new BackupJitterMigrationJob());
}
return jobs;
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.migrations
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.keyvalue.SettingsValues
import org.thoughtcrime.securesms.keyvalue.SignalStore
import java.util.Random
internal class BackupJitterMigrationJob(parameters: Parameters = Parameters.Builder().build()) : MigrationJob(parameters) {
companion object {
const val KEY = "BackupJitterMigrationJob"
val TAG = Log.tag(BackupJitterMigrationJob::class.java)
}
override fun getFactoryKey(): String = KEY
override fun isUiBlocking(): Boolean = false
override fun performMigration() {
val hour = SignalStore.settings().backupHour
val minute = SignalStore.settings().backupMinute
if (hour == SettingsValues.BACKUP_DEFAULT_HOUR && minute == SettingsValues.BACKUP_DEFAULT_MINUTE) {
val rand = Random()
val newHour = rand.nextInt(3) + 1 // between 1AM - 3AM
val newMinute = rand.nextInt(12) * 5 // 5 minute intervals up to +55 minutes
SignalStore.settings().setBackupSchedule(newHour, newMinute)
}
}
override fun shouldRetry(e: Exception): Boolean = false
class Factory : Job.Factory<BackupJitterMigrationJob> {
override fun create(parameters: Parameters, serializedData: ByteArray?): BackupJitterMigrationJob {
return BackupJitterMigrationJob(parameters)
}
}
}

View File

@@ -6,14 +6,19 @@ import android.content.Context;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.jobs.LocalBackupJob;
import org.thoughtcrime.securesms.keyvalue.SettingsValues;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.util.JavaTimeExtensionsKt;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.time.LocalDateTime;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class LocalBackupListener extends PersistentAlarmManagerListener {
private static final int BACKUP_JITTER_WINDOW_SECONDS = Math.toIntExact(TimeUnit.MINUTES.toSeconds(10));
@Override
protected boolean shouldScheduleExact() {
return true;
@@ -44,6 +49,11 @@ public class LocalBackupListener extends PersistentAlarmManagerListener {
int hour = SignalStore.settings().getBackupHour();
int minute = SignalStore.settings().getBackupMinute();
LocalDateTime next = now.withHour(hour).withMinute(minute).withSecond(0);
int jitter = (new Random().nextInt(BACKUP_JITTER_WINDOW_SECONDS)) - (BACKUP_JITTER_WINDOW_SECONDS / 2);
next.plusSeconds(jitter);
if (now.isAfter(next)) {
next = next.plusDays(1);
}