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.
This commit is contained in:
Christian Kamm 2015-06-19 13:51:55 +02:00
parent 9a9897ea1e
commit deb5e68e15
4 changed files with 49 additions and 8 deletions

View file

@ -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);
}

View file

@ -83,6 +83,7 @@ protected slots:
void slotOpenAccountWizard();
void slotHideProgress();
void slotSelectiveSync();
void slotForceRemoteDiscoveryOnFolders();
private:
QString shortenFilename( const QString& folder, const QString& file ) const;

View file

@ -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);

View file

@ -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<QString>& filepathsToKeep,
const QSet<QString>& 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.