Regularly delete any archived media we don't know about.

This commit is contained in:
Clark
2024-06-24 18:42:29 -04:00
committed by Nicholas Tinsley
parent 4a41e9f9a1
commit 47e4a6cf5a
4 changed files with 20 additions and 3 deletions

View File

@@ -36,9 +36,20 @@ class BackupMessagesJob private constructor(parameters: Parameters) : BaseJob(pa
const val QUEUE = "BackupMessagesQueue"
fun enqueue() {
/**
* Pruning abandoned remote media is relatively expensive, so we should
* not do this every time we backup.
*/
fun enqueue(pruneAbandonedRemoteMedia: Boolean = false) {
val jobManager = AppDependencies.jobManager
jobManager.add(BackupMessagesJob())
if (pruneAbandonedRemoteMedia) {
jobManager
.startChain(BackupMessagesJob())
.then(SyncArchivedMediaJob())
.enqueue()
} else {
jobManager.add(BackupMessagesJob())
}
}
}

View File

@@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.backup.v2.BackupRepository
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JsonJobData
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.whispersystems.signalservice.api.archive.ArchiveGetMediaItemsResponse
import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException
import java.lang.Exception
@@ -75,6 +76,7 @@ class SyncArchivedMediaJob private constructor(
BackupRepository.deleteAbandonedMediaObjects(attachmentsToDelete)
Log.i(TAG, "Deleted ${attachmentsToDelete.size} attachments off CDN")
}
SignalStore.backup.lastMediaSyncTime = System.currentTimeMillis()
}
/**

View File

@@ -26,6 +26,7 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) {
private const val KEY_NEXT_BACKUP_TIME = "backup.nextBackupTime"
private const val KEY_LAST_BACKUP_TIME = "backup.lastBackupTime"
private const val KEY_LAST_BACKUP_MEDIA_SYNC_TIME = "backup.lastBackupMediaSyncTime"
private const val KEY_BACKUP_FREQUENCY = "backup.backupFrequency"
private const val KEY_CDN_BACKUP_DIRECTORY = "backup.cdn.directory"
@@ -59,6 +60,7 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) {
var nextBackupTime: Long by longValue(KEY_NEXT_BACKUP_TIME, -1)
var lastBackupTime: Long by longValue(KEY_LAST_BACKUP_TIME, -1)
var lastMediaSyncTime: Long by longValue(KEY_LAST_BACKUP_MEDIA_SYNC_TIME, -1)
var backupFrequency: BackupFrequency by enumValue(KEY_BACKUP_FREQUENCY, BackupFrequency.MANUAL, BackupFrequency.Serializer)
var backupTier: MessageBackupTier? by enumValue(KEY_BACKUP_TIER, null, MessageBackupTier.Serializer)

View File

@@ -26,13 +26,15 @@ class MessageBackupListener : PersistentAlarmManagerListener() {
override fun onAlarm(context: Context, scheduledTime: Long): Long {
if (SignalStore.backup.areBackupsEnabled) {
BackupMessagesJob.enqueue()
val timeSinceLastSync = System.currentTimeMillis() - SignalStore.backup.lastMediaSyncTime
BackupMessagesJob.enqueue(pruneAbandonedRemoteMedia = timeSinceLastSync >= BACKUP_MEDIA_SYNC_INTERVAL || timeSinceLastSync < 0)
}
return setNextBackupTimeToIntervalFromNow()
}
companion object {
private val BACKUP_JITTER_WINDOW_SECONDS = Math.toIntExact(TimeUnit.MINUTES.toSeconds(10))
private val BACKUP_MEDIA_SYNC_INTERVAL = TimeUnit.DAYS.toMillis(7)
@JvmStatic
fun schedule(context: Context?) {