Chromium Code Reviews| Index: components/sync/engine_impl/sync_scheduler_impl.cc |
| diff --git a/components/sync/engine_impl/sync_scheduler_impl.cc b/components/sync/engine_impl/sync_scheduler_impl.cc |
| index d9d72533754ab6518a7f42bb63b25b7d3a7f23e3..eff39da742ef884a771bda9a4f51c3a8bab0dccd 100644 |
| --- a/components/sync/engine_impl/sync_scheduler_impl.cc |
| +++ b/components/sync/engine_impl/sync_scheduler_impl.cc |
| @@ -639,6 +639,12 @@ void SyncSchedulerImpl::RestartWaiting() { |
| // Per-datatype throttled or backed off. |
| TimeDelta time_until_next_unblock = |
| nudge_tracker_.GetTimeUntilNextUnblock(); |
| + TimeTicks incoming_run_time = TimeTicks::Now() + time_until_next_unblock; |
|
skym
2017/04/21 16:06:34
I think this logic already exists in this file, ma
Gang Wu
2017/04/25 00:52:05
Done.
|
| + if (pending_wakeup_timer_.IsRunning() && |
| + (pending_wakeup_timer_.desired_run_time() < incoming_run_time)) { |
| + // Old job arrives sooner than this one. Don't reschedule it. |
| + return; |
| + } |
| pending_wakeup_timer_.Start(FROM_HERE, time_until_next_unblock, |
| base::Bind(&SyncSchedulerImpl::OnTypesUnblocked, |
| weak_ptr_factory_.GetWeakPtr())); |
| @@ -741,6 +747,10 @@ void SyncSchedulerImpl::Unthrottle() { |
| NotifyRetryTime(base::Time()); |
| NotifyBlockedTypesChanged(nudge_tracker_.GetBlockedTypes()); |
| + // There may have some datatypes are in backoff or throttled before this |
| + // global throttling, so rechedule for them. |
| + RestartWaiting(); |
|
skym
2017/04/21 16:06:34
Sprinkling RestartWaiting()s all over the place, a
Gang Wu
2017/04/25 00:52:05
Done.
|
| + |
| // We treat this as a 'canary' in the sense that it was originally scheduled |
| // to run some time ago, failed, and we now want to retry, versus a job that |
| // was just created (e.g via ScheduleNudgeImpl). The main implication is |
| @@ -767,15 +777,20 @@ void SyncSchedulerImpl::PerformDelayedNudge() { |
| if (CanRunNudgeJobNow(NORMAL_PRIORITY)) |
| TrySyncCycleJob(); |
| - // We're not responsible for setting up any retries here. The functions that |
| - // first put us into a state that prevents successful sync cycles (eg. global |
| - // throttling, type throttling, network errors, transient errors) will also |
| - // setup the appropriate retry logic (eg. retry after timeout, exponential |
| - // backoff, retry when the network changes). |
| + // Since PerformDelayedNudge share pending_wakeup_timer_ with |
| + // OnTypesUnblocked, Unthrottle and ExponentialBackoffRetry, we should check |
| + // if there are any of those functions needed to be scheduled. |
| + RestartWaiting(); |
|
skym
2017/04/21 16:06:34
Why isn't RestartWaiting() the last thing done in
Gang Wu
2017/04/25 00:52:05
Where to run RestartWaiting() is not a matter, we
|
| } |
| void SyncSchedulerImpl::ExponentialBackoffRetry() { |
| TryCanaryJob(); |
| + |
| + if (!IsBackingOff()) { |
| + // There may have some datatypes are in backoff or throttled before this |
| + // global backoff, so rechedule for them. |
| + RestartWaiting(); |
| + } |
| } |
| void SyncSchedulerImpl::NotifyRetryTime(base::Time retry_time) { |