Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(692)

Unified Diff: sync/internal_api/sync_manager_impl.cc

Issue 10804039: Make SyncBackendRegistrar aware of loaded data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sync/internal_api/sync_manager_impl.h ('k') | sync/internal_api/syncapi_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 98ba4a3f178cc836a834075be75a45e77b7ff1d2..24d614e84438ea13711c6717fcd5d47b92ee3d09 100644
--- a/sync/internal_api/sync_manager_impl.cc
+++ b/sync/internal_api/sync_manager_impl.cc
@@ -293,13 +293,11 @@ void SyncManagerImpl::ThrowUnrecoverableError() {
}
ModelTypeSet SyncManagerImpl::InitialSyncEndedTypes() {
- DCHECK(initialized_);
return directory()->initial_sync_ended_types();
}
ModelTypeSet SyncManagerImpl::GetTypesWithEmptyProgressMarkerToken(
ModelTypeSet types) {
- DCHECK(initialized_);
ModelTypeSet result;
for (ModelTypeSet::Iterator i = types.First(); i.Good(); i.Inc()) {
sync_pb::DataTypeProgressMarker marker;
@@ -365,7 +363,6 @@ bool SyncManagerImpl::Init(
bool use_ssl,
const scoped_refptr<base::TaskRunner>& blocking_task_runner,
scoped_ptr<HttpPostProviderFactory> post_factory,
- const ModelSafeRoutingInfo& model_safe_routing_info,
const std::vector<ModelSafeWorker*>& workers,
ExtensionsActivityMonitor* extensions_activity_monitor,
SyncManager::ChangeDelegate* change_delegate,
@@ -379,6 +376,8 @@ bool SyncManagerImpl::Init(
CHECK(!initialized_);
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(post_factory.get());
+ DCHECK(!credentials.email.empty());
+ DCHECK(!credentials.sync_token.empty());
DVLOG(1) << "SyncManager starting Init...";
weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr());
@@ -407,6 +406,7 @@ bool SyncManagerImpl::Init(
credentials.email, absolute_db_path).Pass();
DCHECK(backing_store.get());
+ share_.name = credentials.email;
share_.directory.reset(
new syncable::Directory(encryptor_,
unrecoverable_error_handler_,
@@ -415,11 +415,33 @@ bool SyncManagerImpl::Init(
connection_manager_.reset(new SyncAPIServerConnectionManager(
sync_server_and_path, port, use_ssl, post_factory.release()));
+ connection_manager_->AddListener(this);
- net::NetworkChangeNotifier::AddIPAddressObserver(this);
- observing_ip_address_changes_ = true;
+ DVLOG(1) << "Username: " << username_for_share();
+ if (!OpenDirectory()) {
+ FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
+ OnInitializationComplete(
+ MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()),
+ false, syncer::ModelTypeSet()));
+ return false;
+ }
- connection_manager_->AddListener(this);
+ // Retrieve and set the sync notifier state.
+ std::string unique_id = directory()->cache_guid();
+ DVLOG(1) << "Read notification unique ID: " << unique_id;
+ allstatus_.SetUniqueId(unique_id);
+ sync_notifier_->SetUniqueId(unique_id);
+
+ std::string state = directory()->GetNotificationState();
+ if (VLOG_IS_ON(1)) {
+ std::string encoded_state;
+ base::Base64Encode(state, &encoded_state);
+ DVLOG(1) << "Read notification state: " << encoded_state;
+ }
+
+ // TODO(tim): Remove once invalidation state has been migrated to new
+ // InvalidationStateTracker store. Bug 124140.
+ sync_notifier_->SetStateDeprecated(state);
// Build a SyncSessionContext and store the worker in it.
DVLOG(1) << "Sync is bringing up SyncSessionContext.";
@@ -429,7 +451,6 @@ bool SyncManagerImpl::Init(
session_context_ = internal_components_factory->BuildContext(
connection_manager_.get(),
directory(),
- model_safe_routing_info,
workers,
extensions_activity_monitor,
&throttled_data_type_tracker_,
@@ -440,49 +461,28 @@ bool SyncManagerImpl::Init(
scheduler_ = internal_components_factory->BuildScheduler(
name_, session_context_.get()).Pass();
- bool success = SignIn(credentials);
-
- if (success) {
- scheduler_->Start(SyncScheduler::CONFIGURATION_MODE);
-
- initialized_ = true;
-
- // Unapplied datatypes (those that do not have initial sync ended set) get
- // re-downloaded during any configuration. But, it's possible for a datatype
- // to have a progress marker but not have initial sync ended yet, making
- // it a candidate for migration. This is a problem, as the DataTypeManager
- // does not support a migration while it's already in the middle of a
- // configuration. As a result, any partially synced datatype can stall the
- // DTM, waiting for the configuration to complete, which it never will due
- // to the migration error. In addition, a partially synced nigori will
- // 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())
- success = false;
+ scheduler_->Start(SyncScheduler::CONFIGURATION_MODE);
- // Cryptographer should only be accessed while holding a
- // transaction. Grabbing the user share for the transaction
- // checks the initialization state, so this must come after
- // |initialized_| is set to true.
- ReadTransaction trans(FROM_HERE, GetUserShare());
- trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping);
- trans.GetCryptographer()->AddObserver(this);
- }
+ initialized_ = true;
+
+ net::NetworkChangeNotifier::AddIPAddressObserver(this);
+ observing_ip_address_changes_ = true;
+
+ UpdateCredentials(credentials);
+
+ // Cryptographer should only be accessed while holding a
+ // transaction. Grabbing the user share for the transaction
+ // checks the initialization state, so this must come after
+ // |initialized_| is set to true.
+ ReadTransaction trans(FROM_HERE, GetUserShare());
+ trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping);
+ trans.GetCryptographer()->AddObserver(this);
- // Notify that initialization is complete. Note: This should be the last to
- // execute if |signed_in| is false. Reason being in that case we would
- // post a task to shutdown sync. But if this function posts any other tasks
- // on the UI thread and if shutdown wins then that tasks would execute on
- // a freed pointer. This is because UI thread is not shut down.
FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
OnInitializationComplete(
MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()),
- success));
- if (!success)
- return false;
-
- return success;
+ true, InitialSyncEndedTypes()));
+ return true;
}
void SyncManagerImpl::RefreshNigori(const std::string& chrome_version,
@@ -658,36 +658,21 @@ bool SyncManagerImpl::OpenDirectory() {
return false;
}
- connection_manager_->set_client_id(directory()->cache_guid());
- return true;
-}
-
-bool SyncManagerImpl::SignIn(const SyncCredentials& credentials) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(share_.name.empty());
- share_.name = credentials.email;
-
- DVLOG(1) << "Signing in user: " << username_for_share();
- if (!OpenDirectory())
+ // Unapplied datatypes (those that do not have initial sync ended set) get
+ // re-downloaded during any configuration. But, it's possible for a datatype
+ // to have a progress marker but not have initial sync ended yet, making
+ // it a candidate for migration. This is a problem, as the DataTypeManager
+ // does not support a migration while it's already in the middle of a
+ // configuration. As a result, any partially synced datatype can stall the
+ // DTM, waiting for the configuration to complete, which it never will due
+ // to the migration error. In addition, a partially synced nigori will
+ // 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())
return false;
- // Retrieve and set the sync notifier state. This should be done
- // only after OpenDirectory is called.
- std::string unique_id = directory()->cache_guid();
- std::string state = directory()->GetNotificationState();
- DVLOG(1) << "Read notification unique ID: " << unique_id;
- if (VLOG_IS_ON(1)) {
- std::string encoded_state;
- base::Base64Encode(state, &encoded_state);
- DVLOG(1) << "Read notification state: " << encoded_state;
- }
- allstatus_.SetUniqueId(unique_id);
- sync_notifier_->SetUniqueId(unique_id);
- // TODO(tim): Remove once invalidation state has been migrated to new
- // InvalidationStateTracker store. Bug 124140.
- sync_notifier_->SetStateDeprecated(state);
-
- UpdateCredentials(credentials);
+ connection_manager_->set_client_id(directory()->cache_guid());
return true;
}
@@ -707,18 +692,17 @@ bool SyncManagerImpl::PurgePartiallySyncedTypes() {
void SyncManagerImpl::UpdateCredentials(
const SyncCredentials& credentials) {
DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(initialized_);
DCHECK_EQ(credentials.email, share_.name);
DCHECK(!credentials.email.empty());
DCHECK(!credentials.sync_token.empty());
observing_ip_address_changes_ = true;
- if (connection_manager_->set_auth_token(credentials.sync_token)) {
- sync_notifier_->UpdateCredentials(
- credentials.email, credentials.sync_token);
- if (initialized_) {
- scheduler_->OnCredentialsUpdated();
- }
- }
+ if (!connection_manager_->set_auth_token(credentials.sync_token))
+ return; // Auth token is known to be invalid, so exit early.
+
+ sync_notifier_->UpdateCredentials(credentials.email, credentials.sync_token);
+ scheduler_->OnCredentialsUpdated();
}
void SyncManagerImpl::UpdateEnabledTypes(
« no previous file with comments | « sync/internal_api/sync_manager_impl.h ('k') | sync/internal_api/syncapi_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698