Chromium Code Reviews| Index: sync/internal_api/sync_manager_impl.cc |
| diff --git a/sync/internal_api/sync_manager_impl.cc b/sync/internal_api/sync_manager_impl.cc |
| index 107ed606e743b2bdbd91d550541e84f238a5b35f..1a26fe048f9e196b8dc6e762637b0a06b43bb2a3 100644 |
| --- a/sync/internal_api/sync_manager_impl.cc |
| +++ b/sync/internal_api/sync_manager_impl.cc |
| @@ -202,6 +202,11 @@ class SyncManagerImpl::SyncInternal |
| // Returns false if an error occurred, true otherwise. |
| bool PurgePartiallySyncedTypes(); |
| + // Purges all disabled types. |
| + // Warning: this is expensive as it will iterate over all entries in the |
| + // directory. Only call if absolutely necessary. |
| + bool CleanupDisabledTypes(); |
| + |
| // Update tokens that we're using in Sync. Email must stay the same. |
| void UpdateCredentials(const SyncCredentials& credentials); |
| @@ -829,6 +834,20 @@ void SyncManagerImpl::ConfigureSyncer( |
| DCHECK(!ready_task.is_null()); |
| DCHECK(!retry_task.is_null()); |
| + // Cleanup disabled types if necessary. |
| + // Note: tests might not have a session context. |
| + if (data_->session_context()) { |
| + ModelTypeSet disabled_types = |
| + Difference( |
|
tim (not reviewing)
2012/07/19 22:05:59
nit: I'd move Difference( up one line
Nicolas Zea
2012/07/20 22:07:01
Done.
|
| + GetRoutingInfoTypes(data_->session_context()->routing_info()), |
| + GetRoutingInfoTypes(new_routing_info)); |
| + if (!disabled_types.Empty()) { |
| + DVLOG(1) << "Purging disabled types: " |
| + << ModelTypeSetToString(disabled_types); |
| + data_->directory()->PurgeEntriesWithTypeIn(disabled_types); |
|
tim (not reviewing)
2012/07/19 22:05:59
We should probably bail / callback / use a bigger
Nicolas Zea
2012/07/20 22:07:01
Done.
|
| + } |
| + } |
| + |
| // TODO(zea): set this based on whether cryptographer has keystore |
| // encryption key or not (requires opening a transaction). crbug.com/129665. |
| ConfigurationParams::KeystoreKeyStatus keystore_key_status = |
| @@ -968,7 +987,13 @@ bool SyncManagerImpl::SyncInternal::Init( |
| // trigger the migration logic before the backend is initialized, resulting |
| // in crashes. We therefore detect and purge any partially synced types as |
| // part of initialization. |
| - if (!PurgePartiallySyncedTypes()) |
| + // |
| + // Similarly, a type may have been disabled previously, but we didn't |
| + // manage to purge. Ensure we cleanup any disabled types before starting up. |
| + // |
| + // Note: If either of these methods fail, we have directory corruption and |
| + // cannot continue. |
| + if (!PurgePartiallySyncedTypes() || !CleanupDisabledTypes()) |
| success = false; |
| // Cryptographer should only be accessed while holding a |
| @@ -998,6 +1023,23 @@ bool SyncManagerImpl::SyncInternal::Init( |
| return success; |
| } |
| +bool SyncManagerImpl::SyncInternal::CleanupDisabledTypes() { |
| + if (testing_mode_ != NON_TEST) |
| + return true; |
| + |
| + ModelTypeSet enabled_types = GetRoutingInfoTypes( |
| + session_context()->routing_info()); |
| + ModelTypeSet disabled_types = Difference(ModelTypeSet::All(), |
| + enabled_types); |
| + if (disabled_types.Empty()) |
| + return true; |
| + |
| + DVLOG(1) << "Purging disabled types " |
| + << ModelTypeSetToString(disabled_types); |
| + return directory()->PurgeEntriesWithTypeIn(disabled_types); |
| +} |
| + |
| + |
| void SyncManagerImpl::SyncInternal::UpdateCryptographerAndNigori( |
| const std::string& chrome_version, |
| const base::Closure& done_callback) { |