| // Copyright 2018 The Fuchsia 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 SRC_LIB_BACKOFF_EXPONENTIAL_BACKOFF_H_ |
| #define SRC_LIB_BACKOFF_EXPONENTIAL_BACKOFF_H_ |
| |
| #include <lib/fit/function.h> |
| |
| #include <random> |
| |
| #include "src/lib/backoff/backoff.h" |
| |
| namespace backoff { |
| |
| // Exponential backoff. The returned backoff delay is D + r: |
| // D = |initial_delay| * |retry_factor| ^ N |
| // r = rand(0, D) |
| // with N denoting the number of consecutive GetNext() calls, starting at 0. |
| class ExponentialBackoff : public Backoff { |
| public: |
| explicit ExponentialBackoff(fit::function<uint64_t()> seed_generator = DefaultSeedGenerator); |
| ExponentialBackoff(zx::duration initial_delay, uint32_t retry_factor, zx::duration max_delay, |
| fit::function<uint64_t()> seed_generator = DefaultSeedGenerator); |
| ~ExponentialBackoff() override; |
| |
| zx::duration GetNext() override; |
| void Reset() override; |
| |
| private: |
| static uint64_t DefaultSeedGenerator(); |
| |
| const zx::duration initial_delay_; |
| const uint32_t retry_factor_; |
| const zx::duration max_delay_; |
| // Used to prevent overflows in multiplication. |
| const zx::duration max_delay_divided_by_factor_; |
| std::default_random_engine rng_; |
| |
| zx::duration next_delay_ = initial_delay_; |
| }; |
| |
| } // namespace backoff |
| |
| #endif // SRC_LIB_BACKOFF_EXPONENTIAL_BACKOFF_H_ |