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 ac169ec18f4c394994c8230fffb3a2b757801138..0a3ee33f84652d2ed888411f16e4dc859cb6a99a 100644 |
| --- a/sync/engine/sync_scheduler_impl.cc |
| +++ b/sync/engine/sync_scheduler_impl.cc |
| @@ -170,6 +170,7 @@ SyncSchedulerImpl::SyncSchedulerImpl(const std::string& name, |
| no_scheduling_allowed_(false), |
| do_poll_after_credentials_updated_(false), |
| next_sync_session_job_priority_(NORMAL_PRIORITY), |
| + received_pending_retry_(false), |
| weak_ptr_factory_(this), |
| weak_ptr_factory_for_weak_handle_(this) { |
| weak_handle_this_ = MakeWeakHandle( |
| @@ -234,8 +235,7 @@ void SyncSchedulerImpl::Start(Mode mode) { |
| if (old_mode != mode_ && |
| mode_ == NORMAL_MODE && |
| - (nudge_tracker_.IsSyncRequired() || |
| - nudge_tracker_.IsRetryRequired(base::TimeTicks::Now())) && |
| + (nudge_tracker_.IsSyncRequired() || nudge_tracker_.IsRetryRequired()) && |
| CanRunNudgeJobNow(NORMAL_PRIORITY)) { |
| // We just got back to normal mode. Let's try to run the work that was |
| // queued up while we were configuring. |
| @@ -452,6 +452,9 @@ void SyncSchedulerImpl::DoNudgeSyncSessionJob(JobPriority priority) { |
| DCHECK(CalledOnValidThread()); |
| DCHECK(CanRunNudgeJobNow(priority)); |
| + // Clear pending retry flag in case it was stale. |
| + ClearReceivedGuRetryDelayFlag(); |
| + |
| DVLOG(2) << "Will run normal mode sync cycle with types " |
| << ModelTypeSetToString(session_context_->enabled_types()); |
| scoped_ptr<SyncSession> session(SyncSession::Build(session_context_, this)); |
| @@ -470,13 +473,15 @@ void SyncSchedulerImpl::DoNudgeSyncSessionJob(JobPriority priority) { |
| if (success) { |
| // That cycle took care of any outstanding work we had. |
| SDVLOG(2) << "Nudge succeeded."; |
| - nudge_tracker_.RecordSuccessfulSyncCycle(base::TimeTicks::Now()); |
| + nudge_tracker_.RecordSuccessfulSyncCycle(); |
| scheduled_nudge_time_ = base::TimeTicks(); |
| // If we're here, then we successfully reached the server. End all backoff. |
| wait_interval_.reset(); |
| NotifyRetryTime(base::Time()); |
| - return; |
| + |
| + // Set the next GU retry time, if the server requested it. |
| + ProcessReceivedGuRetryDelay(); |
|
haitaol1
2014/01/27 23:17:07
Previously retry may be scheduled even when sync f
rlarocque
2014/01/28 01:06:34
Interesting. I think that makes a few corner case
|
| } else { |
| HandleFailure(session->status_controller().model_neutral_state()); |
| } |
| @@ -580,7 +585,7 @@ void SyncSchedulerImpl::DoRetrySyncSessionJob() { |
| session.get()) && |
| !sessions::HasSyncerError( |
| session->status_controller().model_neutral_state())) { |
| - nudge_tracker_.RecordSuccessfulSyncCycle(base::TimeTicks::Now()); |
| + nudge_tracker_.RecordSuccessfulSyncCycle(); |
| } else { |
| HandleFailure(session->status_controller().model_neutral_state()); |
| } |
| @@ -687,6 +692,8 @@ void SyncSchedulerImpl::TrySyncSessionJobImpl() { |
| JobPriority priority = next_sync_session_job_priority_; |
| next_sync_session_job_priority_ = NORMAL_PRIORITY; |
| + nudge_tracker_.ToggleRetryFlagIfRequired(base::TimeTicks::Now()); |
| + |
| DCHECK(CalledOnValidThread()); |
| if (mode_ == CONFIGURATION_MODE) { |
| if (pending_configure_params_) { |
| @@ -697,7 +704,7 @@ void SyncSchedulerImpl::TrySyncSessionJobImpl() { |
| if (nudge_tracker_.IsSyncRequired()) { |
| SDVLOG(2) << "Found pending nudge job"; |
| DoNudgeSyncSessionJob(priority); |
| - } else if (nudge_tracker_.IsRetryRequired(base::TimeTicks::Now())) { |
| + } else if (nudge_tracker_.IsRetryRequired()) { |
| DoRetrySyncSessionJob(); |
| } else if (do_poll_after_credentials_updated_ || |
| ((base::TimeTicks::Now() - last_poll_reset_) >= GetPollInterval())) { |
| @@ -906,9 +913,21 @@ void SyncSchedulerImpl::OnSyncProtocolError( |
| } |
| void SyncSchedulerImpl::OnReceivedGuRetryDelay(const base::TimeDelta& delay) { |
| - nudge_tracker_.set_next_retry_time(base::TimeTicks::Now() + delay); |
| - retry_timer_.Start(FROM_HERE, delay, this, |
| - &SyncSchedulerImpl::RetryTimerCallback); |
| + // We'll deal with this after the sync cycle is complete. |
| + received_pending_retry_ = true; |
|
haitaol1
2014/01/27 23:17:07
Why change this? Previous implementation is simple
rlarocque
2014/01/28 01:06:34
Agreed, it is complicated. Pavel made similar com
|
| + pending_retry_delay_ = delay; |
| +} |
| + |
| +void SyncSchedulerImpl::ProcessReceivedGuRetryDelay() { |
| + if (received_pending_retry_) { |
| + nudge_tracker_.SetNextRetryTime(TimeTicks::Now() + pending_retry_delay_); |
| + retry_timer_.Start(FROM_HERE, pending_retry_delay_, this, |
| + &SyncSchedulerImpl::RetryTimerCallback); |
| + } |
|
pavely
2014/01/27 11:54:05
Not required for this change but I would put "rece
|
| +} |
| + |
| +void SyncSchedulerImpl::ClearReceivedGuRetryDelayFlag() { |
| + received_pending_retry_ = false; |
| } |
| void SyncSchedulerImpl::SetNotificationsEnabled(bool notifications_enabled) { |