Chromium Code Reviews| 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 1d4a96e77e5a41395aef6d2ed27c39c378a0d158..e6491644022f349e3337fea2d04a5937d6dcaad8 100644 |
| --- a/components/sync_driver/data_type_manager_impl.cc |
| +++ b/components/sync_driver/data_type_manager_impl.cc |
| @@ -83,8 +83,24 @@ void DataTypeManagerImpl::Configure(syncer::ModelTypeSet desired_types, |
| syncer::ModelTypeSet filtered_desired_types; |
| for (syncer::ModelTypeSet::Iterator type = desired_types.First(); |
| type.Good(); type.Inc()) { |
| + DataTypeController::TypeMap::const_iterator iter = |
| + controllers_->find(type.Get()); |
| if (syncer::IsControlType(type.Get()) || |
| - controllers_->find(type.Get()) != controllers_->end()) { |
| + iter != controllers_->end()) { |
| + // If the controller itself is not ready, don't attempt to enable it. |
| + if (iter != controllers_->end() && !iter->second->ReadyForStart()) { |
| + // 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. |
| + syncer::SyncError error(FROM_HERE, |
| + syncer::SyncError::UNREADY_ERROR, |
| + "Datatype not ready.", |
| + type.Get()); |
| + std::map<syncer::ModelType, syncer::SyncError> errors; |
| + errors[type.Get()] = error; |
| + failed_data_types_handler_->UpdateFailedDataTypes(errors); |
|
stanisc
2014/06/10 21:21:42
Consider adding an overload for UpdateFailedDataTy
Nicolas Zea
2014/06/19 00:04:22
I'd like to avoid that for this patch. I plan on r
|
| + continue; |
| + } |
| filtered_desired_types.Put(type.Get()); |
| } |
| } |
| @@ -111,19 +127,9 @@ void DataTypeManagerImpl::ConfigureImpl( |
| 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; |
| - } |
| + // TODO(zea): consider not performing a full configuration once there's a |
| + // reliable way to determine if the requested set of enabled types matches the |
| + // current set. |
| last_requested_types_ = desired_types; |
| last_configure_reason_ = reason; |
| @@ -147,12 +153,15 @@ DataTypeManagerImpl::BuildDataTypeConfigStateMap( |
| // 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. |
| + // 6. Add the unready types to CONFIGURE_INACTIVE |
| 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(); |
| + syncer::ModelTypeSet unready_types= |
| + failed_data_types_handler_->GetUnreadyErrorTypes(); |
| // Types with persistence errors are only purged/resynced when they're |
| // actively being configured. |
| @@ -174,7 +183,8 @@ DataTypeManagerImpl::BuildDataTypeConfigStateMap( |
| BackendDataTypeConfigurer::DataTypeConfigStateMap config_state_map; |
| BackendDataTypeConfigurer::SetDataTypesState( |
| - BackendDataTypeConfigurer::CONFIGURE_INACTIVE, enabled_types, |
| + BackendDataTypeConfigurer::CONFIGURE_INACTIVE, |
| + syncer::Union(enabled_types, unready_types), |
| &config_state_map); |
| BackendDataTypeConfigurer::SetDataTypesState( |
| BackendDataTypeConfigurer::CONFIGURE_ACTIVE, to_configure, |