Chromium Code Reviews| Index: sync/engine/sync_scheduler_impl.cc |
| diff --git a/sync/engine/sync_scheduler_impl.cc b/sync/engine/sync_scheduler_impl.cc |
| index 974ed27e4ee9a9e45f7228e6b31afb6ce4b374da..1561550094fcb164309ebf0f818568bfcbe32e93 100644 |
| --- a/sync/engine/sync_scheduler_impl.cc |
| +++ b/sync/engine/sync_scheduler_impl.cc |
| @@ -32,6 +32,26 @@ using sync_pb::GetUpdatesCallerInfo; |
| namespace { |
| +// Delays for syncer nudges. |
| +const int kDefaultNudgeDelayMilliseconds = 200; |
| +const int kSlowNudgeDelayMilliseconds = 2000; |
| +const int kDefaultSessionsCommitDelaySeconds = 10; |
| +const int kSyncRefreshDelayMsec = 500; |
| +const int kSyncSchedulerDelayMsec = 250; |
| + |
| +bool IsConfigRelatedUpdateSourceValue( |
| + GetUpdatesCallerInfo::GetUpdatesSource source) { |
| + switch (source) { |
| + case GetUpdatesCallerInfo::RECONFIGURATION: |
| + case GetUpdatesCallerInfo::MIGRATION: |
| + case GetUpdatesCallerInfo::NEW_CLIENT: |
| + case GetUpdatesCallerInfo::NEWLY_SUPPORTED_DATATYPE: |
| + return true; |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| bool ShouldRequestEarlyExit(const SyncProtocolError& error) { |
| switch (error.error_type) { |
| case SYNC_SUCCESS: |
| @@ -65,6 +85,30 @@ bool IsActionableError( |
| const SyncProtocolError& error) { |
| return (error.action != UNKNOWN_ACTION); |
| } |
| + |
| +TimeDelta GetDefaultDelayForType(ModelType model_type, |
| + TimeDelta minimum_delay) { |
| + switch (model_type) { |
| + case AUTOFILL: |
| + // Accompany types rely on nudges from other types, and hence have long |
| + // nudge delays. |
| + return TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds); |
| + case BOOKMARKS: |
| + case PREFERENCES: |
| + // Types with sometimes automatic changes get longer delays to allow more |
| + // coalescing. |
| + return TimeDelta::FromMilliseconds(kSlowNudgeDelayMilliseconds); |
| + case SESSIONS: |
| + case FAVICON_IMAGES: |
| + case FAVICON_TRACKING: |
| + // Types with navigation triggered changes get longer delays to allow more |
| + // coalescing. |
| + return TimeDelta::FromSeconds(kDefaultSessionsCommitDelaySeconds); |
| + default: |
| + return minimum_delay; |
| + } |
| +} |
| + |
| } // namespace |
| ConfigurationParams::ConfigurationParams() |
| @@ -132,25 +176,6 @@ GetUpdatesCallerInfo::GetUpdatesSource GetUpdatesFromNudgeSource( |
| #define SDVLOG_LOC(from_here, verbose_level) \ |
| DVLOG_LOC(from_here, verbose_level) << name_ << ": " |
| -namespace { |
| - |
| -const int kDefaultSessionsCommitDelaySeconds = 10; |
| - |
| -bool IsConfigRelatedUpdateSourceValue( |
| - GetUpdatesCallerInfo::GetUpdatesSource source) { |
| - switch (source) { |
| - case GetUpdatesCallerInfo::RECONFIGURATION: |
| - case GetUpdatesCallerInfo::MIGRATION: |
| - case GetUpdatesCallerInfo::NEW_CLIENT: |
| - case GetUpdatesCallerInfo::NEWLY_SUPPORTED_DATATYPE: |
| - return true; |
| - default: |
| - return false; |
| - } |
| -} |
| - |
| -} // namespace |
| - |
| SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name, |
| BackoffDelayProvider* delay_provider, |
| sessions::SyncSessionContext* context, |
| @@ -161,8 +186,7 @@ SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name, |
| TimeDelta::FromSeconds(kDefaultShortPollIntervalSeconds)), |
| syncer_long_poll_interval_seconds_( |
| TimeDelta::FromSeconds(kDefaultLongPollIntervalSeconds)), |
| - sessions_commit_delay_( |
| - TimeDelta::FromSeconds(kDefaultSessionsCommitDelaySeconds)), |
| + minimum_nudge_delay_ms_(kDefaultNudgeDelayMilliseconds), |
| mode_(NORMAL_MODE), |
| delay_provider_(delay_provider), |
| syncer_(syncer), |
| @@ -174,6 +198,12 @@ SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name, |
| weak_ptr_factory_for_weak_handle_(this) { |
| weak_handle_this_ = MakeWeakHandle( |
| weak_ptr_factory_for_weak_handle_.GetWeakPtr()); |
| + ModelTypeSet protocol_types = ProtocolTypes(); |
| + for (ModelTypeSet::Iterator iter = protocol_types.First(); |
| + iter.Good(); iter.Inc()) { |
| + nudge_delays_[iter.Get()] = GetDefaultDelayForType( |
| + iter.Get(), TimeDelta::FromMilliseconds(minimum_nudge_delay_ms_)); |
| + } |
| } |
| SyncSchedulerImpl::~SyncSchedulerImpl() { |
| @@ -356,7 +386,6 @@ bool SyncSchedulerImpl::CanRunNudgeJobNow(JobPriority priority) { |
| } |
| void SyncSchedulerImpl::ScheduleLocalNudge( |
| - const TimeDelta& desired_delay, |
| ModelTypeSet types, |
| const tracked_objects::Location& nudge_location) { |
| DCHECK(CalledOnValidThread()); |
| @@ -367,11 +396,10 @@ void SyncSchedulerImpl::ScheduleLocalNudge( |
| << ModelTypeSetToString(types); |
| UpdateNudgeTimeRecords(types); |
| nudge_tracker_.RecordLocalChange(types); |
| - ScheduleNudgeImpl(desired_delay, nudge_location); |
| + ScheduleNudgeImpl(GetNudgeDelayForTypes(types), nudge_location); |
| } |
| void SyncSchedulerImpl::ScheduleLocalRefreshRequest( |
| - const TimeDelta& desired_delay, |
| ModelTypeSet types, |
| const tracked_objects::Location& nudge_location) { |
| DCHECK(CalledOnValidThread()); |
| @@ -381,11 +409,11 @@ void SyncSchedulerImpl::ScheduleLocalRefreshRequest( |
| << "Scheduling sync because of local refresh request for " |
| << ModelTypeSetToString(types); |
| nudge_tracker_.RecordLocalRefreshRequest(types); |
| - ScheduleNudgeImpl(desired_delay, nudge_location); |
| + ScheduleNudgeImpl(base::TimeDelta::FromMilliseconds(kSyncRefreshDelayMsec), |
| + nudge_location); |
| } |
| void SyncSchedulerImpl::ScheduleInvalidationNudge( |
| - const TimeDelta& desired_delay, |
| syncer::ModelType model_type, |
| scoped_ptr<InvalidationInterface> invalidation, |
| const tracked_objects::Location& nudge_location) { |
| @@ -395,7 +423,8 @@ void SyncSchedulerImpl::ScheduleInvalidationNudge( |
| << "Scheduling sync because we received invalidation for " |
| << ModelTypeToString(model_type); |
| nudge_tracker_.RecordRemoteInvalidation(model_type, invalidation.Pass()); |
| - ScheduleNudgeImpl(desired_delay, nudge_location); |
| + ScheduleNudgeImpl(base::TimeDelta::FromMilliseconds(kSyncSchedulerDelayMsec), |
| + nudge_location); |
| } |
| void SyncSchedulerImpl::ScheduleInitialSyncNudge(syncer::ModelType model_type) { |
| @@ -461,6 +490,16 @@ const char* SyncSchedulerImpl::GetModeString(SyncScheduler::Mode mode) { |
| return ""; |
| } |
| +void SyncSchedulerImpl::SetDefaultNudgeDelay(int delay_ms) { |
| + minimum_nudge_delay_ms_ = delay_ms; |
| + ModelTypeSet protocol_types = syncer::ProtocolTypes(); |
| + for (ModelTypeSet::Iterator iter = protocol_types.First(); iter.Good(); |
| + iter.Inc()) { |
| + nudge_delays_[iter.Get()] = GetDefaultDelayForType( |
| + iter.Get(), TimeDelta::FromMilliseconds(minimum_nudge_delay_ms_)); |
| + } |
| +} |
| + |
| void SyncSchedulerImpl::DoNudgeSyncSessionJob(JobPriority priority) { |
| DCHECK(CalledOnValidThread()); |
| DCHECK(CanRunNudgeJobNow(priority)); |
| @@ -819,6 +858,22 @@ bool SyncSchedulerImpl::IsBackingOff() const { |
| WaitInterval::EXPONENTIAL_BACKOFF; |
| } |
| +TimeDelta SyncSchedulerImpl::GetNudgeDelayForTypes(ModelTypeSet types) const { |
| + // Start with the longest delay. |
| + TimeDelta delay = |
| + TimeDelta::FromMilliseconds(kDefaultShortPollIntervalSeconds); |
| + // Take the shorted delay from all requested types. |
|
rlarocque
2014/08/20 00:13:31
shortest?
Nicolas Zea
2014/08/20 22:49:43
Done.
|
| + for (ModelTypeSet::Iterator iter = types.First(); iter.Good(); iter.Inc()) { |
| + std::map<ModelType, TimeDelta>::const_iterator delay_iter = |
| + nudge_delays_.find(iter.Get()); |
| + if (delay_iter != nudge_delays_.end() && |
| + delay_iter->second < delay) { |
| + delay = delay_iter->second; |
| + } |
| + } |
| + return delay; |
| +} |
| + |
| void SyncSchedulerImpl::OnThrottled(const base::TimeDelta& throttle_duration) { |
| DCHECK(CalledOnValidThread()); |
| wait_interval_.reset(new WaitInterval(WaitInterval::THROTTLED, |
| @@ -862,10 +917,22 @@ void SyncSchedulerImpl::OnReceivedLongPollIntervalUpdate( |
| syncer_long_poll_interval_seconds_ = new_interval; |
| } |
| -void SyncSchedulerImpl::OnReceivedSessionsCommitDelay( |
| - const base::TimeDelta& new_delay) { |
| +void SyncSchedulerImpl::OnReceivedCustomNudgeDelays( |
| + const std::map<ModelType, int>& nudge_delays) { |
|
rlarocque
2014/08/20 00:13:31
I'd prefer it if this parameter were a map<ModelTy
Nicolas Zea
2014/08/20 22:49:43
Done.
|
| DCHECK(CalledOnValidThread()); |
| - sessions_commit_delay_ = new_delay; |
| + for (std::map<ModelType, int>::const_iterator iter = nudge_delays.begin(); |
| + iter != nudge_delays.end(); ++iter) { |
| + // Only accept delays that are longer or equal to the minimum delay. |
| + // Otherwise reset to default for that type. This provides a way for the |
| + // server to "unset" a custom nudge delay by assigning a 0 value to it. |
| + if (iter->second >= minimum_nudge_delay_ms_) { |
| + nudge_delays_[iter->first] = TimeDelta::FromMilliseconds(iter->second); |
| + } else { |
| + nudge_delays_[iter->first] = GetDefaultDelayForType( |
| + iter->first, |
| + base::TimeDelta::FromMilliseconds(minimum_nudge_delay_ms_)); |
| + } |
| + } |
| } |
| void SyncSchedulerImpl::OnReceivedClientInvalidationHintBufferSize(int size) { |
| @@ -911,11 +978,6 @@ void SyncSchedulerImpl::SetNotificationsEnabled(bool notifications_enabled) { |
| nudge_tracker_.OnInvalidationsDisabled(); |
| } |
| -base::TimeDelta SyncSchedulerImpl::GetSessionsCommitDelay() const { |
| - DCHECK(CalledOnValidThread()); |
| - return sessions_commit_delay_; |
| -} |
| - |
| #undef SDVLOG_LOC |
| #undef SDVLOG |