| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/sync/driver/glue/sync_backend_host_impl.h" | 5 #include "components/sync/driver/glue/sync_backend_host_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 | 194 |
| 195 // Shut down and destroy SyncManager. SyncManager holds a pointer to | 195 // Shut down and destroy SyncManager. SyncManager holds a pointer to |
| 196 // |registrar_| so its destruction must be sequenced before the destruction of | 196 // |registrar_| so its destruction must be sequenced before the destruction of |
| 197 // |registrar_|. | 197 // |registrar_|. |
| 198 sync_task_runner_->PostTask( | 198 sync_task_runner_->PostTask( |
| 199 FROM_HERE, base::Bind(&SyncBackendHostCore::DoShutdown, core_, reason)); | 199 FROM_HERE, base::Bind(&SyncBackendHostCore::DoShutdown, core_, reason)); |
| 200 core_ = nullptr; | 200 core_ = nullptr; |
| 201 registrar_ = nullptr; | 201 registrar_ = nullptr; |
| 202 } | 202 } |
| 203 | 203 |
| 204 ModelTypeSet SyncBackendHostImpl::ConfigureDataTypes( | 204 void SyncBackendHostImpl::ConfigureDataTypes(ConfigureParams params) { |
| 205 ConfigureReason reason, | |
| 206 const DataTypeConfigStateMap& config_state_map, | |
| 207 const base::Callback<void(ModelTypeSet, ModelTypeSet)>& ready_task, | |
| 208 const base::Callback<void()>& retry_callback) { | |
| 209 // Only one configure is allowed at a time. This is guaranteed by our | |
| 210 // callers. The SyncBackendHostImpl requests one configure as the backend is | |
| 211 // initializing and waits for it to complete. After initialization, all | |
| 212 // configurations will pass through the DataTypeManager, which is careful to | |
| 213 // never send a new configure request until the current request succeeds. | |
| 214 | |
| 215 // The SyncBackendRegistrar's routing info will be updated by adding the | |
| 216 // types_to_add to the list then removing types_to_remove. Any types which | |
| 217 // are not in either of those sets will remain untouched. | |
| 218 // | |
| 219 // Types which were not in the list previously are not fully downloaded, so we | |
| 220 // must ask the syncer to download them. Any newly supported datatypes will | |
| 221 // not have been in that routing info list, so they will be among the types | |
| 222 // downloaded if they are enabled. | |
| 223 // | |
| 224 // The SyncBackendRegistrar's state was initially derived from the types | |
| 225 // detected to have been downloaded in the database. Afterwards it is | |
| 226 // modified only by this function. We expect it to remain in sync with the | |
| 227 // backend because configuration requests are never aborted; they are retried | |
| 228 // until they succeed or the backend is shut down. | |
| 229 | |
| 230 ModelTypeSet disabled_types = GetDataTypesInState(DISABLED, config_state_map); | |
| 231 ModelTypeSet fatal_types = GetDataTypesInState(FATAL, config_state_map); | |
| 232 ModelTypeSet crypto_types = GetDataTypesInState(CRYPTO, config_state_map); | |
| 233 ModelTypeSet unready_types = GetDataTypesInState(UNREADY, config_state_map); | |
| 234 | |
| 235 disabled_types.PutAll(fatal_types); | |
| 236 disabled_types.PutAll(crypto_types); | |
| 237 disabled_types.PutAll(unready_types); | |
| 238 | |
| 239 ModelTypeSet active_types = | |
| 240 GetDataTypesInState(CONFIGURE_ACTIVE, config_state_map); | |
| 241 ModelTypeSet clean_first_types = | |
| 242 GetDataTypesInState(CONFIGURE_CLEAN, config_state_map); | |
| 243 ModelTypeSet types_to_download = registrar_->ConfigureDataTypes( | |
| 244 Union(active_types, clean_first_types), disabled_types); | |
| 245 types_to_download.PutAll(clean_first_types); | |
| 246 types_to_download.RemoveAll(ProxyTypes()); | |
| 247 if (!types_to_download.Empty()) | |
| 248 types_to_download.Put(NIGORI); | |
| 249 | |
| 250 // TODO(sync): crbug.com/137550. | |
| 251 // It's dangerous to configure types that have progress markers. Types with | |
| 252 // progress markers can trigger a MIGRATION_DONE response. We are not | |
| 253 // prepared to handle a migration during a configure, so we must ensure that | |
| 254 // all our types_to_download actually contain no data before we sync them. | |
| 255 // | |
| 256 // One common way to end up in this situation used to be types which | |
| 257 // downloaded some or all of their data but have not applied it yet. We avoid | |
| 258 // problems with those types by purging the data of any such partially synced | |
| 259 // types soon after we load the directory. | |
| 260 // | |
| 261 // Another possible scenario is that we have newly supported or newly enabled | |
| 262 // data types being downloaded here but the nigori type, which is always | |
| 263 // included in any GetUpdates request, requires migration. The server has | |
| 264 // code to detect this scenario based on the configure reason, the fact that | |
| 265 // the nigori type is the only requested type which requires migration, and | |
| 266 // that the requested types list includes at least one non-nigori type. It | |
| 267 // will not send a MIGRATION_DONE response in that case. We still need to be | |
| 268 // careful to not send progress markers for non-nigori types, though. If a | |
| 269 // non-nigori type in the request requires migration, a MIGRATION_DONE | |
| 270 // response will be sent. | |
| 271 | |
| 272 ModelSafeRoutingInfo routing_info; | |
| 273 registrar_->GetModelSafeRoutingInfo(&routing_info); | |
| 274 | |
| 275 ModelTypeSet current_types = registrar_->GetLastConfiguredTypes(); | |
| 276 ModelTypeSet types_to_purge = Difference(ModelTypeSet::All(), current_types); | |
| 277 ModelTypeSet inactive_types = | |
| 278 GetDataTypesInState(CONFIGURE_INACTIVE, config_state_map); | |
| 279 // Include clean_first_types in types_to_purge, they are part of | |
| 280 // current_types, but still need to be cleared. | |
| 281 DCHECK(current_types.HasAll(clean_first_types)); | |
| 282 types_to_purge.PutAll(clean_first_types); | |
| 283 types_to_purge.RemoveAll(inactive_types); | |
| 284 types_to_purge.RemoveAll(unready_types); | |
| 285 | |
| 286 // If a type has already been disabled and unapplied or journaled, it will | |
| 287 // not be part of the |types_to_purge| set, and therefore does not need | |
| 288 // to be acted on again. | |
| 289 fatal_types.RetainAll(types_to_purge); | |
| 290 ModelTypeSet unapply_types = Union(crypto_types, clean_first_types); | |
| 291 unapply_types.RetainAll(types_to_purge); | |
| 292 | |
| 293 DCHECK(Intersection(current_types, fatal_types).Empty()); | |
| 294 DCHECK(Intersection(current_types, crypto_types).Empty()); | |
| 295 DCHECK(current_types.HasAll(types_to_download)); | |
| 296 | |
| 297 SDVLOG(1) << "Types " << ModelTypeSetToString(types_to_download) | |
| 298 << " added; calling DoConfigureSyncer"; | |
| 299 // Divide up the types into their corresponding actions (each is mutually | |
| 300 // exclusive): | |
| 301 // - Types which have just been added to the routing info (types_to_download): | |
| 302 // are downloaded. | |
| 303 // - Types which have encountered a fatal error (fatal_types) are deleted | |
| 304 // from the directory and journaled in the delete journal. | |
| 305 // - Types which have encountered a cryptographer error (crypto_types) are | |
| 306 // unapplied (local state is purged but sync state is not). | |
| 307 // - All other types not in the routing info (types just disabled) are deleted | |
| 308 // from the directory. | |
| 309 // - Everything else (enabled types and already disabled types) is not | |
| 310 // touched. | |
| 311 sync_task_runner_->PostTask( | 205 sync_task_runner_->PostTask( |
| 312 FROM_HERE, base::Bind(&SyncBackendHostCore::DoPurgeDisabledTypes, core_, | 206 FROM_HERE, |
| 313 types_to_purge, fatal_types, unapply_types)); | 207 base::Bind(&SyncBackendHostCore::DoPurgeDisabledTypes, core_, |
| 314 RequestConfigureSyncer(reason, types_to_download, routing_info, ready_task, | 208 params.to_purge, params.to_journal, params.to_unapply)); |
| 315 retry_callback); | 209 sync_task_runner_->PostTask( |
| 316 | 210 FROM_HERE, base::Bind(&SyncBackendHostCore::DoConfigureSyncer, core_, |
| 317 DCHECK(Intersection(active_types, types_to_purge).Empty()); | 211 base::Passed(¶ms))); |
| 318 DCHECK(Intersection(active_types, fatal_types).Empty()); | |
| 319 DCHECK(Intersection(active_types, unapply_types).Empty()); | |
| 320 DCHECK(Intersection(active_types, inactive_types).Empty()); | |
| 321 return Difference(active_types, types_to_download); | |
| 322 } | 212 } |
| 323 | 213 |
| 324 void SyncBackendHostImpl::EnableEncryptEverything() { | 214 void SyncBackendHostImpl::EnableEncryptEverything() { |
| 325 sync_task_runner_->PostTask( | 215 sync_task_runner_->PostTask( |
| 326 FROM_HERE, | 216 FROM_HERE, |
| 327 base::Bind(&SyncBackendHostCore::DoEnableEncryptEverything, core_)); | 217 base::Bind(&SyncBackendHostCore::DoEnableEncryptEverything, core_)); |
| 328 } | 218 } |
| 329 | 219 |
| 330 void SyncBackendHostImpl::ActivateDirectoryDataType( | 220 void SyncBackendHostImpl::ActivateDirectoryDataType( |
| 331 ModelType type, | 221 ModelType type, |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 } | 316 } |
| 427 | 317 |
| 428 void SyncBackendHostImpl::DisableDirectoryTypeDebugInfoForwarding() { | 318 void SyncBackendHostImpl::DisableDirectoryTypeDebugInfoForwarding() { |
| 429 DCHECK(initialized()); | 319 DCHECK(initialized()); |
| 430 sync_task_runner_->PostTask( | 320 sync_task_runner_->PostTask( |
| 431 FROM_HERE, | 321 FROM_HERE, |
| 432 base::Bind(&SyncBackendHostCore::DisableDirectoryTypeDebugInfoForwarding, | 322 base::Bind(&SyncBackendHostCore::DisableDirectoryTypeDebugInfoForwarding, |
| 433 core_)); | 323 core_)); |
| 434 } | 324 } |
| 435 | 325 |
| 436 void SyncBackendHostImpl::RequestConfigureSyncer( | |
| 437 ConfigureReason reason, | |
| 438 ModelTypeSet to_download, | |
| 439 const ModelSafeRoutingInfo& routing_info, | |
| 440 const base::Callback<void(ModelTypeSet, ModelTypeSet)>& ready_task, | |
| 441 const base::Closure& retry_callback) { | |
| 442 sync_task_runner_->PostTask( | |
| 443 FROM_HERE, | |
| 444 base::Bind(&SyncBackendHostCore::DoConfigureSyncer, core_, reason, | |
| 445 to_download, routing_info, ready_task, retry_callback)); | |
| 446 } | |
| 447 | |
| 448 void SyncBackendHostImpl::FinishConfigureDataTypesOnFrontendLoop( | 326 void SyncBackendHostImpl::FinishConfigureDataTypesOnFrontendLoop( |
| 449 const ModelTypeSet enabled_types, | 327 const ModelTypeSet enabled_types, |
| 450 const ModelTypeSet succeeded_configuration_types, | 328 const ModelTypeSet succeeded_configuration_types, |
| 451 const ModelTypeSet failed_configuration_types, | 329 const ModelTypeSet failed_configuration_types, |
| 452 const base::Callback<void(ModelTypeSet, ModelTypeSet)>& ready_task) { | 330 const base::Callback<void(ModelTypeSet, ModelTypeSet)>& ready_task) { |
| 453 if (invalidator_) { | 331 if (invalidator_) { |
| 454 CHECK(invalidator_->UpdateRegisteredInvalidationIds( | 332 CHECK(invalidator_->UpdateRegisteredInvalidationIds( |
| 455 this, ModelTypeSetToObjectIdSet(enabled_types))); | 333 this, ModelTypeSetToObjectIdSet(enabled_types))); |
| 456 } | 334 } |
| 457 | 335 |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 691 const SyncManager::ClearServerDataCallback& frontend_callback) { | 569 const SyncManager::ClearServerDataCallback& frontend_callback) { |
| 692 DCHECK(thread_checker_.CalledOnValidThread()); | 570 DCHECK(thread_checker_.CalledOnValidThread()); |
| 693 frontend_callback.Run(); | 571 frontend_callback.Run(); |
| 694 } | 572 } |
| 695 | 573 |
| 696 } // namespace syncer | 574 } // namespace syncer |
| 697 | 575 |
| 698 #undef SDVLOG | 576 #undef SDVLOG |
| 699 | 577 |
| 700 #undef SLOG | 578 #undef SLOG |
| OLD | NEW |