| Index: sync/engine/sync_scheduler_impl.h
|
| diff --git a/sync/engine/sync_scheduler_impl.h b/sync/engine/sync_scheduler_impl.h
|
| index f3c4d5aad856df0123572d5122543b9e5af4e4bf..dfdcc8040802cb756ffc28ce3dbfd09d10161691 100644
|
| --- a/sync/engine/sync_scheduler_impl.h
|
| +++ b/sync/engine/sync_scheduler_impl.h
|
| @@ -15,7 +15,7 @@
|
| #include "base/memory/linked_ptr.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/memory/weak_ptr.h"
|
| -#include "base/observer_list.h"
|
| +#include "base/threading/non_thread_safe.h"
|
| #include "base/time.h"
|
| #include "base/timer.h"
|
| #include "sync/base/sync_export.h"
|
| @@ -34,7 +34,9 @@ namespace syncer {
|
|
|
| class BackoffDelayProvider;
|
|
|
| -class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| +class SYNC_EXPORT_PRIVATE SyncSchedulerImpl
|
| + : public SyncScheduler,
|
| + public base::NonThreadSafe {
|
| public:
|
| // |name| is a display string to identify the syncer thread. Takes
|
| // |ownership of |syncer| and |delay_provider|.
|
| @@ -107,8 +109,6 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
|
| SaveNudgeWhileTypeThrottled);
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinueNudge);
|
| - FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, DropPoll);
|
| - FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinuePoll);
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinueConfiguration);
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
|
| SaveConfigurationWhileThrottled);
|
| @@ -116,10 +116,7 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| SaveNudgeWhileThrottled);
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
|
| ContinueCanaryJobConfig);
|
| - FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
|
| - ContinueNudgeWhileExponentialBackOff);
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, TransientPollFailure);
|
| - FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, GetInitialBackoffDelay);
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest,
|
| ServerConnectionChangeDuringBackoff);
|
| FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest,
|
| @@ -129,9 +126,8 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| enum Mode {
|
| // Uninitialized state, should not be set in practice.
|
| UNKNOWN = -1,
|
| - // A wait interval whose duration has been affected by exponential
|
| - // backoff.
|
| - // EXPONENTIAL_BACKOFF intervals are nudge-rate limited to 1 per interval.
|
| + // We enter a series of increasingly longer WaitIntervals if we experience
|
| + // repeated transient failures. We retry at the end of each interval.
|
| EXPONENTIAL_BACKOFF,
|
| // A server-initiated throttled interval. We do not allow any syncing
|
| // during such an interval.
|
| @@ -144,38 +140,28 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| static const char* GetModeString(Mode mode);
|
|
|
| Mode mode;
|
| -
|
| - // This bool is set to true if we have observed a nudge during this
|
| - // interval and mode == EXPONENTIAL_BACKOFF.
|
| - bool had_nudge;
|
| base::TimeDelta length;
|
| - base::OneShotTimer<SyncSchedulerImpl> timer;
|
| -
|
| - // Configure jobs are saved only when backing off or throttling. So we
|
| - // expose the pointer here (does not own, similar to pending_nudge).
|
| - SyncSessionJob* pending_configure_job;
|
| };
|
|
|
| static const char* GetModeString(Mode mode);
|
|
|
| static const char* GetDecisionString(JobProcessDecision decision);
|
|
|
| - // Helper to cancel any existing delayed task and replace it with a new one.
|
| - // It will not post any tasks if the scheduler is in a "stopped" state.
|
| - void PostDelayedTask(const tracked_objects::Location& from_here,
|
| - const char* name,
|
| - const base::Closure& task,
|
| - base::TimeDelta delay);
|
| + // Invoke the syncer to perform a non-POLL job.
|
| + bool DoSyncSessionJobImpl(scoped_ptr<SyncSessionJob> job,
|
| + JobPriority priority);
|
|
|
| - // Invoke the Syncer to perform a non-poll job.
|
| - bool DoSyncSessionJob(scoped_ptr<SyncSessionJob> job,
|
| - JobPriority priority);
|
| + // Invoke the syncer to perform a nudge job.
|
| + void DoNudgeSyncSessionJob(JobPriority priority);
|
| +
|
| + // Invoke the syncer to perform a configuration job.
|
| + bool DoConfigurationSyncSessionJob(JobPriority priority);
|
|
|
| // Returns whether or not it's safe to run a poll job at this time.
|
| bool ShouldPoll();
|
|
|
| // Invoke the Syncer to perform a poll job.
|
| - void DoPollSyncSessionJob(scoped_ptr<SyncSessionJob> job);
|
| + void DoPollSyncSessionJob();
|
|
|
| // Called after the Syncer has performed the sync represented by |job|, to
|
| // reset our state. |exited_prematurely| is true if the Syncer did not
|
| @@ -193,7 +179,7 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| void AdjustPolling(const SyncSessionJob* old_job);
|
|
|
| // Helper to restart waiting with |wait_interval_|'s timer.
|
| - void RestartWaiting(scoped_ptr<SyncSessionJob> job);
|
| + void RestartWaiting();
|
|
|
| // Helper to ScheduleNextSync in case of consecutive sync errors.
|
| void HandleContinuationError(scoped_ptr<SyncSessionJob> old_job,
|
| @@ -203,10 +189,6 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| JobProcessDecision DecideOnJob(const SyncSessionJob& job,
|
| JobPriority priority);
|
|
|
| - // If DecideOnJob decides that |job| should be SAVEd, this function will
|
| - // carry out the task of actually "saving" (or coalescing) the job.
|
| - void HandleSaveJobDecision(scoped_ptr<SyncSessionJob> job);
|
| -
|
| // Decide on whether to CONTINUE, SAVE or DROP the job when we are in
|
| // backoff mode.
|
| JobProcessDecision DecideWhileInWaitInterval(const SyncSessionJob& job,
|
| @@ -235,22 +217,12 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| // Helper to signal listeners about changed retry time
|
| void NotifyRetryTime(base::Time retry_time);
|
|
|
| - // Callback to change backoff state. |to_be_canary| in both cases is the job
|
| - // that should be granted canary privileges. Note: it is possible that the
|
| - // job that gets scheduled when this callback is scheduled is different from
|
| - // the job that will actually get executed, because other jobs may have been
|
| - // scheduled while we were waiting for the callback.
|
| - void DoCanaryJob(scoped_ptr<SyncSessionJob> to_be_canary);
|
| - void Unthrottle(scoped_ptr<SyncSessionJob> to_be_canary);
|
| -
|
| - // Returns a pending job that has potential to run given the state of the
|
| - // scheduler, if it exists. Useful whenever an event occurs that may
|
| - // change conditions that permit a job to run, such as re-establishing
|
| - // network connection, auth refresh, mode changes etc. Note that the returned
|
| - // job may have been scheduled to run at a later time, or may have been
|
| - // unscheduled. In the former case, this will result in abandoning the old
|
| - // job and effectively cancelling it.
|
| - scoped_ptr<SyncSessionJob> TakePendingJobForCurrentMode();
|
| + // Looks for pending work and, if it finds any, run this work at "canary"
|
| + // priority.
|
| + void TryCanaryJob();
|
| +
|
| + // Transitions out of the THROTTLED WaitInterval then calls TryCanaryJob().
|
| + void Unthrottle();
|
|
|
| // Called when the root cause of the current connection error is fixed.
|
| void OnServerConnectionErrorFixed();
|
| @@ -283,10 +255,6 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| // Used for logging.
|
| const std::string name_;
|
|
|
| - // The message loop this object is on. Almost all methods have to
|
| - // be called on this thread.
|
| - base::MessageLoop* const sync_loop_;
|
| -
|
| // Set in Start(), unset in Stop().
|
| bool started_;
|
|
|
| @@ -304,27 +272,21 @@ class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler {
|
| // The mode of operation.
|
| Mode mode_;
|
|
|
| - // Tracks (does not own) in-flight nudges (scheduled or unscheduled),
|
| - // so we can coalesce. NULL if there is no pending nudge.
|
| - SyncSessionJob* pending_nudge_;
|
| -
|
| - // There are certain situations where we want to remember a nudge, but
|
| - // there is no well defined moment in time in the future when that nudge
|
| - // should run, e.g. if it requires a mode switch or updated auth credentials.
|
| - // This member will own NUDGE jobs in those cases, until an external event
|
| - // (mode switch or fixed auth) occurs to trigger a retry. Should be treated
|
| - // as opaque / not interacted with (i.e. we could build a wrapper to
|
| - // hide the type, but that's probably overkill).
|
| - scoped_ptr<SyncSessionJob> unscheduled_nudge_storage_;
|
| -
|
| // Current wait state. Null if we're not in backoff and not throttled.
|
| scoped_ptr<WaitInterval> wait_interval_;
|
|
|
| scoped_ptr<BackoffDelayProvider> delay_provider_;
|
|
|
| - // We allow at most one PostedTask to be pending at one time. This is it.
|
| - // We will cancel this task before starting a new one.
|
| - base::CancelableClosure pending_wakeup_;
|
| + // The event that will wake us up.
|
| + base::OneShotTimer<SyncSchedulerImpl> pending_wakeup_timer_;
|
| +
|
| + // Pending configure job storage. Note that
|
| + // (mode_ != CONFIGURATION_MODE) \implies !pending_configure_job_.
|
| + scoped_ptr<SyncSessionJob> pending_configure_job_;
|
| +
|
| + // Pending nudge job storage. These jobs can exist in CONFIGURATION_MODE, but
|
| + // they will be run only in NORMAL_MODE.
|
| + scoped_ptr<SyncSessionJob> pending_nudge_job_;
|
|
|
| // Invoked to run through the sync cycle.
|
| scoped_ptr<Syncer> syncer_;
|
|
|