|  | // Copyright 2012 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef COMPONENTS_SYNC_ENGINE_BACKOFF_DELAY_PROVIDER_H_ | 
|  | #define COMPONENTS_SYNC_ENGINE_BACKOFF_DELAY_PROVIDER_H_ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/time/time.h" | 
|  |  | 
|  | namespace syncer { | 
|  |  | 
|  | struct ModelNeutralState; | 
|  |  | 
|  | // A component used to get time delays associated with exponential backoff. | 
|  | class BackoffDelayProvider { | 
|  | public: | 
|  | // Factory function to create a standard BackoffDelayProvider. | 
|  | static std::unique_ptr<BackoffDelayProvider> FromDefaults(); | 
|  |  | 
|  | // Similar to above, but causes sync to retry very quickly (see | 
|  | // polling_constants.h) when it encounters an error before exponential | 
|  | // backoff. | 
|  | // | 
|  | // *** NOTE *** This should only be used if kSyncShortInitialRetryOverride | 
|  | // was passed to command line. | 
|  | static std::unique_ptr<BackoffDelayProvider> WithShortInitialRetryOverride(); | 
|  |  | 
|  | BackoffDelayProvider(const BackoffDelayProvider&) = delete; | 
|  | BackoffDelayProvider& operator=(const BackoffDelayProvider&) = delete; | 
|  |  | 
|  | virtual ~BackoffDelayProvider(); | 
|  |  | 
|  | // 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. | 
|  | virtual base::TimeDelta GetDelay(const base::TimeDelta& last_delay); | 
|  |  | 
|  | // Helper to calculate the initial value for exponential backoff. | 
|  | // See possible values and comments in polling_constants.h. | 
|  | virtual base::TimeDelta GetInitialDelay(const ModelNeutralState& state) const; | 
|  |  | 
|  | // Test-only variant that avoids randomness in tests. `jitter_sign` must be -1 | 
|  | // or 1 and determines whether the jitter in the delay will be positive or | 
|  | // negative. | 
|  | base::TimeDelta GetDelayForTesting(base::TimeDelta last_delay, | 
|  | int jitter_sign); | 
|  |  | 
|  | protected: | 
|  | BackoffDelayProvider(const base::TimeDelta& default_initial_backoff, | 
|  | const base::TimeDelta& short_initial_backoff); | 
|  |  | 
|  | private: | 
|  | const base::TimeDelta default_initial_backoff_; | 
|  | const base::TimeDelta short_initial_backoff_; | 
|  | }; | 
|  |  | 
|  | }  // namespace syncer | 
|  |  | 
|  | #endif  // COMPONENTS_SYNC_ENGINE_BACKOFF_DELAY_PROVIDER_H_ |