New discovery algo: data finger print
authorOlivier Goffart <ogoffart@woboq.com>
Tue, 21 Aug 2018 17:54:48 +0000 (19:54 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:04 +0000 (10:58 +0100)
src/libsync/discovery.cpp
src/libsync/discoveryphase.h
src/libsync/syncengine.cpp

index 7331cc0bb057d03e645ede8d5455dc9e25256894..7807b8aac73a56c2bd525552ab4ea165a2ae1941 100644 (file)
@@ -37,10 +37,12 @@ void ProcessDirectoryJob::start()
     if (_queryServer == NormalQuery) {
         serverJob = new DiscoverySingleDirectoryJob(_discoveryData->_account,
             _discoveryData->_remoteFolder + _currentFolder._server, this);
-        connect(serverJob, &DiscoverySingleDirectoryJob::finished, this, [this](const auto &results) {
+        connect(serverJob, &DiscoverySingleDirectoryJob::finished, this, [this, serverJob](const auto &results) {
             if (results) {
                 _serverEntries = *results;
                 _hasServerEntries = true;
+                if (!serverJob->_dataFingerprint.isEmpty() && _discoveryData->_dataFingerprint.isEmpty())
+                    _discoveryData->_dataFingerprint = serverJob->_dataFingerprint;
                 if (_hasLocalEntries)
                     process();
             } else {
index 4c1217a62d6a5038e6444457b643a6a506554dcf..99ee57f23213812ba045a6972cb6c16279d53570 100644 (file)
@@ -147,6 +147,8 @@ public:
 
     void startJob(ProcessDirectoryJob *);
 
+    QByteArray _dataFingerprint;
+
 signals:
     void fatalError(const QString &errorString);
     void itemDiscovered(const SyncFileItemPtr &item);
index 4871d818305287798e5a45befad555a53248c2f4..8b0e86ec8e8b535093d6975c078e32743d4c85a0 100644 (file)
@@ -705,28 +705,15 @@ void SyncEngine::slotDiscoveryJobFinished()
         }
     }
 
-    /*
     auto databaseFingerprint = _journal->dataFingerprint();
     // If databaseFingerprint is empty, this means that there was no information in the database
     // (for example, upgrading from a previous version, or first sync, or server not supporting fingerprint)
-    if (!databaseFingerprint.isEmpty()
-        && _discoveryMainThread->_dataFingerprint != databaseFingerprint) {
-        qCInfo(lcEngine) << "data fingerprint changed, assume restore from backup" << databaseFingerprint << _discoveryMainThread->_dataFingerprint;
-        restoreOldFiles(syncItems);
-    } else if (!_hasForwardInTimeFiles && _backInTimeFiles >= 2
-        && _account->serverVersionInt() < Account::makeServerVersion(9, 1, 0)) {
-        // The server before ownCloud 9.1 did not have the data-fingerprint property. So in that
-        // case we use heuristics to detect restored backup.  This is disabled with newer version
-        // because this causes troubles to the user and is not as reliable as the data-fingerprint.
-        qCInfo(lcEngine) << "All the changes are bringing files in the past, asking the user";
-        // this typically happen when a backup is restored on the server
-        bool restore = false;
-        emit aboutToRestoreBackup(&restore);
-        if (restore) {
-            restoreOldFiles(syncItems);
-        }
+    if (!databaseFingerprint.isEmpty() && _discoveryPhase
+        && _discoveryPhase->_dataFingerprint != databaseFingerprint) {
+        qCInfo(lcEngine) << "data fingerprint changed, assume restore from backup" << databaseFingerprint << _discoveryPhase->_dataFingerprint;
+        restoreOldFiles(_syncItems);
     }
-*/
+
     // Sort items per destination
     std::sort(_syncItems.begin(), _syncItems.end());
 
@@ -830,16 +817,13 @@ void SyncEngine::slotFinished(bool success)
         _anotherSyncNeeded = ImmediateFollowUp;
     }
 
-#if 0
-    FIXME
-    if (success) {
-        _journal->setDataFingerprint(_discoveryMainThread->_dataFingerprint);
+    if (success && _discoveryPhase) {
+        _journal->setDataFingerprint(_discoveryPhase->_dataFingerprint);
     }
 
-    if (!_journal->postSyncCleanup(_seenFiles, _temporarilyUnavailablePaths)) {
+    if (success && !_journal->postSyncCleanup(_seenFiles, _temporarilyUnavailablePaths)) {
         qCDebug(lcEngine) << "Cleaning of synced ";
     }
-#endif
 
     conflictRecordMaintenance();