From deb5e68e151033eea184336e4d8dbb7e4cf64599 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Fri, 19 Jun 2015 13:51:55 +0200 Subject: [PATCH] Ignores: Force a remote discovery after ignore list change #3172 The problem was that the modified ignore pattern was not applied to the parts of the remote tree we simply retrieve from the db because the folder etag didn't change. Even worse, if one removed an ignore pattern, the un-ignored files would not be synced correctly. With this change, a modification to the ignore list always results in a full remote discovery. This guarantees that we find un-ignored files. --- src/gui/accountsettings.cpp | 13 +++++++++++++ src/gui/accountsettings.h | 1 + src/libsync/syncjournaldb.cpp | 33 +++++++++++++++++++++++++-------- src/libsync/syncjournaldb.h | 10 ++++++++++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index 919bae587..f1fa0d8bc 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -398,6 +398,18 @@ void AccountSettings::slotSelectiveSync() } } +void AccountSettings::slotForceRemoteDiscoveryOnFolders() +{ + FolderMan* folders = FolderMan::instance(); + foreach (Folder* folder, folders->map()) { + if (folder->accountState() != _accountState) { + continue; + } + + folder->journalDb()->forceRemoteDiscoveryNextSync(); + } +} + void AccountSettings::slotDoubleClicked( const QModelIndex& indx ) { if( ! indx.isValid() ) return; @@ -777,6 +789,7 @@ void AccountSettings::slotIgnoreFilesEditor() _ignoreEditor = new IgnoreListEditor(this); _ignoreEditor->setAttribute( Qt::WA_DeleteOnClose, true ); _ignoreEditor->open(); + connect(_ignoreEditor, SIGNAL(accepted()), SLOT(slotForceRemoteDiscoveryOnFolders())); } else { ownCloudGui::raiseDialog(_ignoreEditor); } diff --git a/src/gui/accountsettings.h b/src/gui/accountsettings.h index 94110a9bc..a6be9600b 100644 --- a/src/gui/accountsettings.h +++ b/src/gui/accountsettings.h @@ -83,6 +83,7 @@ protected slots: void slotOpenAccountWizard(); void slotHideProgress(); void slotSelectiveSync(); + void slotForceRemoteDiscoveryOnFolders(); private: QString shortenFilename( const QString& folder, const QString& file ) const; diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp index 9298a120f..a3f6a5d1f 100644 --- a/src/libsync/syncjournaldb.cpp +++ b/src/libsync/syncjournaldb.cpp @@ -331,14 +331,7 @@ bool SyncJournalDb::checkConnect() * In 1.8.1 we had a fix to re-get the data, but this one here is better */ if (forceRemoteDiscovery) { - qDebug() << "Forcing remote re-discovery by deleting folder Etags"; - SqlQuery deleteRemoteFolderEtagsQuery(_db); - deleteRemoteFolderEtagsQuery.prepare("UPDATE metadata SET md5='_invalid_' WHERE type=2;"); - if( !deleteRemoteFolderEtagsQuery.exec() ) { - qDebug() << "ERROR: Query failed" << deleteRemoteFolderEtagsQuery.error(); - } else { - qDebug() << "Cleared" << deleteRemoteFolderEtagsQuery.numRowsAffected() << "folder ETags"; - } + forceRemoteDiscoveryNextSyncLocked(); } _getFileRecordQuery.reset(new SqlQuery(_db)); @@ -1295,6 +1288,30 @@ void SyncJournalDb::avoidReadFromDbOnNextSync(const QString& fileName) _avoidReadFromDbOnNextSyncFilter.append(fileName); } +void SyncJournalDb::forceRemoteDiscoveryNextSync() +{ + QMutexLocker locker(&_mutex); + + if( !checkConnect() ) { + return; + } + + forceRemoteDiscoveryNextSyncLocked(); +} + +void SyncJournalDb::forceRemoteDiscoveryNextSyncLocked() +{ + qDebug() << "Forcing remote re-discovery by deleting folder Etags"; + SqlQuery deleteRemoteFolderEtagsQuery(_db); + deleteRemoteFolderEtagsQuery.prepare("UPDATE metadata SET md5='_invalid_' WHERE type=2;"); + if( !deleteRemoteFolderEtagsQuery.exec() ) { + qDebug() << "ERROR: Query failed" << deleteRemoteFolderEtagsQuery.error(); + } else { + qDebug() << "Cleared" << deleteRemoteFolderEtagsQuery.numRowsAffected() << "folder ETags"; + } +} + + void SyncJournalDb::commit(const QString& context, bool startTrans) { QMutexLocker lock(&_mutex); diff --git a/src/libsync/syncjournaldb.h b/src/libsync/syncjournaldb.h index 6074631f1..f6e1f2f3d 100644 --- a/src/libsync/syncjournaldb.h +++ b/src/libsync/syncjournaldb.h @@ -97,6 +97,13 @@ public: */ void avoidReadFromDbOnNextSync(const QString& fileName); + /** + * Ensures full remote discovery happens on the next sync. + * + * Equivalent to calling avoidReadFromDbOnNextSync() for all files. + */ + void forceRemoteDiscoveryNextSync(); + bool postSyncCleanup(const QSet& filepathsToKeep, const QSet& prefixesToKeep); @@ -124,6 +131,9 @@ private: QStringList tableColumns( const QString& table ); bool checkConnect(); + // Same as forceRemoteDiscoveryNextSync but without acquiring the lock + void forceRemoteDiscoveryNextSyncLocked(); + SqlDatabase _db; QString _dbFile; QMutex _mutex; // Public functions are protected with the mutex.