فهرست منبع

FilesUploadWorker: process uploads in batches of 100 to prevent reading a large amount of rows in every loop

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 سال پیش
والد
کامیت
e4a922b913

+ 5 - 4
app/src/main/java/com/nextcloud/client/jobs/FilesUploadWorker.kt

@@ -80,12 +80,12 @@ class FilesUploadWorker(
 
         // get all pending uploads
         var currentAndPendingUploadsForAccount =
-            uploadsStorageManager.getCurrentAndPendingUploadsForAccount(accountName)
+            uploadsStorageManager.getCurrentAndPendingUploadsForAccount(MAX_UPLOADS_QUERY, accountName)
         while (currentAndPendingUploadsForAccount.isNotEmpty()) {
             Log_OC.d(TAG, "Handling ${currentAndPendingUploadsForAccount.size} uploads for account $accountName")
             handlePendingUploads(currentAndPendingUploadsForAccount, accountName)
             currentAndPendingUploadsForAccount =
-                uploadsStorageManager.getCurrentAndPendingUploadsForAccount(accountName)
+                uploadsStorageManager.getCurrentAndPendingUploadsForAccount(MAX_UPLOADS_QUERY, accountName)
         }
 
         Log_OC.d(TAG, "No more pending uploads for account $accountName, stopping work")
@@ -240,8 +240,9 @@ class FilesUploadWorker(
 
     companion object {
         val TAG: String = FilesUploadWorker::class.java.simpleName
-        const val FOREGROUND_SERVICE_ID: Int = 412
-        const val MAX_PROGRESS: Int = 100
+        private const val MAX_UPLOADS_QUERY = 100
+        private const val FOREGROUND_SERVICE_ID: Int = 412
+        private const val MAX_PROGRESS: Int = 100
         const val ACCOUNT = "data_account"
     }
 }

+ 15 - 2
app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java

@@ -364,6 +364,10 @@ public class UploadsStorageManager extends Observable {
     }
 
     private OCUpload[] getUploads(@Nullable String selection, @Nullable String... selectionArgs) {
+        return getUploads(0, selection, selectionArgs);
+    }
+
+    private OCUpload[] getUploads(final int limit, @Nullable String selection, @Nullable String... selectionArgs) {
         ArrayList<OCUpload> uploads = new ArrayList<>();
         final long pageSize = 100;
         long page = 0;
@@ -426,7 +430,11 @@ public class UploadsStorageManager extends Observable {
             } else {
                 break;
             }
-        } while (rowsRead > 0);
+        } while (rowsRead > 0 && (limit <= 0 || rowsRead < limit));
+
+        if (limit > 0 && uploads.size() > limit) {
+            uploads = new ArrayList<>(uploads.subList(0, limit));
+        }
 
         Log_OC.v(TAG, String.format(Locale.ENGLISH,
                                     "getUploads() returning %d (%d) rows after reading %d pages",
@@ -435,6 +443,7 @@ public class UploadsStorageManager extends Observable {
                                     page
                                    ));
 
+
         return uploads.toArray(new OCUpload[0]);
     }
 
@@ -475,7 +484,11 @@ public class UploadsStorageManager extends Observable {
     }
 
     public OCUpload[] getCurrentAndPendingUploadsForAccount(final @NonNull String accountName) {
-        return getUploads(ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_IN_PROGRESS.value +
+        return getCurrentAndPendingUploadsForAccount(0, accountName);
+    }
+
+    public OCUpload[] getCurrentAndPendingUploadsForAccount(final int limit, final @NonNull String accountName) {
+        return getUploads(limit, ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_IN_PROGRESS.value +
                               " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
                               "==" + UploadResult.DELAYED_FOR_WIFI.getValue() +
                               " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +