Sync: optimize by removing setFileRecordMetadata
authorOlivier Goffart <ogoffart@woboq.com>
Tue, 6 Nov 2018 09:30:33 +0000 (10:30 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:19 +0000 (10:58 +0100)
Inh most case we already have a record from before, so avoid doing a useless
lookup in the database.
In owncloudpropagator.cpp, directories do not have a checksum so no need
to call a function that preserves it

src/common/syncjournaldb.cpp
src/common/syncjournaldb.h
src/libsync/discovery.cpp
src/libsync/owncloudpropagator.cpp
src/libsync/syncengine.cpp
test/testsyncjournaldb.cpp

index f904508595aafd45eb90f7eee53e9468722c0409..3234b00673bcdb51bb05bc375235856d11b280c4 100644 (file)
@@ -1297,31 +1297,6 @@ bool SyncJournalDb::updateLocalMetadata(const QString &filename,
     return _setFileRecordLocalMetadataQuery.exec();
 }
 
-bool SyncJournalDb::setFileRecordMetadata(const SyncJournalFileRecord &record)
-{
-    SyncJournalFileRecord existing;
-    if (!getFileRecord(record._path, &existing))
-        return false;
-
-    // If there's no existing record, just insert the new one.
-    if (!existing.isValid()) {
-        return setFileRecord(record);
-    }
-
-    // Update the metadata on the existing record.
-    existing._inode = record._inode;
-    existing._modtime = record._modtime;
-    existing._type = record._type;
-    existing._etag = record._etag;
-    existing._fileId = record._fileId;
-    existing._remotePerm = record._remotePerm;
-    existing._fileSize = record._fileSize;
-    existing._serverHasIgnoredFiles = record._serverHasIgnoredFiles;
-    existing._e2eMangledName = record._e2eMangledName;
-    existing._isE2eEncrypted = record._isE2eEncrypted;
-    return setFileRecord(existing);
-}
-
 static void toDownloadInfo(SqlQuery &query, SyncJournalDb::DownloadInfo *res)
 {
     bool ok = true;
index 417f2b7e52479be117f883f859922447af00cd78..12d2871cad4c34a87e15fb9596810b5d42701fcc 100644 (file)
@@ -64,9 +64,6 @@ public:
     bool listFilesInPath(const QByteArray &path, const std::function<void(const SyncJournalFileRecord&)> &rowCallback);
     bool setFileRecord(const SyncJournalFileRecord &record);
 
-    /// Like setFileRecord, but preserves checksums
-    bool setFileRecordMetadata(const SyncJournalFileRecord &record);
-
     bool deleteFileRecord(const QString &filename, bool recursively = false);
     bool updateFileRecordChecksum(const QString &filename,
         const QByteArray &contentChecksum,
index f42482338b65bb6f24015af7572994bbc0ae4775..894ce135103f99b8c5fabf525ab476c36816e20f 100644 (file)
@@ -884,7 +884,7 @@ void ProcessDirectoryJob::processFileConflict(const SyncFileItemPtr &item, Proce
             rec._fileSize = serverEntry.size;
             rec._remotePerm = serverEntry.remotePerm;
             rec._checksumHeader = serverEntry.checksumHeader;
-            _discoveryData->_statedb->setFileRecordMetadata(rec);
+            _discoveryData->_statedb->setFileRecord(rec);
         }
         return;
     }
index 9ca0756d92c55fe1cabae4de63cd89416051604d..57cc4f1e9d5adc768a4c4fdc4b66842010eb3c0b 100644 (file)
@@ -967,7 +967,7 @@ void PropagateDirectory::slotSubJobsFinished(SyncFileItem::Status status)
                 }
             }
             SyncJournalFileRecord record = _item->toSyncJournalFileRecordWithInode(propagator()->_localDir + _item->_file);
-            bool ok = propagator()->_journal->setFileRecordMetadata(record);
+            bool ok = propagator()->_journal->setFileRecord(record);
             if (!ok) {
                 status = _item->_status = SyncFileItem::FatalError;
                 _item->_errorString = tr("Error writing metadata to the database");
index c77a4dfd3a2553e036a81f16df381ec0110b7a46..df640af1c1d9c4bc10b45d90b2ffde8a9fc18582 100644 (file)
@@ -326,15 +326,16 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
                 const bool isReadOnly = !item->_remotePerm.isNull() && !item->_remotePerm.hasPermission(RemotePermissions::CanWrite);
                 FileSystem::setFileReadOnlyWeak(filePath, isReadOnly);
             }
-
-            _journal->setFileRecordMetadata(item->toSyncJournalFileRecordWithInode(filePath));
+            auto rec = item->toSyncJournalFileRecordWithInode(filePath);
+            if (rec._checksumHeader.isEmpty())
+                rec._checksumHeader = prev._checksumHeader;
+            rec._serverHasIgnoredFiles |= prev._serverHasIgnoredFiles;
+            _journal->setFileRecord(rec);
 
             // This might have changed the shared flag, so we must notify SyncFileStatusTracker for example
             emit itemCompleted(item);
         } else {
-            // The local tree is walked first and doesn't have all the info from the server.
             // Update only outdated data from the disk.
-            // FIXME!  I think this is no longer the case so a setFileRecordMetadata should work
             _journal->updateLocalMetadata(item->_file, item->_modtime, item->_size, item->_inode);
         }
         _hasNoneFiles = true;
index de3a415bc325c8c0772af73b5705349d288a5be1..8d4cb089023f57eeb512b8ae1a75d0fa39b52991 100644 (file)
@@ -81,7 +81,7 @@ private slots:
         record._fileId = "efg";
         record._remotePerm = RemotePermissions::fromDbValue("NV");
         record._fileSize = 289055;
-        _db.setFileRecordMetadata(record);
+        _db.setFileRecord(record);
         QVERIFY(_db.getFileRecord(QByteArrayLiteral("foo"), &storedRecord));
         QVERIFY(storedRecord == record);