Discovery: fix double emission of finished in case of error
authorOlivier Goffart <ogoffart@woboq.com>
Mon, 5 Nov 2018 12:25:31 +0000 (13:25 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:17 +0000 (10:58 +0100)
src/libsync/discovery.cpp
src/libsync/syncengine.cpp

index e6aab5b09d575ea0c77f665c378e565cb9dac499..f42482338b65bb6f24015af7572994bbc0ae4775 100644 (file)
@@ -1149,8 +1149,6 @@ int ProcessDirectoryJob::processSubJobs(int nbJobs)
 void ProcessDirectoryJob::dbError()
 {
     _discoveryData->fatalError(tr("Error while reading the database"));
-    _pendingAsyncJobs = -1; // We're finished, we don't want to emit finished again
-    emit finished();
 }
 
 void ProcessDirectoryJob::addVirtualFileSuffix(QString &str) const
@@ -1214,7 +1212,6 @@ DiscoverySingleDirectoryJob *ProcessDirectoryJob::startAsyncServerQuery()
             }
             emit _discoveryData->fatalError(tr("Server replied with an error while reading directory '%1' : %2")
                 .arg(_currentFolder._server, results.errorMessage()));
-            emit finished();
         }
     });
     connect(serverJob, &DiscoverySingleDirectoryJob::firstDirectoryPermissions, this,
@@ -1248,7 +1245,6 @@ bool ProcessDirectoryJob::runLocalQuery()
             return true;
         }
         emit _discoveryData->fatalError(errorString);
-        emit finished();
         return false;
     }
     errno = 0;
@@ -1283,7 +1279,6 @@ bool ProcessDirectoryJob::runLocalQuery()
         // Note: Windows vio converts any error into EACCES
         qCWarning(lcDisco) << "readdir failed for file in " << _currentFolder._local << " - errno: " << errno;
         emit _discoveryData->fatalError(tr("Error while reading directory %1").arg(_discoveryData->_localDir + _currentFolder._local));
-        emit finished();
         return false;
     }
     return true;
index 8bd3a68db42bfa665a5bff31f3678c76157661b2..c77a4dfd3a2553e036a81f16df381ec0110b7a46 100644 (file)
@@ -642,6 +642,11 @@ void SyncEngine::slotNewItem(const SyncFileItemPtr &item)
 
 void SyncEngine::slotDiscoveryJobFinished()
 {
+    if (!_discoveryPhase) {
+        // There was an error that was already taken care of
+        return;
+    }
+
     qCInfo(lcEngine) << "#### Discovery end #################################################### " << _stopWatch.addLapTime(QLatin1String("Discovery Finished")) << "ms";
 
     // Sanity check
@@ -817,6 +822,9 @@ void SyncEngine::finalize(bool success)
     qCInfo(lcEngine) << "Sync run took " << _stopWatch.addLapTime(QLatin1String("Sync Finished")) << "ms";
     _stopWatch.stop();
 
+    if (_discoveryPhase) {
+        _discoveryPhase.take()->deleteLater();
+    }
     s_anySyncRunning = false;
     _syncRunning = false;
     emit finished(success);