| Index: components/sync/syncable/directory.cc
|
| diff --git a/components/sync/syncable/directory.cc b/components/sync/syncable/directory.cc
|
| index ba417e757a4f322bddbcaa6f6e08ebda9df30b1e..42fd457bc24b81b35816b68cd3b36cb4f32882b1 100644
|
| --- a/components/sync/syncable/directory.cc
|
| +++ b/components/sync/syncable/directory.cc
|
| @@ -729,81 +729,77 @@ void Directory::DeleteEntry(const ScopedKernelLock& lock,
|
| }
|
| }
|
|
|
| -bool Directory::PurgeEntriesWithTypeIn(ModelTypeSet disabled_types,
|
| +void Directory::PurgeEntriesWithTypeIn(ModelTypeSet disabled_types,
|
| ModelTypeSet types_to_journal,
|
| ModelTypeSet types_to_unapply) {
|
| disabled_types.RemoveAll(ProxyTypes());
|
| -
|
| if (disabled_types.Empty())
|
| - return true;
|
| + return;
|
|
|
| - {
|
| - WriteTransaction trans(FROM_HERE, PURGE_ENTRIES, this);
|
| + WriteTransaction trans(FROM_HERE, PURGE_ENTRIES, this);
|
|
|
| - OwnedEntryKernelSet entries_to_journal;
|
| + OwnedEntryKernelSet entries_to_journal;
|
|
|
| - {
|
| - ScopedKernelLock lock(this);
|
| + {
|
| + ScopedKernelLock lock(this);
|
|
|
| - bool found_progress = false;
|
| - for (ModelTypeSet::Iterator iter = disabled_types.First(); iter.Good();
|
| - iter.Inc()) {
|
| - if (!kernel_->persisted_info.HasEmptyDownloadProgress(iter.Get()))
|
| - found_progress = true;
|
| - }
|
| + bool found_progress = false;
|
| + for (ModelTypeSet::Iterator iter = disabled_types.First(); iter.Good();
|
| + iter.Inc()) {
|
| + if (!kernel_->persisted_info.HasEmptyDownloadProgress(iter.Get()))
|
| + found_progress = true;
|
| + }
|
|
|
| - // If none of the disabled types have progress markers, there's nothing to
|
| - // purge.
|
| - if (!found_progress)
|
| - return true;
|
| -
|
| - for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin();
|
| - it != kernel_->metahandles_map.end();) {
|
| - EntryKernel* entry = it->second.get();
|
| - const sync_pb::EntitySpecifics& local_specifics = entry->ref(SPECIFICS);
|
| - const sync_pb::EntitySpecifics& server_specifics =
|
| - entry->ref(SERVER_SPECIFICS);
|
| - ModelType local_type = GetModelTypeFromSpecifics(local_specifics);
|
| - ModelType server_type = GetModelTypeFromSpecifics(server_specifics);
|
| -
|
| - // Increment the iterator before (potentially) calling DeleteEntry,
|
| - // otherwise our iterator may be invalidated.
|
| - ++it;
|
| -
|
| - if ((IsRealDataType(local_type) && disabled_types.Has(local_type)) ||
|
| - (IsRealDataType(server_type) && disabled_types.Has(server_type))) {
|
| - if (types_to_unapply.Has(local_type) ||
|
| - types_to_unapply.Has(server_type)) {
|
| - UnapplyEntry(entry);
|
| - } else {
|
| - bool save_to_journal =
|
| - (types_to_journal.Has(local_type) ||
|
| - types_to_journal.Has(server_type)) &&
|
| - (delete_journal_->IsDeleteJournalEnabled(local_type) ||
|
| - delete_journal_->IsDeleteJournalEnabled(server_type));
|
| - DeleteEntry(lock, save_to_journal, entry, &entries_to_journal);
|
| - }
|
| + // If none of the disabled types have progress markers, there's nothing to
|
| + // purge.
|
| + if (!found_progress)
|
| + return;
|
| +
|
| + for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin();
|
| + it != kernel_->metahandles_map.end();) {
|
| + EntryKernel* entry = it->second.get();
|
| + const sync_pb::EntitySpecifics& local_specifics = entry->ref(SPECIFICS);
|
| + const sync_pb::EntitySpecifics& server_specifics =
|
| + entry->ref(SERVER_SPECIFICS);
|
| + ModelType local_type = GetModelTypeFromSpecifics(local_specifics);
|
| + ModelType server_type = GetModelTypeFromSpecifics(server_specifics);
|
| +
|
| + // Increment the iterator before (potentially) calling DeleteEntry,
|
| + // otherwise our iterator may be invalidated.
|
| + ++it;
|
| +
|
| + if ((IsRealDataType(local_type) && disabled_types.Has(local_type)) ||
|
| + (IsRealDataType(server_type) && disabled_types.Has(server_type))) {
|
| + if (types_to_unapply.Has(local_type) ||
|
| + types_to_unapply.Has(server_type)) {
|
| + UnapplyEntry(entry);
|
| + } else {
|
| + bool save_to_journal =
|
| + (types_to_journal.Has(local_type) ||
|
| + types_to_journal.Has(server_type)) &&
|
| + (delete_journal_->IsDeleteJournalEnabled(local_type) ||
|
| + delete_journal_->IsDeleteJournalEnabled(server_type));
|
| + DeleteEntry(lock, save_to_journal, entry, &entries_to_journal);
|
| }
|
| }
|
| + }
|
|
|
| - delete_journal_->AddJournalBatch(&trans, entries_to_journal);
|
| + delete_journal_->AddJournalBatch(&trans, entries_to_journal);
|
|
|
| - // Ensure meta tracking for these data types reflects the purged state.
|
| - for (ModelTypeSet::Iterator it = disabled_types.First(); it.Good();
|
| - it.Inc()) {
|
| - kernel_->persisted_info.transaction_version[it.Get()] = 0;
|
| + // Ensure meta tracking for these data types reflects the purged state.
|
| + for (ModelTypeSet::Iterator it = disabled_types.First(); it.Good();
|
| + it.Inc()) {
|
| + kernel_->persisted_info.transaction_version[it.Get()] = 0;
|
|
|
| - // Don't discard progress markers or context for unapplied types.
|
| - if (!types_to_unapply.Has(it.Get())) {
|
| - kernel_->persisted_info.ResetDownloadProgress(it.Get());
|
| - kernel_->persisted_info.datatype_context[it.Get()].Clear();
|
| - }
|
| + // Don't discard progress markers or context for unapplied types.
|
| + if (!types_to_unapply.Has(it.Get())) {
|
| + kernel_->persisted_info.ResetDownloadProgress(it.Get());
|
| + kernel_->persisted_info.datatype_context[it.Get()].Clear();
|
| }
|
| -
|
| - kernel_->info_status = KERNEL_SHARE_INFO_DIRTY;
|
| }
|
| +
|
| + kernel_->info_status = KERNEL_SHARE_INFO_DIRTY;
|
| }
|
| - return true;
|
| }
|
|
|
| bool Directory::ResetVersionsForType(BaseWriteTransaction* trans,
|
|
|