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

Side by Side Diff: components/sync/engine_impl/sync_manager_impl.cc

Issue 2563883006: [Sync] Separate purge types step from sync manager configuration. (Closed)
Patch Set: Created 4 years 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/engine_impl/sync_manager_impl.h" 5 #include "components/sync/engine_impl/sync_manager_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 177
178 if (marker.token().empty()) 178 if (marker.token().empty())
179 result.Put(i.Get()); 179 result.Put(i.Get());
180 } 180 }
181 return result; 181 return result;
182 } 182 }
183 183
184 void SyncManagerImpl::ConfigureSyncer( 184 void SyncManagerImpl::ConfigureSyncer(
185 ConfigureReason reason, 185 ConfigureReason reason,
186 ModelTypeSet to_download, 186 ModelTypeSet to_download,
187 ModelTypeSet to_purge,
188 ModelTypeSet to_journal,
189 ModelTypeSet to_unapply,
190 const ModelSafeRoutingInfo& new_routing_info, 187 const ModelSafeRoutingInfo& new_routing_info,
191 const base::Closure& ready_task, 188 const base::Closure& ready_task,
192 const base::Closure& retry_task) { 189 const base::Closure& retry_task) {
193 DCHECK(thread_checker_.CalledOnValidThread()); 190 DCHECK(thread_checker_.CalledOnValidThread());
194 DCHECK(!ready_task.is_null()); 191 DCHECK(!ready_task.is_null());
195 DCHECK(initialized_); 192 DCHECK(initialized_);
196 193
197 // Don't download non-blocking types that have already completed initial sync. 194 // Don't download non-blocking types that have already completed initial sync.
198 to_download.RemoveAll( 195 to_download.RemoveAll(
199 model_type_registry_->GetInitialSyncDoneNonBlockingTypes()); 196 model_type_registry_->GetInitialSyncDoneNonBlockingTypes());
200 197
201 DVLOG(1) << "Configuring -" 198 DVLOG(1) << "Configuring -"
202 << "\n\t" 199 << "\n\t"
203 << "current types: " 200 << "current types: "
204 << ModelTypeSetToString(GetRoutingInfoTypes(new_routing_info)) 201 << ModelTypeSetToString(GetRoutingInfoTypes(new_routing_info))
205 << "\n\t" 202 << "\n\t"
206 << "types to download: " << ModelTypeSetToString(to_download) 203 << "types to download: " << ModelTypeSetToString(to_download);
207 << "\n\t"
208 << "types to purge: " << ModelTypeSetToString(to_purge) << "\n\t"
209 << "types to journal: " << ModelTypeSetToString(to_journal) << "\n\t"
210 << "types to unapply: " << ModelTypeSetToString(to_unapply);
211 if (!PurgeDisabledTypes(to_purge, to_journal, to_unapply)) {
212 // We failed to cleanup the types. Invoke the ready task without actually
213 // configuring any types. The caller should detect this as a configuration
214 // failure and act appropriately.
215 ready_task.Run();
216 return;
217 }
218
219 ConfigurationParams params(GetSourceFromReason(reason), to_download, 204 ConfigurationParams params(GetSourceFromReason(reason), to_download,
220 new_routing_info, ready_task, retry_task); 205 new_routing_info, ready_task, retry_task);
221 206
222 scheduler_->Start(SyncScheduler::CONFIGURATION_MODE, base::Time()); 207 scheduler_->Start(SyncScheduler::CONFIGURATION_MODE, base::Time());
223 scheduler_->ScheduleConfiguration(params); 208 scheduler_->ScheduleConfiguration(params);
224 } 209 }
225 210
226 void SyncManagerImpl::Init(InitArgs* args) { 211 void SyncManagerImpl::Init(InitArgs* args) {
227 CHECK(!initialized_); 212 CHECK(!initialized_);
228 DCHECK(thread_checker_.CalledOnValidThread()); 213 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 // re-downloaded during any configuration. But, it's possible for a datatype 438 // re-downloaded during any configuration. But, it's possible for a datatype
454 // to have a progress marker but not have initial sync ended yet, making 439 // to have a progress marker but not have initial sync ended yet, making
455 // it a candidate for migration. This is a problem, as the DataTypeManager 440 // it a candidate for migration. This is a problem, as the DataTypeManager
456 // does not support a migration while it's already in the middle of a 441 // does not support a migration while it's already in the middle of a
457 // configuration. As a result, any partially synced datatype can stall the 442 // configuration. As a result, any partially synced datatype can stall the
458 // DTM, waiting for the configuration to complete, which it never will due 443 // DTM, waiting for the configuration to complete, which it never will due
459 // to the migration error. In addition, a partially synced nigori will 444 // to the migration error. In addition, a partially synced nigori will
460 // trigger the migration logic before the backend is initialized, resulting 445 // trigger the migration logic before the backend is initialized, resulting
461 // in crashes. We therefore detect and purge any partially synced types as 446 // in crashes. We therefore detect and purge any partially synced types as
462 // part of initialization. 447 // part of initialization.
463 if (!PurgePartiallySyncedTypes()) 448 PurgePartiallySyncedTypes();
464 return false;
465
466 return true; 449 return true;
467 } 450 }
468 451
469 bool SyncManagerImpl::PurgePartiallySyncedTypes() { 452 void SyncManagerImpl::PurgePartiallySyncedTypes() {
470 ModelTypeSet partially_synced_types = ModelTypeSet::All(); 453 ModelTypeSet partially_synced_types = ModelTypeSet::All();
471 partially_synced_types.RemoveAll(directory()->InitialSyncEndedTypes()); 454 partially_synced_types.RemoveAll(directory()->InitialSyncEndedTypes());
472 partially_synced_types.RemoveAll( 455 partially_synced_types.RemoveAll(
473 GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All())); 456 GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All()));
474 457
475 DVLOG(1) << "Purging partially synced types " 458 DVLOG(1) << "Purging partially synced types "
476 << ModelTypeSetToString(partially_synced_types); 459 << ModelTypeSetToString(partially_synced_types);
477 UMA_HISTOGRAM_COUNTS("Sync.PartiallySyncedTypes", 460 UMA_HISTOGRAM_COUNTS("Sync.PartiallySyncedTypes",
478 partially_synced_types.Size()); 461 partially_synced_types.Size());
479 if (partially_synced_types.Empty()) 462 directory()->PurgeEntriesWithTypeIn(partially_synced_types, ModelTypeSet(),
480 return true; 463 ModelTypeSet());
481 return directory()->PurgeEntriesWithTypeIn(partially_synced_types,
482 ModelTypeSet(), ModelTypeSet());
483 } 464 }
484 465
485 bool SyncManagerImpl::PurgeDisabledTypes(ModelTypeSet to_purge, 466 void SyncManagerImpl::PurgeDisabledTypes(ModelTypeSet to_purge,
486 ModelTypeSet to_journal, 467 ModelTypeSet to_journal,
487 ModelTypeSet to_unapply) { 468 ModelTypeSet to_unapply) {
488 if (to_purge.Empty()) 469 DCHECK(thread_checker_.CalledOnValidThread());
489 return true; 470 DCHECK(initialized_);
490 DVLOG(1) << "Purging disabled types " << ModelTypeSetToString(to_purge); 471 DVLOG(1) << "Purging disabled types:\n\t"
472 << "types to purge: " << ModelTypeSetToString(to_purge) << "\n\t"
473 << "types to journal: " << ModelTypeSetToString(to_journal) << "\n\t"
474 << "types to unapply: " << ModelTypeSetToString(to_unapply);
491 DCHECK(to_purge.HasAll(to_journal)); 475 DCHECK(to_purge.HasAll(to_journal));
492 DCHECK(to_purge.HasAll(to_unapply)); 476 DCHECK(to_purge.HasAll(to_unapply));
493 return directory()->PurgeEntriesWithTypeIn(to_purge, to_journal, to_unapply); 477 directory()->PurgeEntriesWithTypeIn(to_purge, to_journal, to_unapply);
494 } 478 }
495 479
496 void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) { 480 void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) {
497 DCHECK(thread_checker_.CalledOnValidThread()); 481 DCHECK(thread_checker_.CalledOnValidThread());
498 DCHECK(initialized_); 482 DCHECK(initialized_);
499 DCHECK(!credentials.account_id.empty()); 483 DCHECK(!credentials.account_id.empty());
500 DCHECK(!credentials.sync_token.empty()); 484 DCHECK(!credentials.sync_token.empty());
501 DCHECK(!credentials.scope_set.empty()); 485 DCHECK(!credentials.scope_set.empty());
502 cycle_context_->set_account_name(credentials.email); 486 cycle_context_->set_account_name(credentials.email);
503 487
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 DCHECK(thread_checker_.CalledOnValidThread()); 1006 DCHECK(thread_checker_.CalledOnValidThread());
1023 cycle_context_->set_cookie_jar_mismatch(account_mismatch); 1007 cycle_context_->set_cookie_jar_mismatch(account_mismatch);
1024 cycle_context_->set_cookie_jar_empty(empty_jar); 1008 cycle_context_->set_cookie_jar_empty(empty_jar);
1025 } 1009 }
1026 1010
1027 void SyncManagerImpl::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) { 1011 void SyncManagerImpl::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) {
1028 directory()->OnMemoryDump(pmd); 1012 directory()->OnMemoryDump(pmd);
1029 } 1013 }
1030 1014
1031 } // namespace syncer 1015 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/engine_impl/sync_manager_impl.h ('k') | components/sync/engine_impl/sync_manager_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698