| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/startup_controller.h" | 5 #include "components/sync_driver/startup_controller.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 // No data type requested sync to start and our fallback timer expired. | 32 // No data type requested sync to start and our fallback timer expired. |
| 33 TRIGGER_FALLBACK_TIMER, | 33 TRIGGER_FALLBACK_TIMER, |
| 34 MAX_TRIGGER_VALUE | 34 MAX_TRIGGER_VALUE |
| 35 }; | 35 }; |
| 36 | 36 |
| 37 } // namespace | 37 } // namespace |
| 38 | 38 |
| 39 StartupController::StartupController(const sync_driver::SyncPrefs* sync_prefs, | 39 StartupController::StartupController(const sync_driver::SyncPrefs* sync_prefs, |
| 40 base::Callback<bool()> can_start, | 40 base::Callback<bool()> can_start, |
| 41 base::Closure start_backend) | 41 base::Closure start_backend) |
| 42 : received_start_request_(false), | 42 : bypass_setup_complete_(false), |
| 43 received_start_request_(false), |
| 43 setup_in_progress_(false), | 44 setup_in_progress_(false), |
| 44 sync_prefs_(sync_prefs), | 45 sync_prefs_(sync_prefs), |
| 45 can_start_(can_start), | 46 can_start_(can_start), |
| 46 start_backend_(start_backend), | 47 start_backend_(start_backend), |
| 47 fallback_timeout_( | 48 fallback_timeout_( |
| 48 base::TimeDelta::FromSeconds(kDeferredInitFallbackSeconds)), | 49 base::TimeDelta::FromSeconds(kDeferredInitFallbackSeconds)), |
| 49 weak_factory_(this) { | 50 weak_factory_(this) { |
| 50 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 51 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 51 switches::kSyncDeferredStartupTimeoutSeconds)) { | 52 switches::kSyncDeferredStartupTimeoutSeconds)) { |
| 52 int timeout = kDeferredInitFallbackSeconds; | 53 int timeout = kDeferredInitFallbackSeconds; |
| 53 if (base::StringToInt( | 54 if (base::StringToInt( |
| 54 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 55 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 55 switches::kSyncDeferredStartupTimeoutSeconds), | 56 switches::kSyncDeferredStartupTimeoutSeconds), |
| 56 &timeout)) { | 57 &timeout)) { |
| 57 DCHECK_GE(timeout, 0); | 58 DCHECK_GE(timeout, 0); |
| 58 DVLOG(2) << "Sync StartupController overriding startup timeout to " | 59 DVLOG(2) << "Sync StartupController overriding startup timeout to " |
| 59 << timeout << " seconds."; | 60 << timeout << " seconds."; |
| 60 fallback_timeout_ = base::TimeDelta::FromSeconds(timeout); | 61 fallback_timeout_ = base::TimeDelta::FromSeconds(timeout); |
| 61 } | 62 } |
| 62 } | 63 } |
| 63 } | 64 } |
| 64 | 65 |
| 65 StartupController::~StartupController() {} | 66 StartupController::~StartupController() {} |
| 66 | 67 |
| 67 void StartupController::Reset(const syncer::ModelTypeSet registered_types) { | 68 void StartupController::Reset(const syncer::ModelTypeSet registered_types) { |
| 68 received_start_request_ = false; | 69 received_start_request_ = false; |
| 70 bypass_setup_complete_ = false; |
| 69 start_up_time_ = base::Time(); | 71 start_up_time_ = base::Time(); |
| 70 start_backend_time_ = base::Time(); | 72 start_backend_time_ = base::Time(); |
| 71 // Don't let previous timers affect us post-reset. | 73 // Don't let previous timers affect us post-reset. |
| 72 weak_factory_.InvalidateWeakPtrs(); | 74 weak_factory_.InvalidateWeakPtrs(); |
| 73 registered_types_ = registered_types; | 75 registered_types_ = registered_types; |
| 74 } | 76 } |
| 75 | 77 |
| 76 void StartupController::SetSetupInProgress(bool setup_in_progress) { | 78 void StartupController::SetSetupInProgress(bool setup_in_progress) { |
| 77 setup_in_progress_ = setup_in_progress; | 79 setup_in_progress_ = setup_in_progress; |
| 78 if (setup_in_progress_) { | 80 if (setup_in_progress_) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 } | 116 } |
| 115 | 117 |
| 116 bool StartupController::TryStart() { | 118 bool StartupController::TryStart() { |
| 117 if (!can_start_.Run()) | 119 if (!can_start_.Run()) |
| 118 return false; | 120 return false; |
| 119 | 121 |
| 120 // For performance reasons, defer the heavy lifting for sync init unless: | 122 // For performance reasons, defer the heavy lifting for sync init unless: |
| 121 // | 123 // |
| 122 // - a datatype has requested an immediate start of sync, or | 124 // - a datatype has requested an immediate start of sync, or |
| 123 // - sync needs to start up the backend immediately to provide control state | 125 // - sync needs to start up the backend immediately to provide control state |
| 124 // and encryption information to the UI, or | 126 // and encryption information to the UI. |
| 125 // - this is the first time sync is ever starting up. | 127 // Do not start up the sync backend if setup has not completed and isn't |
| 126 if (received_start_request_ || setup_in_progress_ || | 128 // in progress, unless told to otherwise. |
| 127 !sync_prefs_->IsFirstSetupComplete()) { | 129 if (setup_in_progress_) { |
| 128 return StartUp(STARTUP_IMMEDIATE); | 130 return StartUp(STARTUP_IMMEDIATE); |
| 131 } else if (sync_prefs_->IsFirstSetupComplete() || bypass_setup_complete_) { |
| 132 return StartUp(received_start_request_ ? STARTUP_IMMEDIATE |
| 133 : STARTUP_BACKEND_DEFERRED); |
| 129 } else { | 134 } else { |
| 130 return StartUp(STARTUP_BACKEND_DEFERRED); | 135 return false; |
| 131 } | 136 } |
| 132 } | 137 } |
| 133 | 138 |
| 139 bool StartupController::TryStartImmediately() { |
| 140 received_start_request_ = true; |
| 141 bypass_setup_complete_ = true; |
| 142 return TryStart(); |
| 143 } |
| 144 |
| 134 void StartupController::RecordTimeDeferred() { | 145 void StartupController::RecordTimeDeferred() { |
| 135 DCHECK(!start_up_time_.is_null()); | 146 DCHECK(!start_up_time_.is_null()); |
| 136 base::TimeDelta time_deferred = base::Time::Now() - start_up_time_; | 147 base::TimeDelta time_deferred = base::Time::Now() - start_up_time_; |
| 137 UMA_HISTOGRAM_CUSTOM_TIMES("Sync.Startup.TimeDeferred2", | 148 UMA_HISTOGRAM_CUSTOM_TIMES("Sync.Startup.TimeDeferred2", |
| 138 time_deferred, | 149 time_deferred, |
| 139 base::TimeDelta::FromSeconds(0), | 150 base::TimeDelta::FromSeconds(0), |
| 140 base::TimeDelta::FromMinutes(2), | 151 base::TimeDelta::FromMinutes(2), |
| 141 60); | 152 60); |
| 142 } | 153 } |
| 143 | 154 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 syncer::MODEL_TYPE_COUNT); | 200 syncer::MODEL_TYPE_COUNT); |
| 190 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.DeferredInitTrigger", | 201 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.DeferredInitTrigger", |
| 191 TRIGGER_DATA_TYPE_REQUEST, | 202 TRIGGER_DATA_TYPE_REQUEST, |
| 192 MAX_TRIGGER_VALUE); | 203 MAX_TRIGGER_VALUE); |
| 193 } | 204 } |
| 194 received_start_request_ = true; | 205 received_start_request_ = true; |
| 195 TryStart(); | 206 TryStart(); |
| 196 } | 207 } |
| 197 | 208 |
| 198 } // namespace browser_sync | 209 } // namespace browser_sync |
| OLD | NEW |