| 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 "chrome/browser/sync/startup_controller.h" | 5 #include "chrome/browser/sync/startup_controller.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 setup_in_progress_(false), | 44 setup_in_progress_(false), |
| 45 auto_start_enabled_(start_behavior == AUTO_START), | 45 auto_start_enabled_(start_behavior == AUTO_START), |
| 46 sync_prefs_(sync_prefs), | 46 sync_prefs_(sync_prefs), |
| 47 token_service_(token_service), | 47 token_service_(token_service), |
| 48 signin_(signin), | 48 signin_(signin), |
| 49 start_backend_(start_backend), | 49 start_backend_(start_backend), |
| 50 fallback_timeout_( | 50 fallback_timeout_( |
| 51 base::TimeDelta::FromSeconds(kDeferredInitFallbackSeconds)), | 51 base::TimeDelta::FromSeconds(kDeferredInitFallbackSeconds)), |
| 52 first_start_(true), | 52 first_start_(true), |
| 53 weak_factory_(this) { | 53 weak_factory_(this) { |
| 54 | 54 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 55 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
| 56 switches::kSyncDeferredStartupTimeoutSeconds)) { | 55 switches::kSyncDeferredStartupTimeoutSeconds)) { |
| 57 int timeout = kDeferredInitFallbackSeconds; | 56 int timeout = kDeferredInitFallbackSeconds; |
| 58 if (base::StringToInt(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 57 if (base::StringToInt( |
| 59 switches::kSyncDeferredStartupTimeoutSeconds), &timeout)) { | 58 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 59 switches::kSyncDeferredStartupTimeoutSeconds), |
| 60 &timeout)) { |
| 60 DCHECK_GE(timeout, 0); | 61 DCHECK_GE(timeout, 0); |
| 61 DVLOG(2) << "Sync StartupController overriding startup timeout to " | 62 DVLOG(2) << "Sync StartupController overriding startup timeout to " |
| 62 << timeout << " seconds."; | 63 << timeout << " seconds."; |
| 63 fallback_timeout_ = base::TimeDelta::FromSeconds(timeout); | 64 fallback_timeout_ = base::TimeDelta::FromSeconds(timeout); |
| 64 } | 65 } |
| 65 } | 66 } |
| 66 } | 67 } |
| 67 | 68 |
| 68 StartupController::~StartupController() {} | 69 StartupController::~StartupController() {} |
| 69 | 70 |
| 70 void StartupController::Reset(const syncer::ModelTypeSet registered_types) { | 71 void StartupController::Reset(const syncer::ModelTypeSet registered_types) { |
| 71 received_start_request_ = false; | 72 received_start_request_ = false; |
| 72 start_up_time_ = base::Time(); | 73 start_up_time_ = base::Time(); |
| 73 start_backend_time_ = base::Time(); | 74 start_backend_time_ = base::Time(); |
| 74 // Don't let previous timers affect us post-reset. | 75 // Don't let previous timers affect us post-reset. |
| 75 weak_factory_.InvalidateWeakPtrs(); | 76 weak_factory_.InvalidateWeakPtrs(); |
| 76 registered_types_ = registered_types; | 77 registered_types_ = registered_types; |
| 77 } | 78 } |
| 78 | 79 |
| 79 void StartupController::set_setup_in_progress(bool in_progress) { | 80 void StartupController::set_setup_in_progress(bool in_progress) { |
| 80 setup_in_progress_ = in_progress; | 81 setup_in_progress_ = in_progress; |
| 81 } | 82 } |
| 82 | 83 |
| 83 bool StartupController::StartUp(StartUpDeferredOption deferred_option) { | 84 bool StartupController::StartUp(StartUpDeferredOption deferred_option) { |
| 84 const bool first_start = start_up_time_.is_null(); | 85 const bool first_start = start_up_time_.is_null(); |
| 85 if (first_start) | 86 if (first_start) |
| 86 start_up_time_ = base::Time::Now(); | 87 start_up_time_ = base::Time::Now(); |
| 87 | 88 |
| 88 if (deferred_option == STARTUP_BACKEND_DEFERRED && | 89 if (deferred_option == STARTUP_BACKEND_DEFERRED && |
| 89 !CommandLine::ForCurrentProcess()->HasSwitch( | 90 !base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 90 switches::kSyncDisableDeferredStartup) && | 91 switches::kSyncDisableDeferredStartup) && |
| 91 sync_prefs_->GetPreferredDataTypes(registered_types_) | 92 sync_prefs_->GetPreferredDataTypes(registered_types_) |
| 92 .Has(syncer::SESSIONS)) { | 93 .Has(syncer::SESSIONS)) { |
| 93 if (first_start) { | 94 if (first_start) { |
| 94 base::MessageLoop::current()->PostDelayedTask( | 95 base::MessageLoop::current()->PostDelayedTask( |
| 95 FROM_HERE, | 96 FROM_HERE, |
| 96 base::Bind(&StartupController::OnFallbackStartupTimerExpired, | 97 base::Bind(&StartupController::OnFallbackStartupTimerExpired, |
| 97 weak_factory_.GetWeakPtr()), fallback_timeout_); | 98 weak_factory_.GetWeakPtr()), fallback_timeout_); |
| 98 } | 99 } |
| 99 return false; | 100 return false; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 DCHECK(!start_up_time_.is_null()); | 176 DCHECK(!start_up_time_.is_null()); |
| 176 base::TimeDelta time_deferred = base::Time::Now() - start_up_time_; | 177 base::TimeDelta time_deferred = base::Time::Now() - start_up_time_; |
| 177 UMA_HISTOGRAM_CUSTOM_TIMES("Sync.Startup.TimeDeferred2", | 178 UMA_HISTOGRAM_CUSTOM_TIMES("Sync.Startup.TimeDeferred2", |
| 178 time_deferred, | 179 time_deferred, |
| 179 base::TimeDelta::FromSeconds(0), | 180 base::TimeDelta::FromSeconds(0), |
| 180 base::TimeDelta::FromMinutes(2), | 181 base::TimeDelta::FromMinutes(2), |
| 181 60); | 182 60); |
| 182 } | 183 } |
| 183 | 184 |
| 184 void StartupController::OnFallbackStartupTimerExpired() { | 185 void StartupController::OnFallbackStartupTimerExpired() { |
| 185 DCHECK(!CommandLine::ForCurrentProcess()->HasSwitch( | 186 DCHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 186 switches::kSyncDisableDeferredStartup)); | 187 switches::kSyncDisableDeferredStartup)); |
| 187 | 188 |
| 188 if (!start_backend_time_.is_null()) | 189 if (!start_backend_time_.is_null()) |
| 189 return; | 190 return; |
| 190 | 191 |
| 191 DVLOG(2) << "Sync deferred init fallback timer expired, starting backend."; | 192 DVLOG(2) << "Sync deferred init fallback timer expired, starting backend."; |
| 192 RecordTimeDeferred(); | 193 RecordTimeDeferred(); |
| 193 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.DeferredInitTrigger", | 194 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.DeferredInitTrigger", |
| 194 TRIGGER_FALLBACK_TIMER, | 195 TRIGGER_FALLBACK_TIMER, |
| 195 MAX_TRIGGER_VALUE); | 196 MAX_TRIGGER_VALUE); |
| 196 received_start_request_ = true; | 197 received_start_request_ = true; |
| 197 TryStart(); | 198 TryStart(); |
| 198 } | 199 } |
| 199 | 200 |
| 200 std::string StartupController::GetBackendInitializationStateString() const { | 201 std::string StartupController::GetBackendInitializationStateString() const { |
| 201 if (!start_backend_time_.is_null()) | 202 if (!start_backend_time_.is_null()) |
| 202 return "Started"; | 203 return "Started"; |
| 203 else if (!start_up_time_.is_null()) | 204 else if (!start_up_time_.is_null()) |
| 204 return "Deferred"; | 205 return "Deferred"; |
| 205 else | 206 else |
| 206 return "Not started"; | 207 return "Not started"; |
| 207 } | 208 } |
| 208 | 209 |
| 209 void StartupController::OnDataTypeRequestsSyncStartup(syncer::ModelType type) { | 210 void StartupController::OnDataTypeRequestsSyncStartup(syncer::ModelType type) { |
| 210 if (CommandLine::ForCurrentProcess()->HasSwitch( | 211 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 211 switches::kSyncDisableDeferredStartup)) { | 212 switches::kSyncDisableDeferredStartup)) { |
| 212 DVLOG(2) << "Ignoring data type request for sync startup: " | 213 DVLOG(2) << "Ignoring data type request for sync startup: " |
| 213 << syncer::ModelTypeToString(type); | 214 << syncer::ModelTypeToString(type); |
| 214 return; | 215 return; |
| 215 } | 216 } |
| 216 | 217 |
| 217 if (!start_backend_time_.is_null()) | 218 if (!start_backend_time_.is_null()) |
| 218 return; | 219 return; |
| 219 | 220 |
| 220 DVLOG(2) << "Data type requesting sync startup: " | 221 DVLOG(2) << "Data type requesting sync startup: " |
| 221 << syncer::ModelTypeToString(type); | 222 << syncer::ModelTypeToString(type); |
| 222 // Measure the time spent waiting for init and the type that triggered it. | 223 // Measure the time spent waiting for init and the type that triggered it. |
| 223 // We could measure the time spent deferred on a per-datatype basis, but | 224 // We could measure the time spent deferred on a per-datatype basis, but |
| 224 // for now this is probably sufficient. | 225 // for now this is probably sufficient. |
| 225 if (!start_up_time_.is_null()) { | 226 if (!start_up_time_.is_null()) { |
| 226 RecordTimeDeferred(); | 227 RecordTimeDeferred(); |
| 227 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.TypeTriggeringInit", | 228 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.TypeTriggeringInit", |
| 228 ModelTypeToHistogramInt(type), | 229 ModelTypeToHistogramInt(type), |
| 229 syncer::MODEL_TYPE_COUNT); | 230 syncer::MODEL_TYPE_COUNT); |
| 230 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.DeferredInitTrigger", | 231 UMA_HISTOGRAM_ENUMERATION("Sync.Startup.DeferredInitTrigger", |
| 231 TRIGGER_DATA_TYPE_REQUEST, | 232 TRIGGER_DATA_TYPE_REQUEST, |
| 232 MAX_TRIGGER_VALUE); | 233 MAX_TRIGGER_VALUE); |
| 233 } | 234 } |
| 234 received_start_request_ = true; | 235 received_start_request_ = true; |
| 235 TryStart(); | 236 TryStart(); |
| 236 } | 237 } |
| 237 | 238 |
| 238 } // namespace browser_sync | 239 } // namespace browser_sync |
| OLD | NEW |