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 6a164d8f0ff2aac4ff56893cfc13914c323e1737..807d3bcf8e2d7fb44e340b813aed46504660aeb4 100644 |
--- a/sync/internal_api/sync_manager_impl.cc |
+++ b/sync/internal_api/sync_manager_impl.cc |
@@ -344,6 +344,19 @@ void SyncManagerImpl::ConfigureSyncer( |
DCHECK(!ready_task.is_null()); |
DCHECK(!retry_task.is_null()); |
+ // Cleanup any types that might have just been disabled. |
+ ModelTypeSet previous_types = ModelTypeSet::All(); |
+ if (!session_context_->routing_info().empty()) |
+ previous_types = GetRoutingInfoTypes(session_context_->routing_info()); |
+ if (!PurgeDisabledTypes(previous_types, |
+ GetRoutingInfoTypes(new_routing_info))) { |
+ // We failed to cleanup the types. Invoke the ready task without actually |
+ // configuring any types. The caller should detect this as a configuration |
+ // failure and act appropriately. |
+ ready_task.Run(); |
+ return; |
+ } |
+ |
// 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 = |
@@ -462,7 +475,19 @@ bool SyncManagerImpl::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. |
+ // TODO(rlarocque): remove the PurgeDisabledTypes call once we no longer |
+ // initialize the session context with the enabled types (purging disabled |
+ // types will be done within ConfigureSyncer). |
+ if (!PurgePartiallySyncedTypes() || |
+ !PurgeDisabledTypes( |
+ ModelTypeSet::All(), |
+ GetRoutingInfoTypes(session_context_->routing_info()))) |
success = false; |
// Cryptographer should only be accessed while holding a |
@@ -710,6 +735,19 @@ bool SyncManagerImpl::PurgePartiallySyncedTypes() { |
return directory()->PurgeEntriesWithTypeIn(partially_synced_types); |
} |
+bool SyncManagerImpl::PurgeDisabledTypes( |
+ ModelTypeSet previously_enabled_types, |
+ ModelTypeSet currently_enabled_types) { |
+ ModelTypeSet disabled_types = Difference(previously_enabled_types, |
+ currently_enabled_types); |
+ if (disabled_types.Empty()) |
+ return true; |
+ |
+ DVLOG(1) << "Purging disabled types " |
+ << ModelTypeSetToString(disabled_types); |
+ return directory()->PurgeEntriesWithTypeIn(disabled_types); |
+} |
+ |
void SyncManagerImpl::UpdateCredentials( |
const SyncCredentials& credentials) { |
DCHECK(thread_checker_.CalledOnValidThread()); |