Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: components/sync/driver/data_type_manager_impl.cc

Issue 2485773003: [Sync] Ensure unready types' state is updated before every reconfiguration (Closed)
Patch Set: Address comment from Nicolas. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_) {
« no previous file with comments | « components/sync/driver/data_type_manager_impl.h ('k') | components/sync/driver/data_type_manager_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698