Marino Faggiana 6 жил өмнө
parent
commit
4015837bf9

+ 1 - 1
File Provider Extension/FileProviderExtension+Network.swift

@@ -186,7 +186,7 @@ extension FileProviderExtension {
         
         let tableMetadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND session == %@ AND (status == %d OR status == %d)", providerData.account, k_upload_session_extension, k_metadataStatusInUpload, k_metadataStatusUploading), sorted: "fileName", ascending: true)
         
-        if (tableMetadatas == nil || (tableMetadatas!.count < Int(k_maxConcurrentOperationUpload))) {
+        if (tableMetadatas == nil || (tableMetadatas!.count < Int(k_maxConcurrentOperationDownloadUpload))) {
             
             guard let metadataForUpload = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account == %@ AND session == %@ AND status == %d", providerData.account, k_upload_session_extension, k_metadataStatusWaitUpload)) else {
                 return

+ 2 - 0
iOSClient/AppDelegate.h

@@ -130,6 +130,8 @@
 
 @property (nonatomic, strong) NSMutableArray *filterFileID;
 
+@property (nonatomic, strong) NSMutableArray *sessionPendingStatusInUpload;
+
 @property (nonatomic, strong) NSString *pnDeviceIdentifier;
 @property (nonatomic, strong) NSString *pnDeviceIdentifierSignature;
 @property (nonatomic, strong) NSString *pnPublicKey;

+ 30 - 12
iOSClient/AppDelegate.m

@@ -135,6 +135,9 @@
     // Filter fileID
     self.filterFileID = [NSMutableArray new];
 
+    // Upload Pending In Upload (crash)
+    self.sessionPendingStatusInUpload = [NSMutableArray new];
+    
     // Initialization Notification
     self.listOfNotifications = [NSMutableArray new];
     
@@ -1159,8 +1162,7 @@
     NSUInteger sizeDownload = 0, sizeUpload = 0;
     BOOL isE2EE = false;
     
-    long maxConcurrentOperationDownload = k_maxConcurrentOperationDownload;
-    long maxConcurrentOperationUpload = k_maxConcurrentOperationUpload;
+    long maxConcurrentOperationDownloadUpload = k_maxConcurrentOperationDownloadUpload;
     
     // Detect E2EE
     NSString *saveserverUrl = @"";
@@ -1182,8 +1184,7 @@
     
     // E2EE : only 1 operation
     if (isE2EE) {
-        maxConcurrentOperationDownload = 1;
-        maxConcurrentOperationUpload = 1;
+        maxConcurrentOperationDownloadUpload = 1;
     }
     
     // Stop Timer
@@ -1207,7 +1208,7 @@
     
     // ------------------------- <selector Download> -------------------------
     
-    while (counterDownload < maxConcurrentOperationDownload) {
+    while (counterDownload < maxConcurrentOperationDownloadUpload) {
         
         metadataForDownload = [[NCManageDatabase sharedInstance] getMetadataWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND status == %d", _activeAccount, k_metadataStatusWaitDownload]];
         if (metadataForDownload) {
@@ -1226,7 +1227,7 @@
     
     // ------------------------- <selector Upload> -------------------------
     
-    while (counterUpload < maxConcurrentOperationUpload) {
+    while (counterUpload < maxConcurrentOperationDownloadUpload) {
         
         if (sizeUpload > k_maxSizeOperationUpload) {
             break;
@@ -1253,7 +1254,7 @@
     
     // ------------------------- <selector Auto Upload> -------------------------
     
-    while (counterUpload < maxConcurrentOperationUpload) {
+    while (counterUpload < maxConcurrentOperationDownloadUpload) {
         
         if (sizeUpload > k_maxSizeOperationUpload) {
             break;
@@ -1288,7 +1289,7 @@
         
     } else {
         
-        while (counterUpload < maxConcurrentOperationUpload) {
+        while (counterUpload < maxConcurrentOperationDownloadUpload) {
             
             if (sizeUpload > k_maxSizeOperationUpload) {
                 break;
@@ -1312,7 +1313,7 @@
     
     // No Download/upload available ? --> remove errors for retry
     //
-    if (counterDownload+counterUpload == 0) {
+    if (counterDownload+counterUpload < maxConcurrentOperationDownloadUpload+1) {
         
         NSArray *metadatas = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND (status == %d OR status == %d)", _activeAccount, k_metadataStatusDownloadError, k_metadataStatusUploadError] sorted:nil ascending:NO];
         for (tableMetadata *metadata in metadatas) {
@@ -1326,7 +1327,7 @@
         }
     }
     
-    // Verify internal error (lost task)
+    // Verify internal error download (lost task)
     //
     NSArray *matadatasInDownloading = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND session != %@ AND status == %d", self.activeAccount, k_download_session_extension, k_metadataStatusDownloading] sorted:nil ascending:true];
     for (tableMetadata *metadata in matadatasInDownloading) {
@@ -1353,8 +1354,10 @@
         }];
     }
     
-    NSArray *metadatasInUploading = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND session != %@ AND status == %d", self.activeAccount, k_upload_session_extension, k_metadataStatusUploading] sorted:nil ascending:true];
-    for (tableMetadata *metadata in metadatasInUploading) {
+    // Verify internal error upload (lost task)
+    //
+    NSArray *metadatasUploading = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND session != %@ AND status == %d", self.activeAccount, k_upload_session_extension, k_metadataStatusUploading] sorted:nil ascending:true];
+    for (tableMetadata *metadata in metadatasUploading) {
         
         NSURLSession *session = [[CCNetworking sharedNetworking] getSessionfromSessionDescription:metadata.session];
         
@@ -1378,6 +1381,21 @@
         }];
     }
     
+    // Upload in pending
+    //
+    NSArray *metadatasInUpload = [[NCManageDatabase sharedInstance] getMetadatasWithPredicate:[NSPredicate predicateWithFormat:@"account == %@ AND session != %@ AND status == %d AND sessionTaskIdentifier == 0", self.activeAccount, k_upload_session_extension, k_metadataStatusInUpload] sorted:nil ascending:true];
+    for (tableMetadata *metadata in metadatasInUpload) {
+        if ([self.sessionPendingStatusInUpload containsObject:metadata.fileID]) {
+            metadata.status = k_metadataStatusWaitUpload;
+            (void)[[NCManageDatabase sharedInstance] addMetadata:metadata];
+        } else {
+            [self.sessionPendingStatusInUpload addObject:metadata.fileID];
+        }
+    }
+    if (metadatasInUpload.count == 0) {
+        [self.sessionPendingStatusInUpload removeAllObjects];
+    }
+    
     // Start Timer
     _timerProcessAutoDownloadUpload = [NSTimer scheduledTimerWithTimeInterval:k_timerProcessAutoDownloadUpload target:self selector:@selector(loadAutoDownloadUpload) userInfo:nil repeats:YES];
 }

+ 1 - 2
iOSClient/CCGlobal.h

@@ -170,8 +170,7 @@
 // ConcurrentOperation
 #define k_maxHTTPConnectionsPerHost                     5
 #define k_maxConcurrentOperation                        10
-#define k_maxConcurrentOperationDownload                5
-#define k_maxConcurrentOperationUpload                  5
+#define k_maxConcurrentOperationDownloadUpload          5
 
 // Max Size Operation
 #define k_maxSizeOperationUpload                        524288000   // 500 MB

+ 2 - 1
iOSClient/Database/NCManageDatabase.swift

@@ -1574,6 +1574,7 @@ class NCManageDatabase: NSObject {
         
                 for result in results {
                     result.serverUrl = serverUrlTo
+                    result.metadataID = CCUtility.createMetadataID(fromAccount: result.account, serverUrl: serverUrlTo, fileName: result.fileName, directory: result.directory)
                 }
             }
         } catch let error {
@@ -1611,9 +1612,9 @@ class NCManageDatabase: NSObject {
                 
                 result = realm.objects(tableMetadata.self).filter("fileID == %@", fileID).first
                 if result != nil {
-                                        
                     result!.fileName = fileNameTo
                     result!.fileNameView = fileNameTo
+                    result!.metadataID = CCUtility.createMetadataID(fromAccount: result!.account, serverUrl: result!.serverUrl, fileName: fileNameTo, directory: result!.directory)
                 }
             }
         } catch let error {