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_CORE_LIB_BACKOFF_BACKOFF_H
20 #define GRPC_CORE_LIB_BACKOFF_BACKOFF_H
21 
22 #include <grpc/support/port_platform.h>
23 
24 #include "src/core/lib/iomgr/exec_ctx.h"
25 
26 namespace grpc_core {
27 
28 /// Implementation of the backoff mechanism described in
29 /// doc/connection-backoff.md
30 class BackOff {
31  public:
32   class Options;
33 
34   /// Initialize backoff machinery - does not need to be destroyed
35   explicit BackOff(const Options& options);
36 
37   /// Returns the time at which the next attempt should start.
38   grpc_millis NextAttemptTime();
39 
40   /// Reset the backoff, so the next value returned by NextAttemptTime()
41   /// will be the time of the second attempt (rather than the Nth).
42   void Reset();
43 
44   void SetRandomSeed(unsigned int seed);
45 
46   class Options {
47    public:
set_initial_backoff(grpc_millis initial_backoff)48     Options& set_initial_backoff(grpc_millis 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(grpc_millis max_backoff)60     Options& set_max_backoff(grpc_millis 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     grpc_millis 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     grpc_millis max_backoff() const { return max_backoff_; }
72 
73    private:
74     grpc_millis initial_backoff_;
75     double multiplier_;
76     double jitter_;
77     grpc_millis max_backoff_;
78   };  // class Options
79 
80  private:
81   const Options options_;
82   uint32_t rng_state_;
83   bool initial_;
84   /// current delay before retries
85   grpc_millis current_backoff_;
86 };
87 
88 }  // namespace grpc_core
89 #endif /* GRPC_CORE_LIB_BACKOFF_BACKOFF_H */
90