diff options
author | Matthieu Gallien <matthieu.gallien@nextcloud.com> | 2022-10-27 18:29:02 +0300 |
---|---|---|
committer | Matthieu Gallien <matthieu_gallien@yahoo.fr> | 2022-11-07 20:33:13 +0300 |
commit | 402d959caea89c461366a232e807dced2c712034 (patch) | |
tree | a8cf22a3a27b9dbf3c395a6c60d0cb7f1e396780 | |
parent | 783cefe3f1efee67a99fc5048d5ce5bc3d284509 (diff) |
do not skip folder deletion if BlacklistedError during propagation
in case some propgation actions ends up with a BlacklistedError, we
would skip the deletions of local folders (even though they have been
deleted from server)
let's not skip them but rather keep track of the error status and
properly report them
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
-rw-r--r-- | src/libsync/owncloudpropagator.cpp | 34 | ||||
-rw-r--r-- | src/libsync/owncloudpropagator.h | 9 |
2 files changed, 40 insertions, 3 deletions
diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index 198f1b73b..cb3734e17 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -594,7 +594,7 @@ void OwncloudPropagator::start(SyncFileItemVector &&items) } foreach (PropagatorJob *it, directoriesToRemove) { - _rootJob->_dirDeletionJobs.appendJob(it); + _rootJob->appendDirDeletionJob(it); } connect(_rootJob.data(), &PropagatorJob::finished, this, &OwncloudPropagator::emitFinished); @@ -1292,6 +1292,11 @@ qint64 PropagateRootDirectory::committedDiskSpace() const return _subJobs.committedDiskSpace() + _dirDeletionJobs.committedDiskSpace(); } +void PropagateRootDirectory::appendDirDeletionJob(PropagatorJob *job) +{ + _dirDeletionJobs.appendJob(job); +} + bool PropagateRootDirectory::scheduleSelfOrChild() { qCInfo(lcRootDirectory()) << "scheduleSelfOrChild" << _state << "pending uploads" << propagator()->delayedTasks().size() << "subjobs state" << _subJobs._state; @@ -1327,6 +1332,7 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status) if (status != SyncFileItem::Success && status != SyncFileItem::Restoration + && status != SyncFileItem::BlacklistedError && status != SyncFileItem::Conflict) { if (_state != Finished) { // Synchronously abort @@ -1338,11 +1344,37 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status) return; } + if (_errorStatus == SyncFileItem::NoStatus) { + switch (status) { + case SyncFileItem::NoStatus: + case SyncFileItem::FatalError: + case SyncFileItem::NormalError: + case SyncFileItem::SoftError: + case SyncFileItem::Conflict: + case SyncFileItem::FileIgnored: + case SyncFileItem::FileLocked: + case SyncFileItem::Restoration: + case SyncFileItem::FileNameInvalid: + case SyncFileItem::FileNameClash: + case SyncFileItem::DetailError: + case SyncFileItem::Success: + break; + case SyncFileItem::BlacklistedError: + _errorStatus = SyncFileItem::BlacklistedError; + break; + } + } + propagator()->scheduleNextJob(); } void PropagateRootDirectory::slotDirDeletionJobsFinished(SyncFileItem::Status status) { + if (_errorStatus != SyncFileItem::NoStatus && status == SyncFileItem::Success) { + qCInfo(lcPropagator) << "PropagateRootDirectory::slotDirDeletionJobsFinished" << "reporting previous error" << _errorStatus; + status = _errorStatus; + } + _state = Finished; qCInfo(lcPropagator) << "PropagateRootDirectory::slotDirDeletionJobsFinished" << "emit finished" << status; emit finished(status); diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index 87e695afc..95fe4e743 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -365,8 +365,6 @@ class OWNCLOUDSYNC_EXPORT PropagateRootDirectory : public PropagateDirectory { Q_OBJECT public: - PropagatorCompositeJob _dirDeletionJobs; - explicit PropagateRootDirectory(OwncloudPropagator *propagator); bool scheduleSelfOrChild() override; @@ -375,6 +373,9 @@ public: [[nodiscard]] qint64 committedDiskSpace() const override; +public slots: + void appendDirDeletionJob(PropagatorJob *job); + private slots: void slotSubJobsFinished(SyncFileItem::Status status) override; void slotDirDeletionJobsFinished(SyncFileItem::Status status); @@ -382,6 +383,10 @@ private slots: private: bool scheduleDelayedJobs(); + + PropagatorCompositeJob _dirDeletionJobs; + + SyncFileItem::Status _errorStatus = SyncFileItem::Status::NoStatus; }; /** |