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

Side by Side 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: review Created 7 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/sync/profile_sync_service.h ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/sync/profile_sync_service.h" 5 #include "chrome/browser/sync/profile_sync_service.h"
6 6
7 #include <cstddef> 7 #include <cstddef>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 !(!auto_start_enabled_ && token_service->TokensLoadedFromDB())) { 290 !(!auto_start_enabled_ && token_service->TokensLoadedFromDB())) {
291 return; 291 return;
292 } 292 }
293 293
294 // If sync setup has completed we always start the backend. If the user is in 294 // If sync setup has completed we always start the backend. If the user is in
295 // the process of setting up now, we should start the backend to download 295 // the process of setting up now, we should start the backend to download
296 // account control state / encryption information). If autostart is enabled, 296 // account control state / encryption information). If autostart is enabled,
297 // but we haven't completed sync setup, we try to start sync anyway, since 297 // but we haven't completed sync setup, we try to start sync anyway, since
298 // it's possible we crashed/shutdown after logging in but before the backend 298 // it's possible we crashed/shutdown after logging in but before the backend
299 // finished initializing the last time. 299 // finished initializing the last time.
300 if (!HasSyncSetupCompleted() && !setup_in_progress_ && !auto_start_enabled_) 300 //
301 return; 301 // However, the only time we actually need to start sync _immediately_ is if
302 302 // we haven't completed sync setup and the user is in the process of setting
303 // All systems Go for launch. 303 // up - either they just signed in (for the first time) on an auto-start
304 StartUp(); 304 // platform or they explicitly kicked off sync setup, and e.g we need to
305 // fetch account details like encryption state to populate UI. Otherwise,
306 // for performance reasons and maximizing parallelism at chrome startup, we
307 // defer the heavy lifting for sync init until things have calmed down.
308 if (HasSyncSetupCompleted()) {
309 StartUp(STARTUP_BACKEND_DEFERRED);
310 } else if (setup_in_progress_ || auto_start_enabled_) {
311 // We haven't completed sync setup. Start immediately if the user explicitly
312 // kicked this off or we're supposed to automatically start syncing.
313 StartUp(STARTUP_IMMEDIATE);
314 }
305 } 315 }
306 316
307 void ProfileSyncService::StartSyncingWithServer() { 317 void ProfileSyncService::StartSyncingWithServer() {
308 if (backend_.get()) 318 if (backend_.get())
309 backend_->StartSyncingWithServer(); 319 backend_->StartSyncingWithServer();
310 } 320 }
311 321
312 void ProfileSyncService::RegisterAuthNotifications() { 322 void ProfileSyncService::RegisterAuthNotifications() {
313 TokenService* token_service = TokenServiceFactory::GetForProfile(profile_); 323 TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
314 registrar_.Add(this, 324 registrar_.Add(this,
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 470
461 void ProfileSyncService::OnSyncConfigureRetry() { 471 void ProfileSyncService::OnSyncConfigureRetry() {
462 // Note: in order to handle auth failures that arise before the backend is 472 // Note: in order to handle auth failures that arise before the backend is
463 // initialized (e.g. from invalidation notifier, or downloading new control 473 // initialized (e.g. from invalidation notifier, or downloading new control
464 // types), we have to gracefully handle configuration retries at all times. 474 // types), we have to gracefully handle configuration retries at all times.
465 // At this point an auth error badge should be shown, which once resolved 475 // At this point an auth error badge should be shown, which once resolved
466 // will trigger a new sync cycle. 476 // will trigger a new sync cycle.
467 NotifyObservers(); 477 NotifyObservers();
468 } 478 }
469 479
470 480 void ProfileSyncService::StartUp(StartUpDeferredOption deferred_option) {
471 void ProfileSyncService::StartUp() {
472 // Don't start up multiple times. 481 // Don't start up multiple times.
473 if (backend_.get()) { 482 if (backend_.get()) {
474 DVLOG(1) << "Skipping bringing up backend host."; 483 DVLOG(1) << "Skipping bringing up backend host.";
475 return; 484 return;
476 } 485 }
477 486
478 DCHECK(IsSyncEnabledAndLoggedIn()); 487 DCHECK(IsSyncEnabledAndLoggedIn());
479 488
480 last_synced_time_ = sync_prefs_.GetLastSyncedTime(); 489 last_synced_time_ = sync_prefs_.GetLastSyncedTime();
481 start_up_time_ = base::Time::Now(); 490 start_up_time_ = base::Time::Now();
Nicolas Zea 2013/02/25 21:12:04 I'm a bit concerned about the possibility of TrySt
482 491
483 #if defined(OS_CHROMEOS) 492 #if defined(OS_CHROMEOS)
484 std::string bootstrap_token = sync_prefs_.GetEncryptionBootstrapToken(); 493 std::string bootstrap_token = sync_prefs_.GetEncryptionBootstrapToken();
485 if (bootstrap_token.empty()) { 494 if (bootstrap_token.empty()) {
486 sync_prefs_.SetEncryptionBootstrapToken( 495 sync_prefs_.SetEncryptionBootstrapToken(
487 sync_prefs_.GetSpareBootstrapToken()); 496 sync_prefs_.GetSpareBootstrapToken());
488 } 497 }
489 #endif 498 #endif
499
500 if (!sync_global_error_.get()) {
501 #if !defined(OS_ANDROID)
502 sync_global_error_.reset(new SyncGlobalError(this, signin()));
503 #endif
504 GlobalErrorServiceFactory::GetForProfile(profile_)->AddGlobalError(
505 sync_global_error_.get());
506 AddObserver(sync_global_error_.get());
507 }
508
509 if (deferred_option == STARTUP_BACKEND_DEFERRED &&
510 CommandLine::ForCurrentProcess()->
511 HasSwitch(switches::kSyncEnableDeferredStartup)) {
512 return;
513 }
514 DCHECK_EQ(STARTUP_IMMEDIATE, deferred_option);
515 StartUpSlowBackendComponents(STARTUP_IMMEDIATE);
516 }
517
518 void ProfileSyncService::StartUpSlowBackendComponents(
519 StartUpDeferredOption deferred_option) {
520 // Don't start up multiple times.
521 if (backend_.get()) {
522 DVLOG(1) << "Skipping bringing up backend host.";
523 return;
524 }
525
526 DCHECK(!start_up_time_.is_null());
527 if (deferred_option == STARTUP_BACKEND_DEFERRED) {
528 base::TimeDelta time_deferred = base::Time::Now() - start_up_time_;
529 UMA_HISTOGRAM_TIMES("Sync.Startup.TimeDeferred", time_deferred);
530 }
531
532 DCHECK(IsSyncEnabledAndLoggedIn());
490 CreateBackend(); 533 CreateBackend();
491 534
492 // Initialize the backend. Every time we start up a new SyncBackendHost, 535 // Initialize the backend. Every time we start up a new SyncBackendHost,
493 // we'll want to start from a fresh SyncDB, so delete any old one that might 536 // we'll want to start from a fresh SyncDB, so delete any old one that might
494 // be there. 537 // be there.
495 InitializeBackend(!HasSyncSetupCompleted()); 538 InitializeBackend(!HasSyncSetupCompleted());
496 539
497 // |backend_| may end up being NULL here in tests (in synchronous 540 // |backend_| may end up being NULL here in tests (in synchronous
498 // initialization mode). 541 // initialization mode).
499 // 542 //
500 // TODO(akalin): Fix this horribly non-intuitive behavior (see 543 // TODO(akalin): Fix this horribly non-intuitive behavior (see
501 // http://crbug.com/140354). 544 // http://crbug.com/140354).
502 if (backend_.get()) { 545 if (backend_.get()) {
503 backend_->UpdateRegisteredInvalidationIds( 546 backend_->UpdateRegisteredInvalidationIds(
504 invalidator_registrar_->GetAllRegisteredIds()); 547 invalidator_registrar_->GetAllRegisteredIds());
505 } 548 }
506
507 if (!sync_global_error_.get()) {
508 #if !defined(OS_ANDROID)
509 sync_global_error_.reset(new SyncGlobalError(this, signin()));
510 #endif
511 GlobalErrorServiceFactory::GetForProfile(profile_)->AddGlobalError(
512 sync_global_error_.get());
513 AddObserver(sync_global_error_.get());
514 }
515 } 549 }
516 550
517 void ProfileSyncService::RegisterInvalidationHandler( 551 void ProfileSyncService::RegisterInvalidationHandler(
518 syncer::InvalidationHandler* handler) { 552 syncer::InvalidationHandler* handler) {
519 invalidator_registrar_->RegisterHandler(handler); 553 invalidator_registrar_->RegisterHandler(handler);
520 } 554 }
521 555
522 void ProfileSyncService::UpdateRegisteredInvalidationIds( 556 void ProfileSyncService::UpdateRegisteredInvalidationIds(
523 syncer::InvalidationHandler* handler, 557 syncer::InvalidationHandler* handler,
524 const syncer::ObjectIdSet& ids) { 558 const syncer::ObjectIdSet& ids) {
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after
1233 data_type_manager_.get() && 1267 data_type_manager_.get() &&
1234 data_type_manager_->state() != DataTypeManager::CONFIGURED) { 1268 data_type_manager_->state() != DataTypeManager::CONFIGURED) {
1235 return "Datatypes not fully initialized"; 1269 return "Datatypes not fully initialized";
1236 } else if (ShouldPushChanges()) { 1270 } else if (ShouldPushChanges()) {
1237 return "Sync service initialized"; 1271 return "Sync service initialized";
1238 } else { 1272 } else {
1239 return "Status unknown: Internal error?"; 1273 return "Status unknown: Internal error?";
1240 } 1274 }
1241 } 1275 }
1242 1276
1277 std::string ProfileSyncService::GetBackendInitializationStateString() const {
1278 if (sync_initialized())
1279 return "Done";
1280 else if (!start_up_time_.is_null())
1281 return "Deferred";
1282 else
1283 return "Not started";
1284 }
1285
1243 bool ProfileSyncService::QueryDetailedSyncStatus( 1286 bool ProfileSyncService::QueryDetailedSyncStatus(
1244 SyncBackendHost::Status* result) { 1287 SyncBackendHost::Status* result) {
1245 if (backend_.get() && backend_initialized_) { 1288 if (backend_.get() && backend_initialized_) {
1246 *result = backend_->GetDetailedStatus(); 1289 *result = backend_->GetDetailedStatus();
1247 return true; 1290 return true;
1248 } else { 1291 } else {
1249 SyncBackendHost::Status status; 1292 SyncBackendHost::Status status;
1250 status.sync_protocol_error = last_actionable_error_; 1293 status.sync_protocol_error = last_actionable_error_;
1251 *result = status; 1294 *result = status;
1252 return false; 1295 return false;
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after
1974 // See http://stackoverflow.com/questions/6224121/is-new-this-myclass-undefine d-behaviour-after-directly-calling-the-destru. 2017 // See http://stackoverflow.com/questions/6224121/is-new-this-myclass-undefine d-behaviour-after-directly-calling-the-destru.
1975 ProfileSyncService* old_this = this; 2018 ProfileSyncService* old_this = this;
1976 this->~ProfileSyncService(); 2019 this->~ProfileSyncService();
1977 new(old_this) ProfileSyncService( 2020 new(old_this) ProfileSyncService(
1978 new ProfileSyncComponentsFactoryImpl(profile, 2021 new ProfileSyncComponentsFactoryImpl(profile,
1979 CommandLine::ForCurrentProcess()), 2022 CommandLine::ForCurrentProcess()),
1980 profile, 2023 profile,
1981 signin, 2024 signin,
1982 behavior); 2025 behavior);
1983 } 2026 }
OLDNEW
« 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