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 "components/sync_driver/model_association_manager.h" | 5 #include "components/sync_driver/model_association_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 | 9 |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 syncer_merge_result.pre_association_version(); | 103 syncer_merge_result.pre_association_version(); |
104 stats.association_wait_time = association_wait_time; | 104 stats.association_wait_time = association_wait_time; |
105 stats.association_time = association_time; | 105 stats.association_time = association_time; |
106 return stats; | 106 return stats; |
107 } | 107 } |
108 | 108 |
109 } // namespace | 109 } // namespace |
110 | 110 |
111 ModelAssociationManager::ModelAssociationManager( | 111 ModelAssociationManager::ModelAssociationManager( |
112 const DataTypeController::TypeMap* controllers, | 112 const DataTypeController::TypeMap* controllers, |
113 ModelAssociationResultProcessor* processor) | 113 ModelAssociationManagerDelegate* processor) |
114 : state_(IDLE), | 114 : state_(IDLE), |
115 controllers_(controllers), | 115 controllers_(controllers), |
116 result_processor_(processor), | 116 delegate_(processor), |
117 weak_ptr_factory_(this), | 117 weak_ptr_factory_(this), |
118 configure_status_(DataTypeManager::UNKNOWN) { | 118 configure_status_(DataTypeManager::UNKNOWN) { |
119 // Ensure all data type controllers are stopped. | 119 // Ensure all data type controllers are stopped. |
120 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin(); | 120 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin(); |
121 it != controllers_->end(); ++it) { | 121 it != controllers_->end(); ++it) { |
122 DCHECK_EQ(DataTypeController::NOT_RUNNING, (*it).second->state()); | 122 DCHECK_EQ(DataTypeController::NOT_RUNNING, (*it).second->state()); |
123 } | 123 } |
124 } | 124 } |
125 | 125 |
126 ModelAssociationManager::~ModelAssociationManager() { | 126 ModelAssociationManager::~ModelAssociationManager() { |
(...skipping 16 matching lines...) Expand all Loading... |
143 | 143 |
144 DVLOG(1) << "ModelAssociationManager: Initializing for " | 144 DVLOG(1) << "ModelAssociationManager: Initializing for " |
145 << syncer::ModelTypeSetToString(desired_types_); | 145 << syncer::ModelTypeSetToString(desired_types_); |
146 | 146 |
147 state_ = INITIALIZED_TO_CONFIGURE; | 147 state_ = INITIALIZED_TO_CONFIGURE; |
148 | 148 |
149 StopDisabledTypes(); | 149 StopDisabledTypes(); |
150 LoadEnabledTypes(); | 150 LoadEnabledTypes(); |
151 } | 151 } |
152 | 152 |
| 153 void ModelAssociationManager::StopDatatype(DataTypeController* dtc) { |
| 154 // First tell the sync backend that we no longer want to listen to |
| 155 // changes for this type. |
| 156 delegate_->OnSingleDataTypeWillStop(dtc->type()); |
| 157 |
| 158 // Then tell all data type specific logic to shut down. |
| 159 dtc->Stop(); |
| 160 } |
| 161 |
153 void ModelAssociationManager::StopDisabledTypes() { | 162 void ModelAssociationManager::StopDisabledTypes() { |
154 DVLOG(1) << "ModelAssociationManager: Stopping disabled types."; | 163 DVLOG(1) << "ModelAssociationManager: Stopping disabled types."; |
155 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin(); | 164 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin(); |
156 it != controllers_->end(); ++it) { | 165 it != controllers_->end(); ++it) { |
157 DataTypeController* dtc = (*it).second.get(); | 166 DataTypeController* dtc = (*it).second.get(); |
158 if (dtc->state() != DataTypeController::NOT_RUNNING && | 167 if (dtc->state() != DataTypeController::NOT_RUNNING && |
159 (!desired_types_.Has(dtc->type()) || | 168 (!desired_types_.Has(dtc->type()) || |
160 failed_data_types_info_.count(dtc->type()) > 0)) { | 169 failed_data_types_info_.count(dtc->type()) > 0)) { |
161 DVLOG(1) << "ModelTypeToString: stop " << dtc->name(); | 170 DVLOG(1) << "ModelTypeToString: stop " << dtc->name(); |
162 dtc->Stop(); | 171 StopDatatype(dtc); |
163 | |
164 loaded_types_.Remove(dtc->type()); | 172 loaded_types_.Remove(dtc->type()); |
165 associated_types_.Remove(dtc->type()); | 173 associated_types_.Remove(dtc->type()); |
166 } | 174 } |
167 } | 175 } |
168 } | 176 } |
169 | 177 |
170 void ModelAssociationManager::LoadEnabledTypes() { | 178 void ModelAssociationManager::LoadEnabledTypes() { |
171 // Load in kStartOrder. | 179 // Load in kStartOrder. |
172 for (size_t i = 0; i < arraysize(kStartOrder); i++) { | 180 for (size_t i = 0; i < arraysize(kStartOrder); i++) { |
173 syncer::ModelType type = kStartOrder[i]; | 181 syncer::ModelType type = kStartOrder[i]; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 | 262 |
255 void ModelAssociationManager::Stop() { | 263 void ModelAssociationManager::Stop() { |
256 // Ignore callbacks from controllers. | 264 // Ignore callbacks from controllers. |
257 weak_ptr_factory_.InvalidateWeakPtrs(); | 265 weak_ptr_factory_.InvalidateWeakPtrs(); |
258 | 266 |
259 // Stop started data types. | 267 // Stop started data types. |
260 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin(); | 268 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin(); |
261 it != controllers_->end(); ++it) { | 269 it != controllers_->end(); ++it) { |
262 DataTypeController* dtc = (*it).second.get(); | 270 DataTypeController* dtc = (*it).second.get(); |
263 if (dtc->state() != DataTypeController::NOT_RUNNING) { | 271 if (dtc->state() != DataTypeController::NOT_RUNNING) { |
264 dtc->Stop(); | 272 StopDatatype(dtc); |
265 DVLOG(1) << "ModelAssociationManager: Stopped " << dtc->name(); | 273 DVLOG(1) << "ModelAssociationManager: Stopped " << dtc->name(); |
266 } | 274 } |
267 } | 275 } |
268 | 276 |
269 desired_types_.Clear(); | 277 desired_types_.Clear(); |
270 loaded_types_.Clear(); | 278 loaded_types_.Clear(); |
271 associated_types_.Clear(); | 279 associated_types_.Clear(); |
272 slow_types_.Clear(); | 280 slow_types_.Clear(); |
273 | 281 |
274 if (state_ == CONFIGURING) { | 282 if (state_ == CONFIGURING) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 | 354 |
347 DCHECK(!associated_types_.Has(type)); | 355 DCHECK(!associated_types_.Has(type)); |
348 if (DataTypeController::IsSuccessfulResult(start_result)) { | 356 if (DataTypeController::IsSuccessfulResult(start_result)) { |
349 associated_types_.Put(type); | 357 associated_types_.Put(type); |
350 } else if (state_ == IDLE) { | 358 } else if (state_ == IDLE) { |
351 // For type that failed in IDLE mode, simply stop the controller. Next | 359 // For type that failed in IDLE mode, simply stop the controller. Next |
352 // configuration will try to restart from scratch if the type is still | 360 // configuration will try to restart from scratch if the type is still |
353 // enabled. | 361 // enabled. |
354 DataTypeController* dtc = controllers_->find(type)->second.get(); | 362 DataTypeController* dtc = controllers_->find(type)->second.get(); |
355 if (dtc->state() != DataTypeController::NOT_RUNNING) | 363 if (dtc->state() != DataTypeController::NOT_RUNNING) |
356 dtc->Stop(); | 364 StopDatatype(dtc); |
357 loaded_types_.Remove(type); | 365 loaded_types_.Remove(type); |
358 } else { | 366 } else { |
359 // Record error in CONFIGURING or INITIALIZED_TO_CONFIGURE mode. The error | 367 // Record error in CONFIGURING or INITIALIZED_TO_CONFIGURE mode. The error |
360 // will be reported when data types association finishes. | 368 // will be reported when data types association finishes. |
361 if (start_result == DataTypeController::NEEDS_CRYPTO) { | 369 if (start_result == DataTypeController::NEEDS_CRYPTO) { |
362 DVLOG(1) << "ModelAssociationManager: Encountered an undecryptable type"; | 370 DVLOG(1) << "ModelAssociationManager: Encountered an undecryptable type"; |
363 needs_crypto_types_.Put(type); | 371 needs_crypto_types_.Put(type); |
364 } else { | 372 } else { |
365 DVLOG(1) << "ModelAssociationManager: Encountered a failed type"; | 373 DVLOG(1) << "ModelAssociationManager: Encountered a failed type"; |
366 AppendToFailedDatatypesAndLogError(local_merge_result.error()); | 374 AppendToFailedDatatypesAndLogError(local_merge_result.error()); |
(...skipping 15 matching lines...) Expand all Loading... |
382 syncer::ProtocolTypes().Has(type)) { | 390 syncer::ProtocolTypes().Has(type)) { |
383 base::TimeDelta association_wait_time = | 391 base::TimeDelta association_wait_time = |
384 std::max(base::TimeDelta(), type_start_time - association_start_time_); | 392 std::max(base::TimeDelta(), type_start_time - association_start_time_); |
385 base::TimeDelta association_time = | 393 base::TimeDelta association_time = |
386 base::TimeTicks::Now() - type_start_time;; | 394 base::TimeTicks::Now() - type_start_time;; |
387 syncer::DataTypeAssociationStats stats = | 395 syncer::DataTypeAssociationStats stats = |
388 BuildAssociationStatsFromMergeResults(local_merge_result, | 396 BuildAssociationStatsFromMergeResults(local_merge_result, |
389 syncer_merge_result, | 397 syncer_merge_result, |
390 association_wait_time, | 398 association_wait_time, |
391 association_time); | 399 association_time); |
392 result_processor_->OnSingleDataTypeAssociationDone(type, stats); | 400 delegate_->OnSingleDataTypeAssociationDone(type, stats); |
393 } | 401 } |
394 | 402 |
395 // Update configuration result. | 403 // Update configuration result. |
396 if (configure_status_ == DataTypeManager::OK && | 404 if (configure_status_ == DataTypeManager::OK && |
397 start_result == DataTypeController::ASSOCIATION_FAILED) { | 405 start_result == DataTypeController::ASSOCIATION_FAILED) { |
398 configure_status_ = DataTypeManager::PARTIAL_SUCCESS; | 406 configure_status_ = DataTypeManager::PARTIAL_SUCCESS; |
399 } | 407 } |
400 if (start_result == DataTypeController::UNRECOVERABLE_ERROR) | 408 if (start_result == DataTypeController::UNRECOVERABLE_ERROR) |
401 configure_status_ = DataTypeManager::UNRECOVERABLE_ERROR; | 409 configure_status_ = DataTypeManager::UNRECOVERABLE_ERROR; |
402 | 410 |
(...skipping 30 matching lines...) Expand all Loading... |
433 DVLOG(1) << "ModelAssociationManager: setting partial success"; | 441 DVLOG(1) << "ModelAssociationManager: setting partial success"; |
434 configure_status_ = DataTypeManager::PARTIAL_SUCCESS; | 442 configure_status_ = DataTypeManager::PARTIAL_SUCCESS; |
435 } | 443 } |
436 | 444 |
437 DataTypeManager::ConfigureResult result(configure_status_, | 445 DataTypeManager::ConfigureResult result(configure_status_, |
438 requested_types_, | 446 requested_types_, |
439 failed_data_types_info_, | 447 failed_data_types_info_, |
440 associating_types_, | 448 associating_types_, |
441 needs_crypto_types_); | 449 needs_crypto_types_); |
442 | 450 |
443 // Reset state before notifying |result_processor_| because that might | 451 // Reset state before notifying |delegate_| because that might |
444 // trigger a new round of configuration. | 452 // trigger a new round of configuration. |
445 ResetForNextAssociation(); | 453 ResetForNextAssociation(); |
446 state_ = IDLE; | 454 state_ = IDLE; |
447 | 455 |
448 result_processor_->OnModelAssociationDone(result); | 456 delegate_->OnModelAssociationDone(result); |
449 } | 457 } |
450 | 458 |
451 base::OneShotTimer<ModelAssociationManager>* | 459 base::OneShotTimer<ModelAssociationManager>* |
452 ModelAssociationManager::GetTimerForTesting() { | 460 ModelAssociationManager::GetTimerForTesting() { |
453 return &timer_; | 461 return &timer_; |
454 } | 462 } |
455 | 463 |
456 } // namespace browser_sync | 464 } // namespace browser_sync |
OLD | NEW |