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

Unified Diff: chrome/browser/sync/profile_sync_service.cc

Issue 12288010: sync: preliminary support for deferred SyncBackendHost initialization (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: dchecks Created 7 years, 9 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 | « chrome/browser/sync/profile_sync_service.h ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/profile_sync_service.cc
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc
index 5c17fb0f3e3c01b4bd833b558a4d80e13bc5a721..9320344b562e93207b9fac7e493742edce44e409 100644
--- a/chrome/browser/sync/profile_sync_service.cc
+++ b/chrome/browser/sync/profile_sync_service.cc
@@ -292,11 +292,21 @@ void ProfileSyncService::TryStart() {
// but we haven't completed sync setup, we try to start sync anyway, since
// it's possible we crashed/shutdown after logging in but before the backend
// finished initializing the last time.
- if (!HasSyncSetupCompleted() && !setup_in_progress_ && !auto_start_enabled_)
- return;
-
- // All systems Go for launch.
- StartUp();
+ //
+ // However, the only time we actually need to start sync _immediately_ is if
+ // we haven't completed sync setup and the user is in the process of setting
+ // up - either they just signed in (for the first time) on an auto-start
+ // platform or they explicitly kicked off sync setup, and e.g we need to
+ // fetch account details like encryption state to populate UI. Otherwise,
+ // for performance reasons and maximizing parallelism at chrome startup, we
+ // defer the heavy lifting for sync init until things have calmed down.
+ if (HasSyncSetupCompleted()) {
+ StartUp(STARTUP_BACKEND_DEFERRED);
+ } else if (setup_in_progress_ || auto_start_enabled_) {
+ // We haven't completed sync setup. Start immediately if the user explicitly
+ // kicked this off or we're supposed to automatically start syncing.
+ StartUp(STARTUP_IMMEDIATE);
+ }
}
void ProfileSyncService::StartSyncingWithServer() {
@@ -462,8 +472,7 @@ void ProfileSyncService::OnSyncConfigureRetry() {
NotifyObservers();
}
-
-void ProfileSyncService::StartUp() {
+void ProfileSyncService::StartUp(StartUpDeferredOption deferred_option) {
// Don't start up multiple times.
if (backend_.get()) {
DVLOG(1) << "Skipping bringing up backend host.";
@@ -473,6 +482,8 @@ void ProfileSyncService::StartUp() {
DCHECK(IsSyncEnabledAndLoggedIn());
last_synced_time_ = sync_prefs_.GetLastSyncedTime();
+
+ DCHECK(start_up_time_.is_null());
start_up_time_ = base::Time::Now();
#if defined(OS_CHROMEOS)
@@ -482,6 +493,40 @@ void ProfileSyncService::StartUp() {
sync_prefs_.GetSpareBootstrapToken());
}
#endif
+
+ if (!sync_global_error_.get()) {
+#if !defined(OS_ANDROID)
+ sync_global_error_.reset(new SyncGlobalError(this, signin()));
+#endif
+ GlobalErrorServiceFactory::GetForProfile(profile_)->AddGlobalError(
+ sync_global_error_.get());
+ AddObserver(sync_global_error_.get());
+ }
+
+ if (deferred_option == STARTUP_BACKEND_DEFERRED &&
+ CommandLine::ForCurrentProcess()->
+ HasSwitch(switches::kSyncEnableDeferredStartup)) {
+ return;
+ }
+
+ StartUpSlowBackendComponents(STARTUP_IMMEDIATE);
+}
+
+void ProfileSyncService::StartUpSlowBackendComponents(
+ StartUpDeferredOption deferred_option) {
+ // Don't start up multiple times.
+ if (backend_.get()) {
+ DVLOG(1) << "Skipping bringing up backend host.";
+ return;
+ }
+
+ DCHECK(!start_up_time_.is_null());
+ if (deferred_option == STARTUP_BACKEND_DEFERRED) {
+ base::TimeDelta time_deferred = base::Time::Now() - start_up_time_;
+ UMA_HISTOGRAM_TIMES("Sync.Startup.TimeDeferred", time_deferred);
+ }
+
+ DCHECK(IsSyncEnabledAndLoggedIn());
CreateBackend();
// Initialize the backend. Every time we start up a new SyncBackendHost,
@@ -498,15 +543,6 @@ void ProfileSyncService::StartUp() {
backend_->UpdateRegisteredInvalidationIds(
invalidator_registrar_->GetAllRegisteredIds());
}
-
- if (!sync_global_error_.get()) {
-#if !defined(OS_ANDROID)
- sync_global_error_.reset(new SyncGlobalError(this, signin()));
-#endif
- GlobalErrorServiceFactory::GetForProfile(profile_)->AddGlobalError(
- sync_global_error_.get());
- AddObserver(sync_global_error_.get());
- }
}
void ProfileSyncService::RegisterInvalidationHandler(
@@ -764,16 +800,15 @@ void ProfileSyncService::OnBackendInitialized(
UMA_HISTOGRAM_BOOLEAN("Sync.BackendInitializeRestoreSuccess", success);
}
- if (!start_up_time_.is_null()) {
- base::Time on_backend_initialized_time = base::Time::Now();
- base::TimeDelta delta = on_backend_initialized_time - start_up_time_;
- if (is_first_time_sync_configure_) {
- UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeFirstTime", delta);
- } else {
- UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeRestoreTime", delta);
- }
- start_up_time_ = base::Time();
+ DCHECK(!start_up_time_.is_null());
+ base::Time on_backend_initialized_time = base::Time::Now();
+ base::TimeDelta delta = on_backend_initialized_time - start_up_time_;
+ if (is_first_time_sync_configure_) {
+ UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeFirstTime", delta);
+ } else {
+ UMA_HISTOGRAM_LONG_TIMES("Sync.BackendInitializeRestoreTime", delta);
}
+ start_up_time_ = base::Time();
if (!success) {
// Something went unexpectedly wrong. Play it safe: stop syncing at once
@@ -1238,6 +1273,15 @@ std::string ProfileSyncService::QuerySyncStatusSummary() {
}
}
+std::string ProfileSyncService::GetBackendInitializationStateString() const {
+ if (sync_initialized())
+ return "Done";
+ else if (!start_up_time_.is_null())
+ return "Deferred";
+ else
+ return "Not started";
+}
+
bool ProfileSyncService::QueryDetailedSyncStatus(
SyncBackendHost::Status* result) {
if (backend_.get() && backend_initialized_) {
« no previous file with comments | « chrome/browser/sync/profile_sync_service.h ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698