| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 // If our state is not determined then we should not have the autofill | 338 // If our state is not determined then we should not have the autofill |
| 339 // profile node. | 339 // profile node. |
| 340 DCHECK(false); | 340 DCHECK(false); |
| 341 | 341 |
| 342 // just set it as not migrated. | 342 // just set it as not migrated. |
| 343 SetAutofillMigrationState(syncable::NOT_MIGRATED); | 343 SetAutofillMigrationState(syncable::NOT_MIGRATED); |
| 344 return; | 344 return; |
| 345 } | 345 } |
| 346 } | 346 } |
| 347 | 347 |
| 348 SyncBackendHost::PendingConfigureDataTypesState:: |
| 349 PendingConfigureDataTypesState() : deleted_type(false) {} |
| 350 |
| 348 void SyncBackendHost::ConfigureDataTypes( | 351 void SyncBackendHost::ConfigureDataTypes( |
| 349 const DataTypeController::TypeMap& data_type_controllers, | 352 const DataTypeController::TypeMap& data_type_controllers, |
| 350 const syncable::ModelTypeSet& types, | 353 const syncable::ModelTypeSet& types, |
| 351 CancelableTask* ready_task) { | 354 CancelableTask* ready_task) { |
| 352 // Only one configure is allowed at a time. | 355 // Only one configure is allowed at a time. |
| 353 DCHECK(!configure_ready_task_.get()); | 356 DCHECK(!pending_config_mode_state_.get()); |
| 357 DCHECK(!pending_download_state_.get()); |
| 354 DCHECK(syncapi_initialized_); | 358 DCHECK(syncapi_initialized_); |
| 355 | 359 |
| 356 if (types.count(syncable::AUTOFILL_PROFILE) != 0) { | 360 if (types.count(syncable::AUTOFILL_PROFILE) != 0) { |
| 357 ConfigureAutofillMigration(); | 361 ConfigureAutofillMigration(); |
| 358 } | 362 } |
| 359 | 363 |
| 360 bool deleted_type = false; | 364 scoped_ptr<PendingConfigureDataTypesState> state(new |
| 361 syncable::ModelTypeBitSet added_types; | 365 PendingConfigureDataTypesState()); |
| 362 | 366 |
| 363 { | 367 { |
| 364 base::AutoLock lock(registrar_lock_); | 368 base::AutoLock lock(registrar_lock_); |
| 365 for (DataTypeController::TypeMap::const_iterator it = | 369 for (DataTypeController::TypeMap::const_iterator it = |
| 366 data_type_controllers.begin(); | 370 data_type_controllers.begin(); |
| 367 it != data_type_controllers.end(); ++it) { | 371 it != data_type_controllers.end(); ++it) { |
| 368 syncable::ModelType type = (*it).first; | 372 syncable::ModelType type = (*it).first; |
| 369 | 373 |
| 370 // If a type is not specified, remove it from the routing_info. | 374 // If a type is not specified, remove it from the routing_info. |
| 371 if (types.count(type) == 0) { | 375 if (types.count(type) == 0) { |
| 372 registrar_.routing_info.erase(type); | 376 registrar_.routing_info.erase(type); |
| 373 deleted_type = true; | 377 state->deleted_type = true; |
| 374 } else { | 378 } else { |
| 375 // Add a newly specified data type as GROUP_PASSIVE into the | 379 // Add a newly specified data type as GROUP_PASSIVE into the |
| 376 // routing_info, if it does not already exist. | 380 // routing_info, if it does not already exist. |
| 377 if (registrar_.routing_info.count(type) == 0) { | 381 if (registrar_.routing_info.count(type) == 0) { |
| 378 registrar_.routing_info[type] = GROUP_PASSIVE; | 382 registrar_.routing_info[type] = GROUP_PASSIVE; |
| 379 added_types.set(type); | 383 state->added_types.set(type); |
| 380 } | 384 } |
| 381 } | 385 } |
| 382 } | 386 } |
| 383 } | 387 } |
| 384 | 388 |
| 385 // If no new data types were added to the passive group, no need to | 389 state->ready_task.reset(ready_task); |
| 386 // wait for the syncer. | 390 state->initial_types = types; |
| 387 if (core_->syncapi()->InitialSyncEndedForAllEnabledTypes()) { | 391 pending_config_mode_state_.reset(state.release()); |
| 388 ready_task->Run(); | 392 |
| 389 delete ready_task; | 393 // If we're doing the first configure (at startup) this is redundant as the |
| 394 // syncer thread always must start in config mode. |
| 395 if (using_new_syncer_thread_) { |
| 396 core_->syncapi()->StartConfigurationMode(NewCallback(core_.get(), |
| 397 &SyncBackendHost::Core::FinishConfigureDataTypes)); |
| 390 } else { | 398 } else { |
| 391 // Save the task here so we can run it when the syncer finishes | 399 FinishConfigureDataTypesOnFrontendLoop(); |
| 392 // initializing the new data types. It will be run only when the | |
| 393 // set of initially synced data types matches the types requested in | |
| 394 // this configure. | |
| 395 configure_ready_task_.reset(ready_task); | |
| 396 configure_initial_sync_types_ = types; | |
| 397 } | 400 } |
| 401 } |
| 398 | 402 |
| 403 void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop() { |
| 404 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
| 399 // Nudge the syncer. This is necessary for both datatype addition/deletion. | 405 // Nudge the syncer. This is necessary for both datatype addition/deletion. |
| 400 // | 406 // |
| 401 // Deletions need a nudge in order to ensure the deletion occurs in a timely | 407 // Deletions need a nudge in order to ensure the deletion occurs in a timely |
| 402 // manner (see issue 56416). | 408 // manner (see issue 56416). |
| 403 // | 409 // |
| 404 // In the case of additions, on the next sync cycle, the syncer should | 410 // In the case of additions, on the next sync cycle, the syncer should |
| 405 // notice that the routing info has changed and start the process of | 411 // notice that the routing info has changed and start the process of |
| 406 // downloading updates for newly added data types. Once this is | 412 // downloading updates for newly added data types. Once this is |
| 407 // complete, the configure_ready_task_ is run via an | 413 // complete, the configure_state_.ready_task_ is run via an |
| 408 // OnInitializationComplete notification. | 414 // OnInitializationComplete notification. |
| 409 ScheduleSyncEventForConfigChange(deleted_type, added_types); | 415 bool request_nudge = false; |
| 416 if (pending_config_mode_state_->deleted_type) { |
| 417 if (using_new_syncer_thread_) { |
| 418 core_thread_.message_loop()->PostTask(FROM_HERE, |
| 419 NewRunnableMethod(core_.get(), |
| 420 &SyncBackendHost::Core::DeferNudgeForCleanup)); |
| 421 } else { |
| 422 request_nudge = true; |
| 423 } |
| 424 } |
| 425 |
| 426 if (core_->syncapi()->InitialSyncEndedForAllEnabledTypes()) { |
| 427 pending_config_mode_state_->ready_task->Run(); |
| 428 } else { |
| 429 if (!pending_config_mode_state_->added_types.any()) { |
| 430 LOG(WARNING) << "No new types, but initial sync not finished." |
| 431 << "Possible sync db corruption / removal."; |
| 432 // TODO(tim): Log / UMA / count this somehow? |
| 433 // TODO(tim): If no added types, we could (should?) config only for |
| 434 // types that are needed... but this is a rare corruption edge case or |
| 435 // implies the user mucked around with their syncdb, so for now do all. |
| 436 pending_config_mode_state_->added_types = |
| 437 syncable::ModelTypeBitSetFromSet( |
| 438 pending_config_mode_state_->initial_types); |
| 439 } |
| 440 pending_download_state_.reset(pending_config_mode_state_.release()); |
| 441 if (using_new_syncer_thread_) { |
| 442 RequestConfig(pending_download_state_->added_types); |
| 443 } else { |
| 444 request_nudge = true; |
| 445 } |
| 446 } |
| 447 |
| 448 if (request_nudge) |
| 449 RequestNudge(); |
| 450 |
| 451 pending_config_mode_state_.reset(); |
| 410 | 452 |
| 411 // Notify the SyncManager about the new types. | 453 // Notify the SyncManager about the new types. |
| 412 core_thread_.message_loop()->PostTask(FROM_HERE, | 454 core_thread_.message_loop()->PostTask(FROM_HERE, |
| 413 NewRunnableMethod(core_.get(), | 455 NewRunnableMethod(core_.get(), |
| 414 &SyncBackendHost::Core::DoUpdateEnabledTypes)); | 456 &SyncBackendHost::Core::DoUpdateEnabledTypes)); |
| 415 } | 457 } |
| 416 | 458 |
| 417 void SyncBackendHost::ScheduleSyncEventForConfigChange(bool deleted_type, | |
| 418 const syncable::ModelTypeBitSet& added_types) { | |
| 419 // We can only nudge when we've either deleted a dataype or added one, else | |
| 420 // we can cause unnecessary syncs. Unit tests cover this. | |
| 421 if (using_new_syncer_thread_) { | |
| 422 if (added_types.size() > 0) | |
| 423 RequestConfig(added_types); | |
| 424 | |
| 425 // TODO(tim): Bug 76233. Fix this once only one impl exists. | |
| 426 if (deleted_type) { | |
| 427 core_thread_.message_loop()->PostTask(FROM_HERE, | |
| 428 NewRunnableMethod(core_.get(), | |
| 429 &SyncBackendHost::Core::DeferNudgeForCleanup)); | |
| 430 } | |
| 431 } else if (deleted_type || | |
| 432 !core_->syncapi()->InitialSyncEndedForAllEnabledTypes()) { | |
| 433 RequestNudge(); | |
| 434 } | |
| 435 } | |
| 436 | |
| 437 void SyncBackendHost::EncryptDataTypes( | 459 void SyncBackendHost::EncryptDataTypes( |
| 438 const syncable::ModelTypeSet& encrypted_types) { | 460 const syncable::ModelTypeSet& encrypted_types) { |
| 439 core_thread_.message_loop()->PostTask(FROM_HERE, | 461 core_thread_.message_loop()->PostTask(FROM_HERE, |
| 440 NewRunnableMethod(core_.get(), | 462 NewRunnableMethod(core_.get(), |
| 441 &SyncBackendHost::Core::DoEncryptDataTypes, | 463 &SyncBackendHost::Core::DoEncryptDataTypes, |
| 442 encrypted_types)); | 464 encrypted_types)); |
| 443 } | 465 } |
| 444 | 466 |
| 445 void SyncBackendHost::RequestNudge() { | 467 void SyncBackendHost::RequestNudge() { |
| 446 core_thread_.message_loop()->PostTask(FROM_HERE, | 468 core_thread_.message_loop()->PostTask(FROM_HERE, |
| 447 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoRequestNudge)); | 469 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoRequestNudge)); |
| 448 } | 470 } |
| 449 | 471 |
| 450 void SyncBackendHost::RequestConfig( | 472 void SyncBackendHost::RequestConfig( |
| 451 const syncable::ModelTypeBitSet& added_types) { | 473 const syncable::ModelTypeBitSet& added_types) { |
| 452 DCHECK(core_->syncapi()); | 474 DCHECK(core_->syncapi()); |
| 453 core_->syncapi()->RequestConfig(added_types); | 475 |
| 476 syncable::ModelTypeBitSet types_copy(added_types); |
| 477 if (IsNigoriEnabled()) |
| 478 types_copy.set(syncable::NIGORI); |
| 479 |
| 480 core_->syncapi()->RequestConfig(types_copy); |
| 454 } | 481 } |
| 455 | 482 |
| 456 void SyncBackendHost::ActivateDataType( | 483 void SyncBackendHost::ActivateDataType( |
| 457 DataTypeController* data_type_controller, | 484 DataTypeController* data_type_controller, |
| 458 ChangeProcessor* change_processor) { | 485 ChangeProcessor* change_processor) { |
| 459 base::AutoLock lock(registrar_lock_); | 486 base::AutoLock lock(registrar_lock_); |
| 460 | 487 |
| 461 // Ensure that the given data type is in the PASSIVE group. | 488 // Ensure that the given data type is in the PASSIVE group. |
| 462 browser_sync::ModelSafeRoutingInfo::iterator i = | 489 browser_sync::ModelSafeRoutingInfo::iterator i = |
| 463 registrar_.routing_info.find(data_type_controller->type()); | 490 registrar_.routing_info.find(data_type_controller->type()); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 } | 599 } |
| 573 | 600 |
| 574 void SyncBackendHost::Core::NotifyEncryptionComplete( | 601 void SyncBackendHost::Core::NotifyEncryptionComplete( |
| 575 const syncable::ModelTypeSet& encrypted_types) { | 602 const syncable::ModelTypeSet& encrypted_types) { |
| 576 if (!host_) | 603 if (!host_) |
| 577 return; | 604 return; |
| 578 DCHECK_EQ(MessageLoop::current(), host_->frontend_loop_); | 605 DCHECK_EQ(MessageLoop::current(), host_->frontend_loop_); |
| 579 host_->frontend_->OnEncryptionComplete(encrypted_types); | 606 host_->frontend_->OnEncryptionComplete(encrypted_types); |
| 580 } | 607 } |
| 581 | 608 |
| 609 void SyncBackendHost::Core::FinishConfigureDataTypes() { |
| 610 host_->frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, |
| 611 &SyncBackendHost::Core::FinishConfigureDataTypesOnFrontendLoop)); |
| 612 } |
| 613 |
| 614 void SyncBackendHost::Core::FinishConfigureDataTypesOnFrontendLoop() { |
| 615 host_->FinishConfigureDataTypesOnFrontendLoop(); |
| 616 } |
| 617 |
| 582 SyncBackendHost::Core::DoInitializeOptions::DoInitializeOptions( | 618 SyncBackendHost::Core::DoInitializeOptions::DoInitializeOptions( |
| 583 const GURL& service_url, | 619 const GURL& service_url, |
| 584 sync_api::HttpPostProviderFactory* http_bridge_factory, | 620 sync_api::HttpPostProviderFactory* http_bridge_factory, |
| 585 const sync_api::SyncCredentials& credentials, | 621 const sync_api::SyncCredentials& credentials, |
| 586 bool delete_sync_data_folder, | 622 bool delete_sync_data_folder, |
| 587 const std::string& restored_key_for_bootstrapping, | 623 const std::string& restored_key_for_bootstrapping, |
| 588 bool setup_for_test_mode) | 624 bool setup_for_test_mode) |
| 589 : service_url(service_url), | 625 : service_url(service_url), |
| 590 http_bridge_factory(http_bridge_factory), | 626 http_bridge_factory(http_bridge_factory), |
| 591 credentials(credentials), | 627 credentials(credentials), |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 SyncSessionSnapshot* snapshot) { | 894 SyncSessionSnapshot* snapshot) { |
| 859 if (!host_ || !host_->frontend_) | 895 if (!host_ || !host_->frontend_) |
| 860 return; | 896 return; |
| 861 DCHECK_EQ(MessageLoop::current(), host_->frontend_loop_); | 897 DCHECK_EQ(MessageLoop::current(), host_->frontend_loop_); |
| 862 | 898 |
| 863 host_->last_snapshot_.reset(snapshot); | 899 host_->last_snapshot_.reset(snapshot); |
| 864 | 900 |
| 865 // If we are waiting for a configuration change, check here to see | 901 // If we are waiting for a configuration change, check here to see |
| 866 // if this sync cycle has initialized all of the types we've been | 902 // if this sync cycle has initialized all of the types we've been |
| 867 // waiting for. | 903 // waiting for. |
| 868 if (host_->configure_ready_task_.get()) { | 904 if (host_->pending_download_state_.get()) { |
| 869 bool found_all = true; | 905 bool found_all_added = true; |
| 870 for (syncable::ModelTypeSet::const_iterator it = | 906 for (syncable::ModelTypeSet::const_iterator it = |
| 871 host_->configure_initial_sync_types_.begin(); | 907 host_->pending_download_state_->initial_types.begin(); |
| 872 it != host_->configure_initial_sync_types_.end(); ++it) { | 908 it != host_->pending_download_state_->initial_types.end(); |
| 873 found_all &= snapshot->initial_sync_ended.test(*it); | 909 ++it) { |
| 910 if (host_->pending_download_state_->added_types.test(*it)) |
| 911 found_all_added &= snapshot->initial_sync_ended.test(*it); |
| 874 } | 912 } |
| 875 | 913 if (!found_all_added) { |
| 876 if (found_all) { | 914 CHECK(false); |
| 877 host_->configure_ready_task_->Run(); | 915 DCHECK(!host_->using_new_syncer_thread_); |
| 878 host_->configure_ready_task_.reset(); | 916 } else { |
| 879 host_->configure_initial_sync_types_.clear(); | 917 host_->pending_download_state_->ready_task->Run(); |
| 918 host_->pending_download_state_.reset(); |
| 880 } | 919 } |
| 881 } | 920 } |
| 882 host_->frontend_->OnSyncCycleCompleted(); | 921 host_->frontend_->OnSyncCycleCompleted(); |
| 883 } | 922 } |
| 884 | 923 |
| 885 void SyncBackendHost::Core::OnInitializationComplete() { | 924 void SyncBackendHost::Core::OnInitializationComplete() { |
| 886 if (!host_ || !host_->frontend_) | 925 if (!host_ || !host_->frontend_) |
| 887 return; // We may have been told to Shutdown before initialization | 926 return; // We may have been told to Shutdown before initialization |
| 888 // completed. | 927 // completed. |
| 889 | 928 |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 DCHECK_EQ(MessageLoop::current(), host_->core_thread_.message_loop()); | 1174 DCHECK_EQ(MessageLoop::current(), host_->core_thread_.message_loop()); |
| 1136 syncapi_->GetJsBackend()->ProcessMessage(name, args, sender); | 1175 syncapi_->GetJsBackend()->ProcessMessage(name, args, sender); |
| 1137 } | 1176 } |
| 1138 | 1177 |
| 1139 void SyncBackendHost::Core::DeferNudgeForCleanup() { | 1178 void SyncBackendHost::Core::DeferNudgeForCleanup() { |
| 1140 DCHECK_EQ(MessageLoop::current(), host_->core_thread_.message_loop()); | 1179 DCHECK_EQ(MessageLoop::current(), host_->core_thread_.message_loop()); |
| 1141 deferred_nudge_for_cleanup_requested_ = true; | 1180 deferred_nudge_for_cleanup_requested_ = true; |
| 1142 } | 1181 } |
| 1143 | 1182 |
| 1144 } // namespace browser_sync | 1183 } // namespace browser_sync |
| OLD | NEW |