Don't ignore file sync notification after an unlock

For a usual file sync event we check for actual changes in the local file,
after an unlock the local file might be unchanged so we need to sync it anyhow.

Fixes: owncloud/enterprise#3609
This commit is contained in:
Hannah von Reth 2019-12-16 16:33:41 +01:00 committed by Hannah von Reth
parent 8629adaf78
commit 583b54c367
3 changed files with 30 additions and 22 deletions

View File

@ -523,7 +523,7 @@ int Folder::slotWipeErrorBlacklist()
return _journal.wipeErrorBlacklist();
}
void Folder::slotWatchedPathChanged(const QString &path)
void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason)
{
if (!path.startsWith(this->path())) {
qCDebug(lcFolder) << "Changed path is not contained in folder, ignoring:" << path;
@ -554,27 +554,29 @@ void Folder::slotWatchedPathChanged(const QString &path)
}
#endif
// Check that the mtime/size actually changed or there was
// an attribute change (pin state) that caused the notification
bool spurious = false;
SyncJournalFileRecord record;
if (_journal.getFileRecord(relativePathBytes, &record)
&& record.isValid()
&& !FileSystem::fileChanged(path, record._fileSize, record._modtime)) {
spurious = true;
if (auto pinState = _vfs->pinState(relativePath.toString())) {
if (*pinState == PinState::AlwaysLocal && record.isVirtualFile())
spurious = false;
if (*pinState == PinState::OnlineOnly && record.isFile())
spurious = false;
SyncJournalFileRecord record;
_journal.getFileRecord(relativePathBytes, &record);
if (reason != ChangeReason::UnLock) {
// Check that the mtime/size actually changed or there was
// an attribute change (pin state) that caused the notification
bool spurious = false;
if (record.isValid()
&& !FileSystem::fileChanged(path, record._fileSize, record._modtime)) {
spurious = true;
if (auto pinState = _vfs->pinState(relativePath.toString())) {
if (*pinState == PinState::AlwaysLocal && record.isVirtualFile())
spurious = false;
if (*pinState == PinState::OnlineOnly && record.isFile())
spurious = false;
}
}
if (spurious) {
qCInfo(lcFolder) << "Ignoring spurious notification for file" << relativePath;
return; // probably a spurious notification
}
}
if (spurious) {
qCInfo(lcFolder) << "Ignoring spurious notification for file" << relativePath;
return; // probably a spurious notification
}
warnOnNewExcludedItem(record, relativePath);
emit watchedFileChangedExternally(path);
@ -1184,7 +1186,7 @@ void Folder::registerFolderWatcher()
_folderWatcher.reset(new FolderWatcher(this));
connect(_folderWatcher.data(), &FolderWatcher::pathChanged,
this, &Folder::slotWatchedPathChanged);
this, [this](const QString &path) { slotWatchedPathChanged(path, Folder::ChangeReason::Other); });
connect(_folderWatcher.data(), &FolderWatcher::lostChanges,
this, &Folder::slotNextSyncFullLocalDiscovery);
connect(_folderWatcher.data(), &FolderWatcher::becameUnreliable,

View File

@ -113,6 +113,12 @@ class Folder : public QObject
Q_OBJECT
public:
enum class ChangeReason {
Other,
UnLock
};
Q_ENUM(ChangeReason)
/** Create a new Folder
*/
Folder(const FolderDefinition &definition, AccountState *accountState, std::unique_ptr<Vfs> vfs, QObject *parent = 0L);
@ -336,7 +342,7 @@ public slots:
* changes. Needs to check whether this change should trigger a new
* sync run to be scheduled.
*/
void slotWatchedPathChanged(const QString &path);
void slotWatchedPathChanged(const QString &path, ChangeReason reason);
/**
* Mark a virtual file as being requested for download, and start a sync.

View File

@ -864,7 +864,7 @@ void FolderMan::slotWatchedFileUnlocked(const QString &path)
{
if (Folder *f = folderForPath(path)) {
// Treat this equivalently to the file being reported by the file watcher
f->slotWatchedPathChanged(path);
f->slotWatchedPathChanged(path, Folder::ChangeReason::UnLock);
}
}