| Index: components/sync/driver/data_type_manager_impl.cc
|
| diff --git a/components/sync/driver/data_type_manager_impl.cc b/components/sync/driver/data_type_manager_impl.cc
|
| index 84ace56b06d966bf0bae106603726ddd8b99b15b..e59ffb006efb2ba7ffd0667856e49c887a90ebf7 100644
|
| --- a/components/sync/driver/data_type_manager_impl.cc
|
| +++ b/components/sync/driver/data_type_manager_impl.cc
|
| @@ -84,21 +84,6 @@ void DataTypeManagerImpl::Configure(ModelTypeSet desired_types,
|
| DataTypeController::TypeMap::const_iterator iter =
|
| controllers_->find(type.Get());
|
| if (IsControlType(type.Get()) || iter != controllers_->end()) {
|
| - if (iter != controllers_->end()) {
|
| - if (!iter->second->ReadyForStart() &&
|
| - !data_type_status_table_.GetUnreadyErrorTypes().Has(type.Get())) {
|
| - // Add the type to the unready types set to prevent purging it. It's
|
| - // up to the datatype controller to, if necessary, explicitly
|
| - // mark the type as broken to trigger a purge.
|
| - SyncError error(FROM_HERE, SyncError::UNREADY_ERROR,
|
| - "Datatype not ready at config time.", type.Get());
|
| - std::map<ModelType, SyncError> errors;
|
| - errors[type.Get()] = error;
|
| - data_type_status_table_.UpdateFailedDataTypes(errors);
|
| - } else if (iter->second->ReadyForStart()) {
|
| - data_type_status_table_.ResetUnreadyErrorFor(type.Get());
|
| - }
|
| - }
|
| filtered_desired_types.Put(type.Get());
|
| }
|
| }
|
| @@ -265,6 +250,8 @@ void DataTypeManagerImpl::Restart(ConfigureReason reason) {
|
| data_type_status_table_.ResetCryptoErrors();
|
| }
|
|
|
| + UpdateUnreadyTypeErrors(last_requested_types_);
|
| +
|
| last_enabled_types_ = GetEnabledTypes();
|
| last_restart_time_ = base::Time::Now();
|
| configuration_stats_.clear();
|
| @@ -333,6 +320,32 @@ TypeSetPriorityList DataTypeManagerImpl::PrioritizeTypes(
|
| return result;
|
| }
|
|
|
| +void DataTypeManagerImpl::UpdateUnreadyTypeErrors(
|
| + const ModelTypeSet& desired_types) {
|
| + for (ModelTypeSet::Iterator type = desired_types.First(); type.Good();
|
| + type.Inc()) {
|
| + const auto& iter = controllers_->find(type.Get());
|
| + if (iter == controllers_->end())
|
| + continue;
|
| + const DataTypeController* dtc = iter->second.get();
|
| + bool unready_status =
|
| + data_type_status_table_.GetUnreadyErrorTypes().Has(type.Get());
|
| + if (dtc->ReadyForStart() != (unready_status == false)) {
|
| + // Adjust data_type_status_table_ if unready state in it doesn't match
|
| + // DataTypeController::ReadyForStart().
|
| + if (dtc->ReadyForStart()) {
|
| + data_type_status_table_.ResetUnreadyErrorFor(type.Get());
|
| + } else {
|
| + SyncError error(FROM_HERE, SyncError::UNREADY_ERROR,
|
| + "Datatype not ready at config time.", type.Get());
|
| + std::map<ModelType, SyncError> errors;
|
| + errors[type.Get()] = error;
|
| + data_type_status_table_.UpdateFailedDataTypes(errors);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| void DataTypeManagerImpl::ProcessReconfigure() {
|
| // This may have been called asynchronously; no-op if it is no longer needed.
|
| if (!needs_reconfigure_) {
|
|
|