Handle errors in convertToPlaceholder
authorHannah von Reth <hannah.vonreth@owncloud.com>
Wed, 30 Dec 2020 11:53:03 +0000 (12:53 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Wed, 30 Dec 2020 15:17:47 +0000 (16:17 +0100)
src/common/vfs.h
src/libsync/owncloudpropagator.cpp
src/libsync/propagatedownload.cpp
src/libsync/syncengine.cpp
src/libsync/vfs/cfapi/vfs_cfapi.cpp
src/libsync/vfs/cfapi/vfs_cfapi.h
src/libsync/vfs/suffix/vfs_suffix.cpp
src/libsync/vfs/suffix/vfs_suffix.h

index f4ea3d8fa89f37c017f9fa38f0d33cd2a2e34802..b7bd22098d4a0db03bc28731673598a4352efc88 100644 (file)
@@ -190,7 +190,7 @@ public:
      * new placeholder shall supersede, for rename-replace actions with new downloads,
      * for example.
      */
-    virtual void convertToPlaceholder(
+    virtual Result<void, QString> convertToPlaceholder(
         const QString &filename,
         const SyncFileItem &item,
         const QString &replacesFile = QString()) = 0;
@@ -296,7 +296,7 @@ public:
     Result<void, QString> updateMetadata(const QString &, time_t, qint64, const QByteArray &) override { return {}; }
     Result<void, QString> createPlaceholder(const SyncFileItem &) override { return {}; }
     Result<void, QString> dehydratePlaceholder(const SyncFileItem &) override { return {}; }
-    void convertToPlaceholder(const QString &, const SyncFileItem &, const QString &) override {}
+    Result<void, QString> convertToPlaceholder(const QString &, const SyncFileItem &, const QString &) override { return {}; }
 
     bool needsMetadataUpdate(const SyncFileItem &) override { return false; }
     bool isDehydratedPlaceholder(const QString &) override { return false; }
index f26dad05cd655c222a3970cc52d83a40cd81f66a..c576c93dfd2e08d4f44881dda85cfc8650449cdd 100644 (file)
@@ -737,7 +737,9 @@ QString OwncloudPropagator::adjustRenamedPath(const QString &original) const
 bool OwncloudPropagator::updateMetadata(const SyncFileItem &item, const QString &localFolderPath, SyncJournalDb &journal, Vfs &vfs)
 {
     QString fsPath = localFolderPath + item.destination();
-    vfs.convertToPlaceholder(fsPath, item);
+    if (!vfs.convertToPlaceholder(fsPath, item)) {
+        return false;
+    }
     auto record = item.toSyncJournalFileRecordWithInode(fsPath);
     return journal.setFileRecord(record);
 }
index 161b191df12cdf9962a5115ae9af983d3d916405..06c0c6337fe6358c35b8e7562009557ec44ed3cf 100644 (file)
@@ -964,7 +964,11 @@ void PropagateDownloadFile::downloadFinished()
         preserveGroupOwnership(_tmpFile.fileName(), existingFile);
 
         // Make the file a hydrated placeholder if possible
-        propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, fn);
+        const auto result = propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, fn);
+        if (!result) {
+            done(SyncFileItem::NormalError, result.error());
+            return;
+        }
     }
 
     // Apply the remote permissions
index 9c2dd8edca7cae8e1bd40a8afd05c03e37317e74..7d6ae74d3cfc30d3dba87bf36ee2be832e3c6e08 100644 (file)
@@ -346,7 +346,12 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
 
             // Ensure it's a placeholder file on disk
             if (item->_type == ItemTypeFile) {
-                _syncOptions._vfs->convertToPlaceholder(filePath, *item);
+                const auto result = _syncOptions._vfs->convertToPlaceholder(filePath, *item);
+                if (!result) {
+                    item->_instruction = CSYNC_INSTRUCTION_ERROR;
+                    item->_errorString = tr("Could not update file : %1").arg(result.error());
+                    return;
+                }
             }
 
             // Update on-disk virtual file metadata
index 4a73ad968ca315470ce55b026aaabbcdc9a42e20..7a5da1e0ed4f5639e17b5b8bebdb820ff35a7817 100644 (file)
@@ -149,16 +149,16 @@ Result<void, QString> VfsCfApi::dehydratePlaceholder(const SyncFileItem &item)
     return {};
 }
 
-void VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
+Result<void, QString> VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
 {
     const auto localPath = QDir::toNativeSeparators(filename);
     const auto replacesPath = QDir::toNativeSeparators(replacesFile);
 
     const auto handle = cfapi::handleForPath(localPath);
     if (cfapi::findPlaceholderInfo(handle)) {
-        cfapi::updatePlaceholderInfo(handle, item._modtime, item._size, item._fileId, replacesPath);
+        return cfapi::updatePlaceholderInfo(handle, item._modtime, item._size, item._fileId, replacesPath);
     } else {
-        cfapi::convertToPlaceholder(handle, item._modtime, item._size, item._fileId, replacesPath);
+        return cfapi::convertToPlaceholder(handle, item._modtime, item._size, item._fileId, replacesPath);
     }
 }
 
index e4a4d0074266292f0aec457d33be781b73944721..96dda52d4fc4547216c6b6f49cc75fbfc4413181 100644 (file)
@@ -43,7 +43,7 @@ public:
 
     Result<void, QString> createPlaceholder(const SyncFileItem &item) override;
     Result<void, QString> dehydratePlaceholder(const SyncFileItem &item) override;
-    void convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile) override;
+    Result<void, QString> convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile) override;
 
     bool needsMetadataUpdate(const SyncFileItem &) override;
     bool isDehydratedPlaceholder(const QString &filePath) override;
index 40a7519a799885ef162c4e64500a914bfb272726..f3858e8a2f54d171f001d55497fc84a151faa1de 100644 (file)
@@ -122,9 +122,10 @@ Result<void, QString> VfsSuffix::dehydratePlaceholder(const SyncFileItem &item)
     return {};
 }
 
-void VfsSuffix::convertToPlaceholder(const QString &, const SyncFileItem &, const QString &)
+Result<void, QString> VfsSuffix::convertToPlaceholder(const QString &, const SyncFileItem &, const QString &)
 {
     // Nothing necessary
+    return {};
 }
 
 bool VfsSuffix::isDehydratedPlaceholder(const QString &filePath)
index 3feca6ea06fe3f744358d72db4ade1efcfea6bb9..4aa513c0388897824d394ebe69d755c49ac2bf77 100644 (file)
@@ -41,7 +41,7 @@ public:
 
     Result<void, QString> createPlaceholder(const SyncFileItem &item) override;
     Result<void, QString> dehydratePlaceholder(const SyncFileItem &item) override;
-    void convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &) override;
+    Result<void, QString> convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &) override;
 
     bool needsMetadataUpdate(const SyncFileItem &) override { return false; }
     bool isDehydratedPlaceholder(const QString &filePath) override;