Index: chrome/browser/sync/glue/data_type_manager_impl.cc |
diff --git a/chrome/browser/sync/glue/data_type_manager_impl.cc b/chrome/browser/sync/glue/data_type_manager_impl.cc |
deleted file mode 100644 |
index d578465a745700c838ffc03f5a05a4477c9c454b..0000000000000000000000000000000000000000 |
--- a/chrome/browser/sync/glue/data_type_manager_impl.cc |
+++ /dev/null |
@@ -1,597 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/sync/glue/data_type_manager_impl.h" |
- |
-#include <algorithm> |
-#include <functional> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback.h" |
-#include "base/compiler_specific.h" |
-#include "base/debug/trace_event.h" |
-#include "base/logging.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/metrics/histogram.h" |
-#include "base/strings/stringprintf.h" |
-#include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h" |
-#include "components/sync_driver/data_type_controller.h" |
-#include "components/sync_driver/data_type_encryption_handler.h" |
-#include "components/sync_driver/data_type_manager_observer.h" |
-#include "components/sync_driver/failed_data_types_handler.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "sync/internal_api/public/data_type_debug_info_listener.h" |
- |
-using content::BrowserThread; |
- |
-namespace browser_sync { |
- |
-namespace { |
- |
-FailedDataTypesHandler::TypeErrorMap |
-GenerateCryptoErrorsForTypes(syncer::ModelTypeSet encrypted_types) { |
- FailedDataTypesHandler::TypeErrorMap crypto_errors; |
- for (syncer::ModelTypeSet::Iterator iter = encrypted_types.First(); |
- iter.Good(); iter.Inc()) { |
- crypto_errors[iter.Get()] = syncer::SyncError( |
- FROM_HERE, |
- syncer::SyncError::CRYPTO_ERROR, |
- "", |
- iter.Get()); |
- } |
- return crypto_errors; |
-} |
- |
-} // namespace |
- |
-DataTypeManagerImpl::AssociationTypesInfo::AssociationTypesInfo() {} |
-DataTypeManagerImpl::AssociationTypesInfo::~AssociationTypesInfo() {} |
- |
-DataTypeManagerImpl::DataTypeManagerImpl( |
- const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& |
- debug_info_listener, |
- const DataTypeController::TypeMap* controllers, |
- const browser_sync::DataTypeEncryptionHandler* encryption_handler, |
- BackendDataTypeConfigurer* configurer, |
- DataTypeManagerObserver* observer, |
- browser_sync::FailedDataTypesHandler* failed_data_types_handler) |
- : configurer_(configurer), |
- controllers_(controllers), |
- state_(DataTypeManager::STOPPED), |
- needs_reconfigure_(false), |
- last_configure_reason_(syncer::CONFIGURE_REASON_UNKNOWN), |
- debug_info_listener_(debug_info_listener), |
- model_association_manager_(controllers, this), |
- observer_(observer), |
- failed_data_types_handler_(failed_data_types_handler), |
- encryption_handler_(encryption_handler), |
- weak_ptr_factory_(this) { |
- DCHECK(failed_data_types_handler_); |
- DCHECK(configurer_); |
- DCHECK(observer_); |
-} |
- |
-DataTypeManagerImpl::~DataTypeManagerImpl() {} |
- |
-void DataTypeManagerImpl::Configure(syncer::ModelTypeSet desired_types, |
- syncer::ConfigureReason reason) { |
- desired_types.PutAll(syncer::CoreTypes()); |
- |
- // Only allow control types and types that have controllers. |
- syncer::ModelTypeSet filtered_desired_types; |
- for (syncer::ModelTypeSet::Iterator type = desired_types.First(); |
- type.Good(); type.Inc()) { |
- if (syncer::IsControlType(type.Get()) || |
- controllers_->find(type.Get()) != controllers_->end()) { |
- filtered_desired_types.Put(type.Get()); |
- } |
- } |
- ConfigureImpl(filtered_desired_types, reason); |
-} |
- |
-void DataTypeManagerImpl::PurgeForMigration( |
- syncer::ModelTypeSet undesired_types, |
- syncer::ConfigureReason reason) { |
- syncer::ModelTypeSet remainder = Difference(last_requested_types_, |
- undesired_types); |
- ConfigureImpl(remainder, reason); |
-} |
- |
-void DataTypeManagerImpl::ConfigureImpl( |
- syncer::ModelTypeSet desired_types, |
- syncer::ConfigureReason reason) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK_NE(reason, syncer::CONFIGURE_REASON_UNKNOWN); |
- DVLOG(1) << "Configuring for " << syncer::ModelTypeSetToString(desired_types) |
- << " with reason " << reason; |
- if (state_ == STOPPING) { |
- // You can not set a configuration while stopping. |
- LOG(ERROR) << "Configuration set while stopping."; |
- return; |
- } |
- |
- if (state_ == CONFIGURED && |
- last_requested_types_.Equals(desired_types) && |
- reason == syncer::CONFIGURE_REASON_RECONFIGURATION && |
- syncer::Intersection(failed_data_types_handler_->GetFailedTypes(), |
- last_requested_types_).Empty()) { |
- // If the set of enabled types hasn't changed and there are no failing |
- // types, we can exit out early. |
- DVLOG(1) << "Reconfigure with same types, bypassing confguration."; |
- NotifyStart(); |
- ConfigureResult result(OK, last_requested_types_); |
- NotifyDone(result); |
- return; |
- } |
- |
- last_requested_types_ = desired_types; |
- last_configure_reason_ = reason; |
- // Only proceed if we're in a steady state or retrying. |
- if (state_ != STOPPED && state_ != CONFIGURED && state_ != RETRYING) { |
- DVLOG(1) << "Received configure request while configuration in flight. " |
- << "Postponing until current configuration complete."; |
- needs_reconfigure_ = true; |
- return; |
- } |
- |
- Restart(reason); |
-} |
- |
-BackendDataTypeConfigurer::DataTypeConfigStateMap |
-DataTypeManagerImpl::BuildDataTypeConfigStateMap( |
- const syncer::ModelTypeSet& types_being_configured) const { |
- // 1. Get the failed types (both due to fatal and crypto errors). |
- // 2. Add the difference between last_requested_types_ and the failed types |
- // as CONFIGURE_INACTIVE. |
- // 3. Flip |types_being_configured| to CONFIGURE_ACTIVE. |
- // 4. Set non-enabled user types as DISABLED. |
- // 5. Set the fatal and crypto types to their respective states. |
- syncer::ModelTypeSet error_types = |
- failed_data_types_handler_->GetFailedTypes(); |
- syncer::ModelTypeSet fatal_types = |
- failed_data_types_handler_->GetFatalErrorTypes(); |
- syncer::ModelTypeSet crypto_types = |
- failed_data_types_handler_->GetCryptoErrorTypes(); |
- |
- // Types with persistence errors are only purged/resynced when they're |
- // actively being configured. |
- syncer::ModelTypeSet persistence_types = |
- failed_data_types_handler_->GetPersistenceErrorTypes(); |
- persistence_types.RetainAll(types_being_configured); |
- |
- syncer::ModelTypeSet enabled_types = last_requested_types_; |
- enabled_types.RemoveAll(error_types); |
- syncer::ModelTypeSet disabled_types = |
- syncer::Difference( |
- syncer::Union(syncer::UserTypes(), syncer::ControlTypes()), |
- enabled_types); |
- syncer::ModelTypeSet to_configure = syncer::Intersection( |
- enabled_types, types_being_configured); |
- DVLOG(1) << "Enabling: " << syncer::ModelTypeSetToString(enabled_types); |
- DVLOG(1) << "Configuring: " << syncer::ModelTypeSetToString(to_configure); |
- DVLOG(1) << "Disabling: " << syncer::ModelTypeSetToString(disabled_types); |
- |
- BackendDataTypeConfigurer::DataTypeConfigStateMap config_state_map; |
- BackendDataTypeConfigurer::SetDataTypesState( |
- BackendDataTypeConfigurer::CONFIGURE_INACTIVE, enabled_types, |
- &config_state_map); |
- BackendDataTypeConfigurer::SetDataTypesState( |
- BackendDataTypeConfigurer::CONFIGURE_ACTIVE, to_configure, |
- &config_state_map); |
- BackendDataTypeConfigurer::SetDataTypesState( |
- BackendDataTypeConfigurer::CONFIGURE_CLEAN, persistence_types, |
- &config_state_map); |
- BackendDataTypeConfigurer::SetDataTypesState( |
- BackendDataTypeConfigurer::DISABLED, disabled_types, |
- &config_state_map); |
- BackendDataTypeConfigurer::SetDataTypesState( |
- BackendDataTypeConfigurer::FATAL, fatal_types, |
- &config_state_map); |
- BackendDataTypeConfigurer::SetDataTypesState( |
- BackendDataTypeConfigurer::CRYPTO, crypto_types, |
- &config_state_map); |
- return config_state_map; |
-} |
- |
-void DataTypeManagerImpl::Restart(syncer::ConfigureReason reason) { |
- DVLOG(1) << "Restarting..."; |
- |
- // Check for new or resolved data type crypto errors. |
- if (encryption_handler_->IsPassphraseRequired()) { |
- syncer::ModelTypeSet encrypted_types = |
- encryption_handler_->GetEncryptedDataTypes(); |
- encrypted_types.RetainAll(last_requested_types_); |
- encrypted_types.RemoveAll( |
- failed_data_types_handler_->GetCryptoErrorTypes()); |
- FailedDataTypesHandler::TypeErrorMap crypto_errors = |
- GenerateCryptoErrorsForTypes(encrypted_types); |
- failed_data_types_handler_->UpdateFailedDataTypes(crypto_errors); |
- } else { |
- failed_data_types_handler_->ResetCryptoErrors(); |
- } |
- |
- syncer::ModelTypeSet failed_types = |
- failed_data_types_handler_->GetFailedTypes(); |
- syncer::ModelTypeSet enabled_types = |
- syncer::Difference(last_requested_types_, failed_types); |
- |
- last_restart_time_ = base::Time::Now(); |
- configuration_stats_.clear(); |
- |
- DCHECK(state_ == STOPPED || state_ == CONFIGURED || state_ == RETRYING); |
- |
- // Starting from a "steady state" (stopped or configured) state |
- // should send a start notification. |
- if (state_ == STOPPED || state_ == CONFIGURED) |
- NotifyStart(); |
- |
- model_association_manager_.Initialize(enabled_types); |
- |
- download_types_queue_ = PrioritizeTypes(enabled_types); |
- association_types_queue_ = std::queue<AssociationTypesInfo>(); |
- |
- // Tell the backend about the new set of data types we wish to sync. |
- // The task will be invoked when updates are downloaded. |
- state_ = DOWNLOAD_PENDING; |
- configurer_->ConfigureDataTypes( |
- reason, |
- BuildDataTypeConfigStateMap(download_types_queue_.front()), |
- base::Bind(&DataTypeManagerImpl::DownloadReady, |
- weak_ptr_factory_.GetWeakPtr(), |
- base::Time::Now(), |
- download_types_queue_.front(), |
- syncer::ModelTypeSet()), |
- base::Bind(&DataTypeManagerImpl::OnDownloadRetry, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-syncer::ModelTypeSet DataTypeManagerImpl::GetPriorityTypes() const { |
- syncer::ModelTypeSet high_priority_types; |
- high_priority_types.PutAll(syncer::PriorityCoreTypes()); |
- high_priority_types.PutAll(syncer::PriorityUserTypes()); |
- return high_priority_types; |
-} |
- |
-TypeSetPriorityList DataTypeManagerImpl::PrioritizeTypes( |
- const syncer::ModelTypeSet& types) { |
- syncer::ModelTypeSet high_priority_types = GetPriorityTypes(); |
- high_priority_types.RetainAll(types); |
- |
- syncer::ModelTypeSet low_priority_types = |
- syncer::Difference(types, high_priority_types); |
- |
- TypeSetPriorityList result; |
- if (!high_priority_types.Empty()) |
- result.push(high_priority_types); |
- if (!low_priority_types.Empty()) |
- result.push(low_priority_types); |
- |
- // Could be empty in case of purging for migration, sync nothing, etc. |
- // Configure empty set to purge data from backend. |
- if (result.empty()) |
- result.push(syncer::ModelTypeSet()); |
- |
- return result; |
-} |
- |
-void DataTypeManagerImpl::ProcessReconfigure() { |
- DCHECK(needs_reconfigure_); |
- |
- // Wait for current download and association to finish. |
- if (!(download_types_queue_.empty() && association_types_queue_.empty())) |
- return; |
- |
- // An attempt was made to reconfigure while we were already configuring. |
- // This can be because a passphrase was accepted or the user changed the |
- // set of desired types. Either way, |last_requested_types_| will contain |
- // the most recent set of desired types, so we just call configure. |
- // Note: we do this whether or not GetControllersNeedingStart is true, |
- // because we may need to stop datatypes. |
- DVLOG(1) << "Reconfiguring due to previous configure attempt occuring while" |
- << " busy."; |
- |
- // Note: ConfigureImpl is called directly, rather than posted, in order to |
- // ensure that any purging/unapplying/journaling happens while the set of |
- // failed types is still up to date. If stack unwinding were to be done |
- // via PostTask, the failed data types may be reset before the purging was |
- // performed. |
- state_ = RETRYING; |
- needs_reconfigure_ = false; |
- ConfigureImpl(last_requested_types_, last_configure_reason_); |
-} |
- |
-void DataTypeManagerImpl::OnDownloadRetry() { |
- DCHECK(state_ == DOWNLOAD_PENDING || state_ == CONFIGURING); |
- observer_->OnConfigureRetry(); |
-} |
- |
-void DataTypeManagerImpl::DownloadReady( |
- base::Time download_start_time, |
- syncer::ModelTypeSet types_to_download, |
- syncer::ModelTypeSet high_priority_types_before, |
- syncer::ModelTypeSet first_sync_types, |
- syncer::ModelTypeSet failed_configuration_types) { |
- DCHECK(state_ == DOWNLOAD_PENDING || state_ == CONFIGURING); |
- |
- // Persistence errors are reset after each backend configuration attempt |
- // during which they would have been purged. |
- failed_data_types_handler_->ResetPersistenceErrorsFrom(types_to_download); |
- |
- // Ignore |failed_configuration_types| if we need to reconfigure |
- // anyway. |
- if (needs_reconfigure_) { |
- download_types_queue_ = TypeSetPriorityList(); |
- ProcessReconfigure(); |
- return; |
- } |
- |
- if (!failed_configuration_types.Empty()) { |
- ChromeReportUnrecoverableError(); |
- std::string error_msg = |
- "Configuration failed for types " + |
- syncer::ModelTypeSetToString(failed_configuration_types); |
- syncer::SyncError error(FROM_HERE, |
- syncer::SyncError::UNRECOVERABLE_ERROR, |
- error_msg, |
- failed_configuration_types.First().Get()); |
- Abort(UNRECOVERABLE_ERROR, error); |
- return; |
- } |
- |
- state_ = CONFIGURING; |
- |
- // Pop and associate download-ready types. |
- syncer::ModelTypeSet ready_types = types_to_download; |
- download_types_queue_.pop(); |
- syncer::ModelTypeSet new_types_to_download; |
- if (!download_types_queue_.empty()) |
- new_types_to_download = download_types_queue_.front(); |
- |
- AssociationTypesInfo association_info; |
- association_info.types = ready_types; |
- association_info.first_sync_types = first_sync_types; |
- association_info.download_start_time = download_start_time; |
- association_info.download_ready_time = base::Time::Now(); |
- association_info.high_priority_types_before = high_priority_types_before; |
- association_types_queue_.push(association_info); |
- if (association_types_queue_.size() == 1u) |
- StartNextAssociation(); |
- |
- // Download types of low priority while configuring types of high priority. |
- if (!new_types_to_download.Empty()) { |
- configurer_->ConfigureDataTypes( |
- last_configure_reason_, |
- BuildDataTypeConfigStateMap(new_types_to_download), |
- base::Bind(&DataTypeManagerImpl::DownloadReady, |
- weak_ptr_factory_.GetWeakPtr(), |
- base::Time::Now(), |
- new_types_to_download, |
- syncer::Union(ready_types, high_priority_types_before)), |
- base::Bind(&DataTypeManagerImpl::OnDownloadRetry, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
-} |
- |
-void DataTypeManagerImpl::StartNextAssociation() { |
- CHECK(!association_types_queue_.empty()); |
- |
- association_types_queue_.front().association_request_time = |
- base::Time::Now(); |
- model_association_manager_.StartAssociationAsync( |
- association_types_queue_.front().types); |
-} |
- |
-void DataTypeManagerImpl::OnSingleDataTypeAssociationDone( |
- syncer::ModelType type, |
- const syncer::DataTypeAssociationStats& association_stats) { |
- DCHECK(!association_types_queue_.empty()); |
- DataTypeController::TypeMap::const_iterator c_it = controllers_->find(type); |
- DCHECK(c_it != controllers_->end()); |
- if (c_it->second->state() == DataTypeController::RUNNING) { |
- // Tell the backend about the change processor for this type so it can |
- // begin routing changes to it. |
- configurer_->ActivateDataType(type, c_it->second->model_safe_group(), |
- c_it->second->GetChangeProcessor()); |
- } |
- |
- if (!debug_info_listener_.IsInitialized()) |
- return; |
- |
- AssociationTypesInfo& info = association_types_queue_.front(); |
- configuration_stats_.push_back(syncer::DataTypeConfigurationStats()); |
- configuration_stats_.back().model_type = type; |
- configuration_stats_.back().association_stats = association_stats; |
- if (info.types.Has(type)) { |
- // Times in |info| only apply to non-slow types. |
- configuration_stats_.back().download_wait_time = |
- info.download_start_time - last_restart_time_; |
- if (info.first_sync_types.Has(type)) { |
- configuration_stats_.back().download_time = |
- info.download_ready_time - info.download_start_time; |
- } |
- configuration_stats_.back().association_wait_time_for_high_priority = |
- info.association_request_time - info.download_ready_time; |
- configuration_stats_.back().high_priority_types_configured_before = |
- info.high_priority_types_before; |
- configuration_stats_.back().same_priority_types_configured_before = |
- info.configured_types; |
- info.configured_types.Put(type); |
- } |
-} |
- |
-void DataTypeManagerImpl::OnModelAssociationDone( |
- const DataTypeManager::ConfigureResult& result) { |
- DCHECK(state_ == STOPPING || state_ == CONFIGURING); |
- |
- if (state_ == STOPPING) |
- return; |
- |
- // Don't reconfigure due to failed data types if we have an unrecoverable |
- // error or have already aborted. |
- if (result.status == PARTIAL_SUCCESS) { |
- if (!result.needs_crypto.Empty()) { |
- needs_reconfigure_ = true; |
- syncer::ModelTypeSet encrypted_types = result.needs_crypto; |
- encrypted_types.RemoveAll( |
- failed_data_types_handler_->GetCryptoErrorTypes()); |
- FailedDataTypesHandler::TypeErrorMap crypto_errors = |
- GenerateCryptoErrorsForTypes(encrypted_types); |
- failed_data_types_handler_->UpdateFailedDataTypes(crypto_errors); |
- } |
- if (!result.failed_data_types.empty()) { |
- needs_reconfigure_ = true; |
- failed_data_types_handler_->UpdateFailedDataTypes( |
- result.failed_data_types); |
- } |
- } |
- |
- // Ignore abort/unrecoverable error if we need to reconfigure anyways. |
- if (needs_reconfigure_) { |
- association_types_queue_ = std::queue<AssociationTypesInfo>(); |
- ProcessReconfigure(); |
- return; |
- } |
- |
- if (result.status == ABORTED || result.status == UNRECOVERABLE_ERROR) { |
- Abort(result.status, result.failed_data_types.size() >= 1 ? |
- result.failed_data_types.begin()->second : |
- syncer::SyncError()); |
- return; |
- } |
- |
- DCHECK(result.status == PARTIAL_SUCCESS || result.status == OK); |
- DCHECK(result.status != OK || |
- (result.needs_crypto.Empty() && result.failed_data_types.empty())); |
- |
- // It's possible this is a retry to disable failed types, in which case |
- // the association would be SUCCESS, but the overall configuration should |
- // still be PARTIAL_SUCCESS. |
- syncer::ModelTypeSet failed_data_types = |
- failed_data_types_handler_->GetFailedTypes(); |
- ConfigureStatus status = result.status; |
- if (!syncer::Intersection(last_requested_types_, |
- failed_data_types).Empty() && result.status == OK) { |
- status = PARTIAL_SUCCESS; |
- } |
- |
- association_types_queue_.pop(); |
- if (!association_types_queue_.empty()) { |
- StartNextAssociation(); |
- } else if (download_types_queue_.empty()) { |
- state_ = CONFIGURED; |
- ConfigureResult configure_result(status, |
- result.requested_types, |
- failed_data_types_handler_->GetAllErrors(), |
- result.unfinished_data_types, |
- result.needs_crypto); |
- NotifyDone(configure_result); |
- } |
-} |
- |
-void DataTypeManagerImpl::Stop() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (state_ == STOPPED) |
- return; |
- |
- bool need_to_notify = |
- state_ == DOWNLOAD_PENDING || state_ == CONFIGURING; |
- StopImpl(); |
- |
- if (need_to_notify) { |
- ConfigureResult result(ABORTED, |
- last_requested_types_, |
- std::map<syncer::ModelType, syncer::SyncError>(), |
- syncer::ModelTypeSet(), |
- syncer::ModelTypeSet()); |
- NotifyDone(result); |
- } |
-} |
- |
-void DataTypeManagerImpl::Abort(ConfigureStatus status, |
- const syncer::SyncError& error) { |
- DCHECK(state_ == DOWNLOAD_PENDING || state_ == CONFIGURING); |
- |
- StopImpl(); |
- |
- DCHECK_NE(OK, status); |
- std::map<syncer::ModelType, syncer::SyncError> errors; |
- if (error.IsSet()) |
- errors[error.model_type()] = error; |
- ConfigureResult result(status, |
- last_requested_types_, |
- errors, |
- syncer::ModelTypeSet(), |
- syncer::ModelTypeSet()); |
- NotifyDone(result); |
-} |
- |
-void DataTypeManagerImpl::StopImpl() { |
- state_ = STOPPING; |
- |
- // Invalidate weak pointer to drop download callbacks. |
- weak_ptr_factory_.InvalidateWeakPtrs(); |
- |
- // Stop all data types. This may trigger association callback but the |
- // callback will do nothing because state is set to STOPPING above. |
- model_association_manager_.Stop(); |
- |
- state_ = STOPPED; |
-} |
- |
-void DataTypeManagerImpl::NotifyStart() { |
- observer_->OnConfigureStart(); |
-} |
- |
-void DataTypeManagerImpl::NotifyDone(const ConfigureResult& result) { |
- AddToConfigureTime(); |
- |
- DVLOG(1) << "Total time spent configuring: " |
- << configure_time_delta_.InSecondsF() << "s"; |
- switch (result.status) { |
- case DataTypeManager::OK: |
- DVLOG(1) << "NotifyDone called with result: OK"; |
- UMA_HISTOGRAM_LONG_TIMES("Sync.ConfigureTime_Long.OK", |
- configure_time_delta_); |
- if (debug_info_listener_.IsInitialized() && |
- !configuration_stats_.empty()) { |
- debug_info_listener_.Call( |
- FROM_HERE, |
- &syncer::DataTypeDebugInfoListener::OnDataTypeConfigureComplete, |
- configuration_stats_); |
- } |
- configuration_stats_.clear(); |
- break; |
- case DataTypeManager::ABORTED: |
- DVLOG(1) << "NotifyDone called with result: ABORTED"; |
- UMA_HISTOGRAM_LONG_TIMES("Sync.ConfigureTime_Long.ABORTED", |
- configure_time_delta_); |
- break; |
- case DataTypeManager::UNRECOVERABLE_ERROR: |
- DVLOG(1) << "NotifyDone called with result: UNRECOVERABLE_ERROR"; |
- UMA_HISTOGRAM_LONG_TIMES("Sync.ConfigureTime_Long.UNRECOVERABLE_ERROR", |
- configure_time_delta_); |
- break; |
- case DataTypeManager::PARTIAL_SUCCESS: |
- DVLOG(1) << "NotifyDone called with result: PARTIAL_SUCCESS"; |
- UMA_HISTOGRAM_LONG_TIMES("Sync.ConfigureTime_Long.PARTIAL_SUCCESS", |
- configure_time_delta_); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- observer_->OnConfigureDone(result); |
-} |
- |
-DataTypeManager::State DataTypeManagerImpl::state() const { |
- return state_; |
-} |
- |
-void DataTypeManagerImpl::AddToConfigureTime() { |
- DCHECK(!last_restart_time_.is_null()); |
- configure_time_delta_ += (base::Time::Now() - last_restart_time_); |
-} |
- |
-} // namespace browser_sync |