OLD | NEW |
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 "sync/engine/sync_scheduler_impl.h" | 5 #include "sync/engine/sync_scheduler_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstring> | 8 #include <cstring> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 from_here(from_here) { | 125 from_here(from_here) { |
126 } | 126 } |
127 | 127 |
128 const char* SyncSchedulerImpl::SyncSessionJob::GetPurposeString( | 128 const char* SyncSchedulerImpl::SyncSessionJob::GetPurposeString( |
129 SyncSchedulerImpl::SyncSessionJob::SyncSessionJobPurpose purpose) { | 129 SyncSchedulerImpl::SyncSessionJob::SyncSessionJobPurpose purpose) { |
130 switch (purpose) { | 130 switch (purpose) { |
131 ENUM_CASE(UNKNOWN); | 131 ENUM_CASE(UNKNOWN); |
132 ENUM_CASE(POLL); | 132 ENUM_CASE(POLL); |
133 ENUM_CASE(NUDGE); | 133 ENUM_CASE(NUDGE); |
134 ENUM_CASE(CONFIGURATION); | 134 ENUM_CASE(CONFIGURATION); |
135 ENUM_CASE(CLEANUP_DISABLED_TYPES); | |
136 } | 135 } |
137 NOTREACHED(); | 136 NOTREACHED(); |
138 return ""; | 137 return ""; |
139 } | 138 } |
140 | 139 |
141 TimeDelta SyncSchedulerImpl::DelayProvider::GetDelay( | 140 TimeDelta SyncSchedulerImpl::DelayProvider::GetDelay( |
142 const base::TimeDelta& last_delay) { | 141 const base::TimeDelta& last_delay) { |
143 return SyncSchedulerImpl::GetRecommendedDelay(last_delay); | 142 return SyncSchedulerImpl::GetRecommendedDelay(last_delay); |
144 } | 143 } |
145 | 144 |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 // crbug.com/133030 | 346 // crbug.com/133030 |
348 ModelSafeRoutingInfo restricted_routes; | 347 ModelSafeRoutingInfo restricted_routes; |
349 std::vector<ModelSafeWorker*> restricted_workers; | 348 std::vector<ModelSafeWorker*> restricted_workers; |
350 BuildModelSafeParams(params.types_to_download, | 349 BuildModelSafeParams(params.types_to_download, |
351 params.routing_info, | 350 params.routing_info, |
352 session_context_->workers(), | 351 session_context_->workers(), |
353 &restricted_routes, | 352 &restricted_routes, |
354 &restricted_workers); | 353 &restricted_workers); |
355 session_context_->set_routing_info(params.routing_info); | 354 session_context_->set_routing_info(params.routing_info); |
356 | 355 |
357 // We rely on this not failing, so don't need to worry about checking for | |
358 // success. In addition, this will be removed as part of crbug.com/131433. | |
359 SyncSessionJob cleanup_job( | |
360 SyncSessionJob::CLEANUP_DISABLED_TYPES, | |
361 TimeTicks::Now(), | |
362 make_linked_ptr(CreateSyncSession(SyncSourceInfo())), | |
363 false, | |
364 ConfigurationParams(), | |
365 FROM_HERE); | |
366 DoSyncSessionJob(cleanup_job); | |
367 | |
368 if (params.keystore_key_status == ConfigurationParams::KEYSTORE_KEY_NEEDED) { | 356 if (params.keystore_key_status == ConfigurationParams::KEYSTORE_KEY_NEEDED) { |
369 // TODO(zea): implement in such a way that we can handle failures and the | 357 // TODO(zea): implement in such a way that we can handle failures and the |
370 // subsequent retrys the scheduler might perform. See crbug.com/129665. | 358 // subsequent retrys the scheduler might perform. See crbug.com/129665. |
371 NOTIMPLEMENTED(); | 359 NOTIMPLEMENTED(); |
372 } | 360 } |
373 | 361 |
374 // Only reconfigure if we have types to download. | 362 // Only reconfigure if we have types to download. |
375 if (!params.types_to_download.Empty()) { | 363 if (!params.types_to_download.Empty()) { |
376 DCHECK(!restricted_routes.empty()); | 364 DCHECK(!restricted_routes.empty()); |
377 linked_ptr<SyncSession> session(new SyncSession( | 365 linked_ptr<SyncSession> session(new SyncSession( |
(...skipping 26 matching lines...) Expand all Loading... |
404 } | 392 } |
405 | 393 |
406 return true; | 394 return true; |
407 } | 395 } |
408 | 396 |
409 SyncSchedulerImpl::JobProcessDecision | 397 SyncSchedulerImpl::JobProcessDecision |
410 SyncSchedulerImpl::DecideWhileInWaitInterval( | 398 SyncSchedulerImpl::DecideWhileInWaitInterval( |
411 const SyncSessionJob& job) { | 399 const SyncSessionJob& job) { |
412 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 400 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
413 DCHECK(wait_interval_.get()); | 401 DCHECK(wait_interval_.get()); |
414 DCHECK_NE(job.purpose, SyncSessionJob::CLEANUP_DISABLED_TYPES); | |
415 | 402 |
416 SDVLOG(2) << "DecideWhileInWaitInterval with WaitInterval mode " | 403 SDVLOG(2) << "DecideWhileInWaitInterval with WaitInterval mode " |
417 << WaitInterval::GetModeString(wait_interval_->mode) | 404 << WaitInterval::GetModeString(wait_interval_->mode) |
418 << (wait_interval_->had_nudge ? " (had nudge)" : "") | 405 << (wait_interval_->had_nudge ? " (had nudge)" : "") |
419 << (job.is_canary_job ? " (canary)" : ""); | 406 << (job.is_canary_job ? " (canary)" : ""); |
420 | 407 |
421 if (job.purpose == SyncSessionJob::POLL) | 408 if (job.purpose == SyncSessionJob::POLL) |
422 return DROP; | 409 return DROP; |
423 | 410 |
424 DCHECK(job.purpose == SyncSessionJob::NUDGE || | 411 DCHECK(job.purpose == SyncSessionJob::NUDGE || |
(...skipping 12 matching lines...) Expand all Loading... |
437 return wait_interval_->had_nudge ? DROP : CONTINUE; | 424 return wait_interval_->had_nudge ? DROP : CONTINUE; |
438 else // We are here because timer ran out. So retry. | 425 else // We are here because timer ran out. So retry. |
439 return CONTINUE; | 426 return CONTINUE; |
440 } | 427 } |
441 return job.is_canary_job ? CONTINUE : SAVE; | 428 return job.is_canary_job ? CONTINUE : SAVE; |
442 } | 429 } |
443 | 430 |
444 SyncSchedulerImpl::JobProcessDecision SyncSchedulerImpl::DecideOnJob( | 431 SyncSchedulerImpl::JobProcessDecision SyncSchedulerImpl::DecideOnJob( |
445 const SyncSessionJob& job) { | 432 const SyncSessionJob& job) { |
446 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 433 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
447 if (job.purpose == SyncSessionJob::CLEANUP_DISABLED_TYPES) | |
448 return CONTINUE; | |
449 | 434 |
450 // See if our type is throttled. | 435 // See if our type is throttled. |
451 ModelTypeSet throttled_types = | 436 ModelTypeSet throttled_types = |
452 session_context_->throttled_data_type_tracker()->GetThrottledTypes(); | 437 session_context_->throttled_data_type_tracker()->GetThrottledTypes(); |
453 if (job.purpose == SyncSessionJob::NUDGE && | 438 if (job.purpose == SyncSessionJob::NUDGE && |
454 job.session->source().updates_source == GetUpdatesCallerInfo::LOCAL) { | 439 job.session->source().updates_source == GetUpdatesCallerInfo::LOCAL) { |
455 ModelTypeSet requested_types; | 440 ModelTypeSet requested_types; |
456 for (ModelTypePayloadMap::const_iterator i = | 441 for (ModelTypePayloadMap::const_iterator i = |
457 job.session->source().types.begin(); | 442 job.session->source().types.begin(); |
458 i != job.session->source().types.end(); | 443 i != job.session->source().types.end(); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 | 517 |
533 DCHECK(job.purpose == SyncSessionJob::NUDGE || job.purpose == | 518 DCHECK(job.purpose == SyncSessionJob::NUDGE || job.purpose == |
534 SyncSessionJob::CONFIGURATION); | 519 SyncSessionJob::CONFIGURATION); |
535 | 520 |
536 SaveJob(job); | 521 SaveJob(job); |
537 return false; | 522 return false; |
538 } | 523 } |
539 | 524 |
540 void SyncSchedulerImpl::SaveJob(const SyncSessionJob& job) { | 525 void SyncSchedulerImpl::SaveJob(const SyncSessionJob& job) { |
541 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 526 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
542 // TODO(sync): Should we also check that job.purpose != | |
543 // CLEANUP_DISABLED_TYPES? (See http://crbug.com/90868.) | |
544 if (job.purpose == SyncSessionJob::NUDGE) { | 527 if (job.purpose == SyncSessionJob::NUDGE) { |
545 SDVLOG(2) << "Saving a nudge job"; | 528 SDVLOG(2) << "Saving a nudge job"; |
546 InitOrCoalescePendingJob(job); | 529 InitOrCoalescePendingJob(job); |
547 } else if (job.purpose == SyncSessionJob::CONFIGURATION){ | 530 } else if (job.purpose == SyncSessionJob::CONFIGURATION){ |
548 SDVLOG(2) << "Saving a configuration job"; | 531 SDVLOG(2) << "Saving a configuration job"; |
549 DCHECK(wait_interval_.get()); | 532 DCHECK(wait_interval_.get()); |
550 DCHECK(mode_ == CONFIGURATION_MODE); | 533 DCHECK(mode_ == CONFIGURATION_MODE); |
551 | 534 |
552 // Config params should always get set. | 535 // Config params should always get set. |
553 DCHECK(!job.config_params.ready_task.is_null()); | 536 DCHECK(!job.config_params.ready_task.is_null()); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 switch (purpose) { | 673 switch (purpose) { |
691 case SyncSessionJob::CONFIGURATION: | 674 case SyncSessionJob::CONFIGURATION: |
692 *start = DOWNLOAD_UPDATES; | 675 *start = DOWNLOAD_UPDATES; |
693 *end = APPLY_UPDATES; | 676 *end = APPLY_UPDATES; |
694 return; | 677 return; |
695 case SyncSessionJob::NUDGE: | 678 case SyncSessionJob::NUDGE: |
696 case SyncSessionJob::POLL: | 679 case SyncSessionJob::POLL: |
697 *start = SYNCER_BEGIN; | 680 *start = SYNCER_BEGIN; |
698 *end = SYNCER_END; | 681 *end = SYNCER_END; |
699 return; | 682 return; |
700 case SyncSessionJob::CLEANUP_DISABLED_TYPES: | |
701 *start = CLEANUP_DISABLED_TYPES; | |
702 *end = CLEANUP_DISABLED_TYPES; | |
703 return; | |
704 default: | 683 default: |
705 NOTREACHED(); | 684 NOTREACHED(); |
706 *start = SYNCER_END; | 685 *start = SYNCER_END; |
707 *end = SYNCER_END; | 686 *end = SYNCER_END; |
708 return; | 687 return; |
709 } | 688 } |
710 } | 689 } |
711 | 690 |
712 void SyncSchedulerImpl::PostTask( | 691 void SyncSchedulerImpl::PostTask( |
713 const tracked_objects::Location& from_here, | 692 const tracked_objects::Location& from_here, |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 syncer_->SyncShare(job.session.get(), begin, end); | 777 syncer_->SyncShare(job.session.get(), begin, end); |
799 has_more_to_sync = job.session->HasMoreToSync(); | 778 has_more_to_sync = job.session->HasMoreToSync(); |
800 if (has_more_to_sync) | 779 if (has_more_to_sync) |
801 job.session->PrepareForAnotherSyncCycle(); | 780 job.session->PrepareForAnotherSyncCycle(); |
802 } | 781 } |
803 SDVLOG(2) << "Done SyncShare looping."; | 782 SDVLOG(2) << "Done SyncShare looping."; |
804 | 783 |
805 FinishSyncSessionJob(job); | 784 FinishSyncSessionJob(job); |
806 } | 785 } |
807 | 786 |
808 void SyncSchedulerImpl::UpdateCarryoverSessionState( | |
809 const SyncSessionJob& old_job) { | |
810 DCHECK_EQ(MessageLoop::current(), sync_loop_); | |
811 if (old_job.purpose == SyncSessionJob::CONFIGURATION) { | |
812 // Whatever types were part of a configuration task will have had updates | |
813 // downloaded. For that reason, we make sure they get recorded in the | |
814 // event that they get disabled at a later time. | |
815 ModelSafeRoutingInfo r(session_context_->previous_session_routing_info()); | |
816 if (!r.empty()) { | |
817 ModelSafeRoutingInfo temp_r; | |
818 ModelSafeRoutingInfo old_info(old_job.session->routing_info()); | |
819 std::set_union(r.begin(), r.end(), old_info.begin(), old_info.end(), | |
820 std::insert_iterator<ModelSafeRoutingInfo>(temp_r, temp_r.begin())); | |
821 session_context_->set_previous_session_routing_info(temp_r); | |
822 } | |
823 } else { | |
824 session_context_->set_previous_session_routing_info( | |
825 old_job.session->routing_info()); | |
826 } | |
827 } | |
828 | |
829 void SyncSchedulerImpl::FinishSyncSessionJob(const SyncSessionJob& job) { | 787 void SyncSchedulerImpl::FinishSyncSessionJob(const SyncSessionJob& job) { |
830 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 788 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
831 // Update timing information for how often datatypes are triggering nudges. | 789 // Update timing information for how often datatypes are triggering nudges. |
832 base::TimeTicks now = TimeTicks::Now(); | 790 base::TimeTicks now = TimeTicks::Now(); |
833 if (!last_sync_session_end_time_.is_null()) { | 791 if (!last_sync_session_end_time_.is_null()) { |
834 ModelTypePayloadMap::const_iterator iter; | 792 ModelTypePayloadMap::const_iterator iter; |
835 for (iter = job.session->source().types.begin(); | 793 for (iter = job.session->source().types.begin(); |
836 iter != job.session->source().types.end(); | 794 iter != job.session->source().types.end(); |
837 ++iter) { | 795 ++iter) { |
838 #define PER_DATA_TYPE_MACRO(type_str) \ | 796 #define PER_DATA_TYPE_MACRO(type_str) \ |
839 SYNC_FREQ_HISTOGRAM("Sync.Freq" type_str, \ | 797 SYNC_FREQ_HISTOGRAM("Sync.Freq" type_str, \ |
840 now - last_sync_session_end_time_); | 798 now - last_sync_session_end_time_); |
841 SYNC_DATA_TYPE_HISTOGRAM(iter->first); | 799 SYNC_DATA_TYPE_HISTOGRAM(iter->first); |
842 #undef PER_DATA_TYPE_MACRO | 800 #undef PER_DATA_TYPE_MACRO |
843 } | 801 } |
844 } | 802 } |
845 last_sync_session_end_time_ = now; | 803 last_sync_session_end_time_ = now; |
846 | 804 |
847 // Now update the status of the connection from SCM. We need this to decide | 805 // Now update the status of the connection from SCM. We need this to decide |
848 // whether we need to save/run future jobs. The notifications from SCM are not | 806 // whether we need to save/run future jobs. The notifications from SCM are not |
849 // reliable. | 807 // reliable. |
850 // | 808 // |
851 // TODO(rlarocque): crbug.com/110954 | 809 // TODO(rlarocque): crbug.com/110954 |
852 // We should get rid of the notifications and it is probably not needed to | 810 // We should get rid of the notifications and it is probably not needed to |
853 // maintain this status variable in 2 places. We should query it directly from | 811 // maintain this status variable in 2 places. We should query it directly from |
854 // SCM when needed. | 812 // SCM when needed. |
855 ServerConnectionManager* scm = session_context_->connection_manager(); | 813 ServerConnectionManager* scm = session_context_->connection_manager(); |
856 UpdateServerConnectionManagerStatus(scm->server_status()); | 814 UpdateServerConnectionManagerStatus(scm->server_status()); |
857 | 815 |
858 UpdateCarryoverSessionState(job); | |
859 if (IsSyncingCurrentlySilenced()) { | 816 if (IsSyncingCurrentlySilenced()) { |
860 SDVLOG(2) << "We are currently throttled; not scheduling the next sync."; | 817 SDVLOG(2) << "We are currently throttled; not scheduling the next sync."; |
861 // TODO(sync): Investigate whether we need to check job.purpose | 818 // TODO(sync): Investigate whether we need to check job.purpose |
862 // here; see DCHECKs in SaveJob(). (See http://crbug.com/90868.) | 819 // here; see DCHECKs in SaveJob(). (See http://crbug.com/90868.) |
863 SaveJob(job); | 820 SaveJob(job); |
864 return; // Nothing to do. | 821 return; // Nothing to do. |
865 } else if (job.session->Succeeded() && | 822 } else if (job.session->Succeeded() && |
866 !job.config_params.ready_task.is_null()) { | 823 !job.config_params.ready_task.is_null()) { |
867 // If this was a configuration job with a ready task, invoke it now that | 824 // If this was a configuration job with a ready task, invoke it now that |
868 // we finished successfully. | 825 // we finished successfully. |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1199 | 1156 |
1200 #undef SDVLOG_LOC | 1157 #undef SDVLOG_LOC |
1201 | 1158 |
1202 #undef SDVLOG | 1159 #undef SDVLOG |
1203 | 1160 |
1204 #undef SLOG | 1161 #undef SLOG |
1205 | 1162 |
1206 #undef ENUM_CASE | 1163 #undef ENUM_CASE |
1207 | 1164 |
1208 } // namespace syncer | 1165 } // namespace syncer |
OLD | NEW |