Index: chrome/browser/sync/engine/sync_scheduler.h |
diff --git a/chrome/browser/sync/engine/sync_scheduler.h b/chrome/browser/sync/engine/sync_scheduler.h |
deleted file mode 100644 |
index 079ce93fce255565cce0ef566abeed56ad17588c..0000000000000000000000000000000000000000 |
--- a/chrome/browser/sync/engine/sync_scheduler.h |
+++ /dev/null |
@@ -1,421 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
-// |
-// A class to schedule syncer tasks intelligently. |
-#ifndef CHROME_BROWSER_SYNC_ENGINE_SYNC_SCHEDULER_H_ |
-#define CHROME_BROWSER_SYNC_ENGINE_SYNC_SCHEDULER_H_ |
-#pragma once |
- |
-#include <string> |
- |
-#include "base/callback.h" |
-#include "base/compiler_specific.h" |
-#include "base/gtest_prod_util.h" |
-#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/time.h" |
-#include "base/timer.h" |
-#include "chrome/browser/sync/engine/net/server_connection_manager.h" |
-#include "chrome/browser/sync/engine/nudge_source.h" |
-#include "chrome/browser/sync/engine/polling_constants.h" |
-#include "chrome/browser/sync/engine/syncer.h" |
-#include "chrome/browser/sync/sessions/sync_session_context.h" |
-#include "chrome/browser/sync/sessions/sync_session.h" |
-#include "chrome/browser/sync/syncable/model_type_payload_map.h" |
-#include "chrome/browser/sync/util/weak_handle.h" |
- |
-class MessageLoop; |
- |
-namespace tracked_objects { |
-class Location; |
-} // namespace tracked_objects |
- |
-namespace browser_sync { |
- |
-struct ServerConnectionEvent; |
- |
-class SyncScheduler : public sessions::SyncSession::Delegate { |
- public: |
- enum Mode { |
- // In this mode, the thread only performs configuration tasks. This is |
- // designed to make the case where we want to download updates for a |
- // specific type only, and not continue syncing until we are moved into |
- // normal mode. |
- CONFIGURATION_MODE, |
- // Resumes polling and allows nudges, drops configuration tasks. Runs |
- // through entire sync cycle. |
- NORMAL_MODE, |
- }; |
- |
- // All methods of SyncScheduler must be called on the same thread |
- // (except for RequestEarlyExit()). |
- |
- // |name| is a display string to identify the syncer thread. Takes |
- // |ownership of both |context| and |syncer|. |
- SyncScheduler(const std::string& name, |
- sessions::SyncSessionContext* context, Syncer* syncer); |
- |
- // Calls Stop(). |
- virtual ~SyncScheduler(); |
- |
- // Start the scheduler with the given mode. If the scheduler is |
- // already started, switch to the given mode, although some |
- // scheduled tasks from the old mode may still run. If non-NULL, |
- // |callback| will be invoked when the mode has been changed to |
- // |mode|. Takes ownership of |callback|. |
- void Start(Mode mode, const base::Closure& callback); |
- |
- // Request that any running syncer task stop as soon as possible and |
- // cancel all scheduled tasks. This function can be called from any thread, |
- // and should in fact be called from a thread that isn't the sync loop to |
- // allow preempting ongoing sync cycles. |
- // Invokes |callback| from the sync loop once syncer is idle and all tasks |
- // are cancelled. |
- void RequestStop(const base::Closure& callback); |
- |
- // The meat and potatoes. |
- void ScheduleNudge(const base::TimeDelta& delay, NudgeSource source, |
- syncable::ModelTypeSet types, |
- const tracked_objects::Location& nudge_location); |
- void ScheduleNudgeWithPayloads( |
- const base::TimeDelta& delay, NudgeSource source, |
- const syncable::ModelTypePayloadMap& types_with_payloads, |
- const tracked_objects::Location& nudge_location); |
- |
- // Note: The source argument of this function must come from the subset of |
- // GetUpdatesCallerInfo values related to configurations. |
- void ScheduleConfig( |
- syncable::ModelTypeSet types, |
- sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source); |
- |
- void ScheduleClearUserData(); |
- // If this is called before Start(), the cleanup is guaranteed to |
- // happen before the Start finishes. |
- // |
- // TODO(akalin): Figure out how to test this. |
- void ScheduleCleanupDisabledTypes(); |
- |
- // Change status of notifications in the SyncSessionContext. |
- void set_notifications_enabled(bool notifications_enabled); |
- |
- base::TimeDelta sessions_commit_delay() const; |
- |
- // DDOS avoidance function. Calculates how long we should wait before trying |
- // again after a failed sync attempt, where the last delay was |base_delay|. |
- // TODO(tim): Look at URLRequestThrottlerEntryInterface. |
- static base::TimeDelta GetRecommendedDelay(const base::TimeDelta& base_delay); |
- |
- // Called when credentials are updated by the user. |
- void OnCredentialsUpdated(); |
- |
- // Called when the network layer detects a connection status change. |
- void OnConnectionStatusChange(); |
- |
- // SyncSession::Delegate implementation. |
- virtual void OnSilencedUntil( |
- const base::TimeTicks& silenced_until) OVERRIDE; |
- virtual bool IsSyncingCurrentlySilenced() OVERRIDE; |
- virtual void OnReceivedShortPollIntervalUpdate( |
- const base::TimeDelta& new_interval) OVERRIDE; |
- virtual void OnReceivedLongPollIntervalUpdate( |
- const base::TimeDelta& new_interval) OVERRIDE; |
- virtual void OnReceivedSessionsCommitDelay( |
- const base::TimeDelta& new_delay) OVERRIDE; |
- virtual void OnShouldStopSyncingPermanently() OVERRIDE; |
- virtual void OnSyncProtocolError( |
- const sessions::SyncSessionSnapshot& snapshot) OVERRIDE; |
- |
- private: |
- enum JobProcessDecision { |
- // Indicates we should continue with the current job. |
- CONTINUE, |
- // Indicates that we should save it to be processed later. |
- SAVE, |
- // Indicates we should drop this job. |
- DROP, |
- }; |
- |
- struct SyncSessionJob { |
- // An enum used to describe jobs for scheduling purposes. |
- enum SyncSessionJobPurpose { |
- // Uninitialized state, should never be hit in practice. |
- UNKNOWN = -1, |
- // Our poll timer schedules POLL jobs periodically based on a server |
- // assigned poll interval. |
- POLL, |
- // A nudge task can come from a variety of components needing to force |
- // a sync. The source is inferable from |session.source()|. |
- NUDGE, |
- // The user invoked a function in the UI to clear their entire account |
- // and stop syncing (globally). |
- CLEAR_USER_DATA, |
- // Typically used for fetching updates for a subset of the enabled types |
- // during initial sync or reconfiguration. We don't run all steps of |
- // the sync cycle for these (e.g. CleanupDisabledTypes is skipped). |
- CONFIGURATION, |
- // The user disabled some types and we have to clean up the data |
- // for those. |
- CLEANUP_DISABLED_TYPES, |
- }; |
- SyncSessionJob(); |
- SyncSessionJob(SyncSessionJobPurpose purpose, base::TimeTicks start, |
- linked_ptr<sessions::SyncSession> session, bool is_canary_job, |
- const tracked_objects::Location& nudge_location); |
- ~SyncSessionJob(); |
- static const char* GetPurposeString(SyncSessionJobPurpose purpose); |
- |
- SyncSessionJobPurpose purpose; |
- base::TimeTicks scheduled_start; |
- linked_ptr<sessions::SyncSession> session; |
- bool is_canary_job; |
- |
- // This is the location the job came from. Used for debugging. |
- // In case of multiple nudges getting coalesced this stores the |
- // first location that came in. |
- tracked_objects::Location from_here; |
- }; |
- friend class SyncSchedulerTest; |
- friend class SyncSchedulerWhiteboxTest; |
- |
- FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, |
- DropNudgeWhileExponentialBackOff); |
- FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, SaveNudge); |
- 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); |
- FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, |
- SaveNudgeWhileThrottled); |
- FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, |
- ContinueClearUserDataUnderAllCircumstances); |
- FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, |
- ContinueCanaryJobConfig); |
- FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, |
- ContinueNudgeWhileExponentialBackOff); |
- FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, TransientPollFailure); |
- |
- // A component used to get time delays associated with exponential backoff. |
- // Encapsulated into a class to facilitate testing. |
- class DelayProvider { |
- public: |
- DelayProvider(); |
- virtual base::TimeDelta GetDelay(const base::TimeDelta& last_delay); |
- virtual ~DelayProvider(); |
- private: |
- DISALLOW_COPY_AND_ASSIGN(DelayProvider); |
- }; |
- |
- struct WaitInterval { |
- 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. |
- EXPONENTIAL_BACKOFF, |
- // A server-initiated throttled interval. We do not allow any syncing |
- // during such an interval. |
- THROTTLED, |
- }; |
- WaitInterval(); |
- ~WaitInterval(); |
- WaitInterval(Mode mode, base::TimeDelta length); |
- |
- 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<SyncScheduler> timer; |
- |
- // Configure jobs are saved only when backing off or throttling. So we |
- // expose the pointer here. |
- scoped_ptr<SyncSessionJob> pending_configure_job; |
- }; |
- |
- static const char* GetModeString(Mode mode); |
- |
- static const char* GetDecisionString(JobProcessDecision decision); |
- |
- // Helpers that log before posting to |sync_loop_|. These will only post |
- // the task in between calls to Start/Stop. |
- void PostTask(const tracked_objects::Location& from_here, |
- const char* name, |
- const base::Closure& task); |
- void PostDelayedTask(const tracked_objects::Location& from_here, |
- const char* name, |
- const base::Closure& task, |
- base::TimeDelta delay); |
- |
- // Helper to assemble a job and post a delayed task to sync. |
- void ScheduleSyncSessionJob(const SyncSessionJob& job); |
- |
- // Invoke the Syncer to perform a sync. |
- void DoSyncSessionJob(const SyncSessionJob& job); |
- |
- // Called after the Syncer has performed the sync represented by |job|, to |
- // reset our state. |
- void FinishSyncSessionJob(const SyncSessionJob& job); |
- |
- // Record important state that might be needed in future syncs, such as which |
- // data types may require cleanup. |
- void UpdateCarryoverSessionState(const SyncSessionJob& old_job); |
- |
- // Helper to FinishSyncSessionJob to schedule the next sync operation. |
- void ScheduleNextSync(const SyncSessionJob& old_job); |
- |
- // Helper to configure polling intervals. Used by Start and ScheduleNextSync. |
- void AdjustPolling(const SyncSessionJob* old_job); |
- |
- // Helper to restart waiting with |wait_interval_|'s timer. |
- void RestartWaiting(); |
- |
- // Helper to ScheduleNextSync in case of consecutive sync errors. |
- void HandleContinuationError(const SyncSessionJob& old_job); |
- |
- // Determines if it is legal to run |job| by checking current |
- // operational mode, backoff or throttling, freshness |
- // (so we don't make redundant syncs), and connection. |
- bool ShouldRunJob(const SyncSessionJob& job); |
- |
- // Decide whether we should CONTINUE, SAVE or DROP the job. |
- JobProcessDecision DecideOnJob(const SyncSessionJob& job); |
- |
- // Decide on whether to CONTINUE, SAVE or DROP the job when we are in |
- // backoff mode. |
- JobProcessDecision DecideWhileInWaitInterval(const SyncSessionJob& job); |
- |
- // Saves the job for future execution. Note: It drops all the poll jobs. |
- void SaveJob(const SyncSessionJob& job); |
- |
- // Coalesces the current job with the pending nudge. |
- void InitOrCoalescePendingJob(const SyncSessionJob& job); |
- |
- // 'Impl' here refers to real implementation of public functions, running on |
- // |thread_|. |
- void StartImpl(Mode mode, const base::Closure& callback); |
- void StopImpl(const base::Closure& callback); |
- void ScheduleNudgeImpl( |
- const base::TimeDelta& delay, |
- sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source, |
- const syncable::ModelTypePayloadMap& types_with_payloads, |
- bool is_canary_job, const tracked_objects::Location& nudge_location); |
- void ScheduleConfigImpl(const ModelSafeRoutingInfo& routing_info, |
- const std::vector<ModelSafeWorker*>& workers, |
- const sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source); |
- void ScheduleClearUserDataImpl(); |
- |
- // Returns true if the client is currently in exponential backoff. |
- bool IsBackingOff() const; |
- |
- // Helper to signal all listeners registered with |session_context_|. |
- void Notify(SyncEngineEvent::EventCause cause); |
- |
- // Callback to change backoff state. |
- void DoCanaryJob(); |
- void Unthrottle(); |
- |
- // Executes the pending job. Called whenever an event occurs that may |
- // change conditions permitting a job to run. Like when network connection is |
- // re-established, mode changes etc. |
- void DoPendingJobIfPossible(bool is_canary_job); |
- |
- // Called when the root cause of the current connection error is fixed. |
- void OnServerConnectionErrorFixed(); |
- |
- // The pointer is owned by the caller. |
- browser_sync::sessions::SyncSession* CreateSyncSession( |
- const browser_sync::sessions::SyncSourceInfo& info); |
- |
- // Creates a session for a poll and performs the sync. |
- void PollTimerCallback(); |
- |
- // Assign |start| and |end| to appropriate SyncerStep values for the |
- // specified |purpose|. |
- void SetSyncerStepsForPurpose(SyncSessionJob::SyncSessionJobPurpose purpose, |
- SyncerStep* start, |
- SyncerStep* end); |
- |
- // Used to update |server_connection_ok_|, see below. |
- void UpdateServerConnectionManagerStatus( |
- HttpResponse::ServerConnectionCode code); |
- |
- // Called once the first time thread_ is started to broadcast an initial |
- // session snapshot containing data like initial_sync_ended. Important when |
- // the client starts up and does not need to perform an initial sync. |
- void SendInitialSnapshot(); |
- |
- virtual void OnActionableError(const sessions::SyncSessionSnapshot& snapshot); |
- |
- base::WeakPtrFactory<SyncScheduler> weak_ptr_factory_; |
- |
- // A second factory specially for weak_handle_this_, to allow the handle |
- // to be const and alleviate threading concerns. |
- base::WeakPtrFactory<SyncScheduler> weak_ptr_factory_for_weak_handle_; |
- |
- // For certain methods that need to worry about X-thread posting. |
- const WeakHandle<SyncScheduler> weak_handle_this_; |
- |
- // Used for logging. |
- const std::string name_; |
- |
- // The message loop this object is on. Almost all methods have to |
- // be called on this thread. |
- MessageLoop* const sync_loop_; |
- |
- // Set in Start(), unset in Stop(). |
- bool started_; |
- |
- // Modifiable versions of kDefaultLongPollIntervalSeconds which can be |
- // updated by the server. |
- base::TimeDelta syncer_short_poll_interval_seconds_; |
- base::TimeDelta syncer_long_poll_interval_seconds_; |
- |
- // Server-tweakable sessions commit delay. |
- base::TimeDelta sessions_commit_delay_; |
- |
- // Periodic timer for polling. See AdjustPolling. |
- base::RepeatingTimer<SyncScheduler> poll_timer_; |
- |
- // The mode of operation. |
- Mode mode_; |
- |
- // TODO(tim): Bug 26339. This needs to track more than just time I think, |
- // since the nudges could be for different types. Current impl doesn't care. |
- base::TimeTicks last_sync_session_end_time_; |
- |
- // Have we observed a valid server connection? |
- bool server_connection_ok_; |
- |
- // The latest connection code we got while trying to connect. |
- HttpResponse::ServerConnectionCode connection_code_; |
- |
- // Tracks in-flight nudges so we can coalesce. |
- scoped_ptr<SyncSessionJob> pending_nudge_; |
- |
- // Current wait state. Null if we're not in backoff and not throttled. |
- scoped_ptr<WaitInterval> wait_interval_; |
- |
- scoped_ptr<DelayProvider> delay_provider_; |
- |
- // Invoked to run through the sync cycle. |
- scoped_ptr<Syncer> syncer_; |
- |
- scoped_ptr<sessions::SyncSessionContext> session_context_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SyncScheduler); |
-}; |
- |
-} // namespace browser_sync |
- |
-#endif // CHROME_BROWSER_SYNC_ENGINE_SYNC_SCHEDULER_H_ |