Skip to content

Commit df43b4c

Browse files
committed
fix(windows): inode property may be missing for some entries: add it
when syncing in full mode (only local file system and no client DB cache), verifies that inode has a strictly positive value and if not ensure we will update it close #9142 Signed-off-by: Matthieu Gallien <[email protected]>
1 parent dafec4b commit df43b4c

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

src/libsync/discovery.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,14 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
13941394
<< "dbEntry._modtime:" << dbEntry._modtime
13951395
<< "localEntry.modtime:" << localEntry.modtime;
13961396
_childModified = true;
1397+
} else if (!serverModified &&
1398+
!noServerEntry &&
1399+
dbEntry._fileSize == localEntry.size &&
1400+
dbEntry._modtime == localEntry.modtime &&
1401+
dbEntry._inode == 0 &&
1402+
localEntry.inode > 0) {
1403+
item->_instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
1404+
item->_direction = SyncFileItem::Down;
13971405
} else {
13981406
// Local file was changed
13991407
item->_instruction = CSYNC_INSTRUCTION_SYNC;

test/testlocaldiscovery.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <localdiscoverytracker.h>
1515

1616
using namespace OCC;
17+
using namespace Qt::StringLiterals;
1718

1819
class TestLocalDiscovery : public QObject
1920
{
@@ -971,6 +972,72 @@ private slots:
971972
QVERIFY(!fakeFolder.syncOnce());
972973
QCOMPARE(syncSpy.findItem(fileNameE)->_status, SyncFileItem::Status::Success);
973974
}
975+
976+
void testMissingInodeAndFixThem()
977+
{
978+
FakeFolder fakeFolder{FileInfo{}};
979+
980+
fakeFolder.remoteModifier().mkdir(u"A"_s);
981+
fakeFolder.remoteModifier().mkdir(u"A/B"_s);
982+
fakeFolder.remoteModifier().insert(u"textFile.txt"_s);
983+
fakeFolder.remoteModifier().insert(u"document.md"_s);
984+
fakeFolder.remoteModifier().insert(u"A/B/sub-folder.md"_s);
985+
986+
QVERIFY(fakeFolder.syncOnce());
987+
988+
auto documentFileRecord = SyncJournalFileRecord{};
989+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"document.md"_s, &documentFileRecord));
990+
QCOMPARE_GT(documentFileRecord._inode, 0);
991+
documentFileRecord._inode = 0;
992+
QVERIFY(fakeFolder.syncJournal().setFileRecord(documentFileRecord).isValid());
993+
994+
auto textFileFileRecord = SyncJournalFileRecord{};
995+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"textFile.txt"_s, &textFileFileRecord));
996+
QCOMPARE_GT(textFileFileRecord._inode, 0);
997+
textFileFileRecord._inode = 0;
998+
QVERIFY(fakeFolder.syncJournal().setFileRecord(textFileFileRecord).isValid());
999+
1000+
auto aFolderFileRecord = SyncJournalFileRecord{};
1001+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"A"_s, &aFolderFileRecord));
1002+
QCOMPARE_GT(aFolderFileRecord._inode, 0);
1003+
aFolderFileRecord._inode = 0;
1004+
QVERIFY(fakeFolder.syncJournal().setFileRecord(aFolderFileRecord).isValid());
1005+
1006+
auto bFolderFileRecord = SyncJournalFileRecord{};
1007+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"A/B"_s, &bFolderFileRecord));
1008+
QCOMPARE_GT(bFolderFileRecord._inode, 0);
1009+
bFolderFileRecord._inode = 0;
1010+
QVERIFY(fakeFolder.syncJournal().setFileRecord(bFolderFileRecord).isValid());
1011+
1012+
auto subFolderFileRecord = SyncJournalFileRecord{};
1013+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"A/B/sub-folder.md"_s, &subFolderFileRecord));
1014+
QCOMPARE_GT(subFolderFileRecord._inode, 0);
1015+
subFolderFileRecord._inode = 0;
1016+
QVERIFY(fakeFolder.syncJournal().setFileRecord(subFolderFileRecord).isValid());
1017+
1018+
fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly);
1019+
QVERIFY(fakeFolder.syncOnce());
1020+
1021+
documentFileRecord = SyncJournalFileRecord{};
1022+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"document.md"_s, &documentFileRecord));
1023+
QCOMPARE_GT(documentFileRecord._inode, 0);
1024+
1025+
textFileFileRecord = SyncJournalFileRecord{};
1026+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"textFile.txt"_s, &textFileFileRecord));
1027+
QCOMPARE_GT(textFileFileRecord._inode, 0);
1028+
1029+
aFolderFileRecord = SyncJournalFileRecord{};
1030+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"A"_s, &aFolderFileRecord));
1031+
QCOMPARE_GT(aFolderFileRecord._inode, 0);
1032+
1033+
bFolderFileRecord = SyncJournalFileRecord{};
1034+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"A/B"_s, &bFolderFileRecord));
1035+
QCOMPARE_GT(bFolderFileRecord._inode, 0);
1036+
1037+
subFolderFileRecord = SyncJournalFileRecord{};
1038+
QVERIFY(fakeFolder.syncJournal().getFileRecord(u"A/B/sub-folder.md"_s, &subFolderFileRecord));
1039+
QCOMPARE_GT(subFolderFileRecord._inode, 0);
1040+
}
9741041
};
9751042

9761043
QTEST_GUILESS_MAIN(TestLocalDiscovery)

0 commit comments

Comments
 (0)