浏览代码

Fix: Swallow InvalidFileError during upload session

Signed-off-by: Neeraj Gupta <254676+ua741@users.noreply.github.com>
Neeraj Gupta 1 年之前
父节点
当前提交
eabcded25e
共有 2 个文件被更改,包括 32 次插入4 次删除
  1. 31 3
      lib/services/remote_sync_service.dart
  2. 1 1
      lib/utils/file_uploader.dart

+ 31 - 3
lib/services/remote_sync_service.dart

@@ -45,6 +45,7 @@ class RemoteSyncService {
   final LocalFileUpdateService _localFileUpdateService =
   final LocalFileUpdateService _localFileUpdateService =
       LocalFileUpdateService.instance;
       LocalFileUpdateService.instance;
   int _completedUploads = 0;
   int _completedUploads = 0;
+  int _ignoredUploads = 0;
   late SharedPreferences _prefs;
   late SharedPreferences _prefs;
   Completer<void>? _existingSync;
   Completer<void>? _existingSync;
   bool _isExistingSyncSilent = false;
   bool _isExistingSyncSilent = false;
@@ -122,7 +123,9 @@ class RemoteSyncService {
       }
       }
       final filesToBeUploaded = await _getFilesToBeUploaded();
       final filesToBeUploaded = await _getFilesToBeUploaded();
       final hasUploadedFiles = await _uploadFiles(filesToBeUploaded);
       final hasUploadedFiles = await _uploadFiles(filesToBeUploaded);
-      _logger.info("File upload complete");
+      _logger.info(
+        "Files ${filesToBeUploaded.length} upload complete for this session",
+      );
       if (hasUploadedFiles) {
       if (hasUploadedFiles) {
         await _pullDiff();
         await _pullDiff();
         _existingSync?.complete();
         _existingSync?.complete();
@@ -144,6 +147,11 @@ class RemoteSyncService {
         if (filesToBeUploaded.isEmpty) {
         if (filesToBeUploaded.isEmpty) {
           await _uploader.removeStaleFiles();
           await _uploader.removeStaleFiles();
         }
         }
+        if (_ignoredUploads > 0) {
+          _logger.info("Ignored $_ignoredUploads files for upload, fire "
+              "backup done");
+          Bus.instance.fire(SyncStatusUpdate(SyncStatus.completedBackup));
+        }
         _existingSync?.complete();
         _existingSync?.complete();
         _existingSync = null;
         _existingSync = null;
       }
       }
@@ -156,7 +164,7 @@ class RemoteSyncService {
           e is WiFiUnavailableError ||
           e is WiFiUnavailableError ||
           e is StorageLimitExceededError ||
           e is StorageLimitExceededError ||
           e is SyncStopRequestedError) {
           e is SyncStopRequestedError) {
-        _logger.warning("Error executing remote sync", e);
+        _logger.warning("Error executing remote sync", e, s);
         rethrow;
         rethrow;
       } else {
       } else {
         _logger.severe("Error executing remote sync ", e, s);
         _logger.severe("Error executing remote sync ", e, s);
@@ -535,6 +543,7 @@ class RemoteSyncService {
     }
     }
 
 
     _completedUploads = 0;
     _completedUploads = 0;
+    _ignoredUploads = 0;
     final int toBeUploaded = filesToBeUploaded.length + updatedFileIDs.length;
     final int toBeUploaded = filesToBeUploaded.length + updatedFileIDs.length;
     if (toBeUploaded > 0) {
     if (toBeUploaded > 0) {
       Bus.instance.fire(SyncStatusUpdate(SyncStatus.preparingForUpload));
       Bus.instance.fire(SyncStatusUpdate(SyncStatus.preparingForUpload));
@@ -614,7 +623,10 @@ class RemoteSyncService {
   void _uploadFile(EnteFile file, int collectionID, List<Future> futures) {
   void _uploadFile(EnteFile file, int collectionID, List<Future> futures) {
     final future = _uploader
     final future = _uploader
         .upload(file, collectionID)
         .upload(file, collectionID)
-        .then((uploadedFile) => _onFileUploaded(uploadedFile));
+        .then((uploadedFile) => _onFileUploaded(uploadedFile))
+        .onError(
+          (error, stackTrace) => _onFileUploadError(error, stackTrace, file),
+        );
     futures.add(future);
     futures.add(future);
   }
   }
 
 
@@ -648,6 +660,22 @@ class RemoteSyncService {
     );
     );
   }
   }
 
 
+  void _onFileUploadError(
+    Object? error,
+    StackTrace stackTrace,
+    EnteFile file,
+  ) {
+    if (error == null) {
+      return;
+    }
+    if (error is InvalidFileError) {
+      _ignoredUploads++;
+      _logger.warning("Invalid file error", error);
+    } else {
+      throw (error as Error);
+    }
+  }
+
   /* _storeDiff maps each remoteFile to existing
   /* _storeDiff maps each remoteFile to existing
       entries in files table. When match is found, it compares both file to
       entries in files table. When match is found, it compares both file to
       perform relevant actions like
       perform relevant actions like

+ 1 - 1
lib/utils/file_uploader.dart

@@ -539,7 +539,7 @@ class FileUploader {
         _logger.severe("File upload failed for " + file.toString(), e, s);
         _logger.severe("File upload failed for " + file.toString(), e, s);
       }
       }
       if (e is InvalidFileError) {
       if (e is InvalidFileError) {
-        _logger.severe("File upload ignored for " + file.toString(), e, s);
+        _logger.severe("File upload ignored for " + file.toString(), e);
         await _onInvalidFileError(file, e);
         await _onInvalidFileError(file, e);
       }
       }
       if ((e is StorageLimitExceededError ||
       if ((e is StorageLimitExceededError ||