mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-21 12:35:52 +03:00
handle NEW/NEW conflicts by being real conflicts
NEW/NEW conflicts could sometime be ignored and replaced by update metadata instructions we stop doing this and handle them like any other conflicts that would cause more download from the server those conflicts would be solved automatically in case this is not a real conflict but the client was missing the server reply with the updated metadata will enable more changes to improve MOVE detection from server side Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
This commit is contained in:
parent
7301ad3356
commit
f0908dbbfc
3 changed files with 6 additions and 20 deletions
|
@ -1595,7 +1595,7 @@ void ProcessDirectoryJob::processFileConflict(const SyncFileItemPtr &item, Proce
|
|||
// If there's no content hash, use heuristics
|
||||
if (serverEntry.checksumHeader.isEmpty()) {
|
||||
// If the size or mtime is different, it's definitely a conflict.
|
||||
bool isConflict = (serverEntry.size != localEntry.size) || (serverEntry.modtime != localEntry.modtime);
|
||||
bool isConflict = (serverEntry.size != localEntry.size) || (serverEntry.modtime != localEntry.modtime) || (dbEntry.isValid() && dbEntry._modtime != localEntry.modtime && serverEntry.modtime == localEntry.modtime);
|
||||
|
||||
// It could be a conflict even if size and mtime match!
|
||||
//
|
||||
|
|
|
@ -328,35 +328,22 @@ private slots:
|
|||
fakeFolder.localModifier().insert("A/a0", size);
|
||||
QVERIFY(!fakeFolder.syncOnce()); // error: abort!
|
||||
|
||||
// Now the next sync gets a NEW/NEW conflict and since there's no checksum
|
||||
// it just becomes a UPDATE_METADATA
|
||||
auto checkEtagUpdated = [&](SyncFileItemVector &items) {
|
||||
QCOMPARE(items.size(), 1);
|
||||
QCOMPARE(items[0]->_file, QLatin1String("A"));
|
||||
SyncJournalFileRecord record;
|
||||
QVERIFY(fakeFolder.syncJournal().getFileRecord(QByteArray("A/a0"), &record));
|
||||
QCOMPARE(record._etag, fakeFolder.remoteModifier().find("A/a0")->etag);
|
||||
};
|
||||
auto connection = connect(&fakeFolder.syncEngine(), &SyncEngine::aboutToPropagate, checkEtagUpdated);
|
||||
QVERIFY(fakeFolder.syncOnce());
|
||||
disconnect(connection);
|
||||
QCOMPARE(nGET, 0);
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
|
||||
|
||||
// Test 2: modified file upload aborted
|
||||
nGET = 0;
|
||||
fakeFolder.localModifier().appendByte("A/a0");
|
||||
QVERIFY(!fakeFolder.syncOnce()); // error: abort!
|
||||
|
||||
// An EVAL/EVAL conflict is also UPDATE_METADATA when there's no checksums
|
||||
connection = connect(&fakeFolder.syncEngine(), &SyncEngine::aboutToPropagate, checkEtagUpdated);
|
||||
QVERIFY(fakeFolder.syncOnce());
|
||||
disconnect(connection);
|
||||
QCOMPARE(nGET, 0);
|
||||
QCOMPARE(nGET, 1);
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
|
||||
|
||||
// Test 3: modified file upload aborted, with good checksums
|
||||
nGET = 0;
|
||||
fakeFolder.localModifier().appendByte("A/a0");
|
||||
QVERIFY(!fakeFolder.syncOnce()); // error: abort!
|
||||
|
||||
|
@ -365,12 +352,11 @@ private slots:
|
|||
fakeFolder.remoteModifier().find("A/a0")->checksums = moveChecksumHeader;
|
||||
|
||||
QVERIFY(fakeFolder.syncOnce());
|
||||
disconnect(connection);
|
||||
QCOMPARE(nGET, 0); // no new download, just a metadata update!
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
|
||||
|
||||
// Test 4: New file, that gets deleted locally before the next sync
|
||||
nGET = 0;
|
||||
fakeFolder.localModifier().insert("A/a3", size);
|
||||
QVERIFY(!fakeFolder.syncOnce()); // error: abort!
|
||||
fakeFolder.localModifier().remove("A/a3");
|
||||
|
|
|
@ -432,7 +432,7 @@ private slots:
|
|||
|
||||
QTest::newRow("Same mtime, but no server checksum -> ignored in reconcile")
|
||||
<< true << QByteArray()
|
||||
<< 0;
|
||||
<< 1;
|
||||
|
||||
QTest::newRow("Same mtime, weak server checksum differ -> downloaded")
|
||||
<< true << QByteArray("Adler32:bad")
|
||||
|
|
Loading…
Reference in a new issue