// Copyright 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. #ifndef SYNC_ENGINE_BACKOFF_DELAY_PROVIDER_H_ #define SYNC_ENGINE_BACKOFF_DELAY_PROVIDER_H_ #include "base/macros.h" #include "base/time/time.h" #include "sync/base/sync_export.h" namespace syncer { namespace sessions { struct ModelNeutralState; } // A component used to get time delays associated with exponential backoff. class SYNC_EXPORT BackoffDelayProvider { public: // Factory function to create a standard BackoffDelayProvider. static 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 BackoffDelayProvider* WithShortInitialRetryOverride(); 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 sessions::ModelNeutralState& state) const; 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_; DISALLOW_COPY_AND_ASSIGN(BackoffDelayProvider); }; } // namespace syncer #endif // SYNC_ENGINE_BACKOFF_DELAY_PROVIDER_H_