瀏覽代碼

rate limit retryFailedUploads and fix cancelled uploads bug

Signed-off-by: Jonas Mayer <jonas.a.mayer@gmx.net>
Jonas Mayer 9 月之前
父節點
當前提交
8e550a8436
共有 1 個文件被更改,包括 28 次插入14 次删除
  1. 28 14
      app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt

+ 28 - 14
app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt

@@ -33,6 +33,7 @@ import com.owncloud.android.lib.resources.files.model.RemoteFile
 import com.owncloud.android.operations.UploadFileOperation
 import com.owncloud.android.utils.FileUtil
 import java.io.File
+import java.util.concurrent.Semaphore
 import javax.inject.Inject
 
 @Suppress("TooManyFunctions")
@@ -58,6 +59,8 @@ class FileUploadHelper {
 
         private var instance: FileUploadHelper? = null
 
+        private val retryFailedUploadsSemaphore = Semaphore(1)
+
         fun instance(): FileUploadHelper {
             return instance ?: synchronized(this) {
                 instance ?: FileUploadHelper().also { instance = it }
@@ -75,19 +78,27 @@ class FileUploadHelper {
         accountManager: UserAccountManager,
         powerManagementService: PowerManagementService
     ) {
-        val failedUploads = uploadsStorageManager.failedUploads
-        if (failedUploads == null || failedUploads.isEmpty()) {
-            Log_OC.d(TAG, "Failed uploads are empty or null")
-            return
-        }
+        if (retryFailedUploadsSemaphore.tryAcquire()) {
+            try {
+                val failedUploads = uploadsStorageManager.failedUploads
+                if (failedUploads == null || failedUploads.isEmpty()) {
+                    Log_OC.d(TAG, "Failed uploads are empty or null")
+                    return
+                }
 
-        retryUploads(
-            uploadsStorageManager,
-            connectivityService,
-            accountManager,
-            powerManagementService,
-            failedUploads
-        )
+                retryUploads(
+                    uploadsStorageManager,
+                    connectivityService,
+                    accountManager,
+                    powerManagementService,
+                    failedUploads
+                )
+            } finally {
+                retryFailedUploadsSemaphore.release()
+            }
+        } else {
+            Log_OC.d(TAG, "Skip retryFailedUploads since it is already running")
+        }
     }
 
     fun retryCancelledUploads(
@@ -139,6 +150,10 @@ class FileUploadHelper {
 
             if (uploadResult != UploadResult.UPLOADED) {
                 if (failedUpload.lastResult != uploadResult) {
+                    // Setting Upload status else cancelled uploads will behave wrong, when retrying
+                    // Needs to happen first since lastResult wil be overwritten by setter
+                    failedUpload.uploadStatus = UploadStatus.UPLOAD_FAILED
+
                     failedUpload.lastResult = uploadResult
                     uploadsStorageManager.updateUpload(failedUpload)
                 }
@@ -207,7 +222,7 @@ class FileUploadHelper {
         val upload = uploadsStorageManager.getUploadByRemotePath(remotePath)
         if (upload != null) {
             cancelFileUploads(listOf(upload), accountName)
-        }else{
+        } else {
             Log_OC.e(TAG, "Error cancelling current upload because upload does not exist!")
         }
     }
@@ -224,7 +239,6 @@ class FileUploadHelper {
         } catch (e: NoSuchElementException) {
             Log_OC.e(TAG, "Error restarting upload job because user does not exist!")
         }
-
     }
 
     fun cancelAndRestartUploadJob(user: User) {