• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //
3 // Copyright 2016 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
19 #ifndef GRPC_SRC_CORE_LIB_BACKOFF_BACKOFF_H
20 #define GRPC_SRC_CORE_LIB_BACKOFF_BACKOFF_H
21 
22 #include <grpc/support/port_platform.h>
23 
24 #include "absl/random/random.h"
25 
26 #include "src/core/lib/gprpp/time.h"
27 
28 namespace grpc_core {
29 
30 /// Implementation of the backoff mechanism described in
31 /// doc/connection-backoff.md
32 class BackOff {
33  public:
34   class Options;
35 
36   /// Initialize backoff machinery - does not need to be destroyed
37   explicit BackOff(const Options& options);
38 
39   /// Returns the time at which the next attempt should start.
40   Timestamp NextAttemptTime();
41 
42   /// Reset the backoff, so the next value returned by NextAttemptTime()
43   /// will be the time of the second attempt (rather than the Nth).
44   void Reset();
45 
46   class Options {
47    public:
set_initial_backoff(Duration initial_backoff)48     Options& set_initial_backoff(Duration initial_backoff) {
49       initial_backoff_ = initial_backoff;
50       return *this;
51     }
set_multiplier(double multiplier)52     Options& set_multiplier(double multiplier) {
53       multiplier_ = multiplier;
54       return *this;
55     }
set_jitter(double jitter)56     Options& set_jitter(double jitter) {
57       jitter_ = jitter;
58       return *this;
59     }
set_max_backoff(Duration max_backoff)60     Options& set_max_backoff(Duration max_backoff) {
61       max_backoff_ = max_backoff;
62       return *this;
63     }
64     /// how long to wait after the first failure before retrying
initial_backoff()65     Duration initial_backoff() const { return initial_backoff_; }
66     /// factor with which to multiply backoff after a failed retry
multiplier()67     double multiplier() const { return multiplier_; }
68     /// amount to randomize backoffs
jitter()69     double jitter() const { return jitter_; }
70     /// maximum time between retries
max_backoff()71     Duration max_backoff() const { return max_backoff_; }
72 
73    private:
74     Duration initial_backoff_;
75     double multiplier_;
76     double jitter_;
77     Duration max_backoff_;
78   };  // class Options
79 
80  private:
81   const Options options_;
82   absl::BitGen rand_gen_;
83   bool initial_;
84   /// current delay before retries
85   Duration current_backoff_;
86 };
87 
88 }  // namespace grpc_core
89 #endif  // GRPC_SRC_CORE_LIB_BACKOFF_BACKOFF_H
90