Fix backup jitter and add unit tests.

This commit is contained in:
Clark
2024-06-10 14:20:56 -04:00
committed by GitHub
parent 789339afa7
commit 173ee95e62
3 changed files with 65 additions and 18 deletions

View File

@@ -47,14 +47,7 @@ public class LocalBackupListener extends PersistentAlarmManagerListener {
LocalDateTime now = LocalDateTime.now();
int hour = SignalStore.settings().getBackupHour();
int minute = SignalStore.settings().getBackupMinute();
LocalDateTime next = now.withHour(hour).withMinute(minute).withSecond(0);
if (now.isAfter(next)) {
next = next.plusDays(1);
}
int jitter = (new Random().nextInt(BACKUP_JITTER_WINDOW_SECONDS)) - (BACKUP_JITTER_WINDOW_SECONDS / 2);
next = next.plusSeconds(jitter);
LocalDateTime next = MessageBackupListener.getNextDailyBackupTimeFromNowWithJitter(now, hour, minute, BACKUP_JITTER_WINDOW_SECONDS);
long nextTime = JavaTimeExtensionsKt.toMillis(next);

View File

@@ -41,21 +41,28 @@ class MessageBackupListener : PersistentAlarmManagerListener() {
}
}
@JvmStatic
fun getNextDailyBackupTimeFromNowWithJitter(now: LocalDateTime, hour: Int, minute: Int, maxJitterSeconds: Int): LocalDateTime {
var next = now.withHour(hour).withMinute(minute).withSecond(0)
if (!now.plusSeconds(maxJitterSeconds.toLong() / 2).isBefore(next)) {
next = next.plusDays(1)
}
val jitter = Random().nextInt(BACKUP_JITTER_WINDOW_SECONDS) - BACKUP_JITTER_WINDOW_SECONDS / 2
return next.plusSeconds(jitter.toLong())
}
fun setNextBackupTimeToIntervalFromNow(): Long {
val now = LocalDateTime.now()
val hour = SignalStore.settings().backupHour
val minute = SignalStore.settings().backupMinute
var next = now.withHour(hour).withMinute(minute).withSecond(0)
val jitter = Random().nextInt(BACKUP_JITTER_WINDOW_SECONDS) - BACKUP_JITTER_WINDOW_SECONDS / 2
next.plusSeconds(jitter.toLong())
var next = getNextDailyBackupTimeFromNowWithJitter(now, hour, minute, BACKUP_JITTER_WINDOW_SECONDS)
next = when (SignalStore.backup().backupFrequency) {
BackupFrequency.DAILY -> next.plusDays(1)
BackupFrequency.MANUAL -> next.plusDays(365)
BackupFrequency.MONTHLY -> next.plusDays(30)
BackupFrequency.WEEKLY -> next.plusDays(7)
}
if (now.isAfter(next)) {
next = next.plusDays(1)
BackupFrequency.MANUAL -> next.plusDays(364)
BackupFrequency.MONTHLY -> next.plusDays(29)
BackupFrequency.WEEKLY -> next.plusDays(6)
else -> next
}
val nextTime = next.toMillis()
SignalStore.backup().nextBackupTime = nextTime