1
#pragma once
2

            
3
#include <chrono>
4
#include <cstdint>
5
#include <functional>
6
#include <memory>
7
#include <string>
8

            
9
#include "envoy/common/pure.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace Common {
14
namespace Redis {
15

            
16
using RefreshCB = std::function<void()>;
17

            
18
/**
19
 * A manager for tracking events that would trigger a cluster refresh, and calling registered
20
 * callbacks when the error rate exceeds a configurable threshold (while ensuring that a minimum
21
 * time passes between calling the callback).
22
 */
23
class ClusterRefreshManager {
24
public:
25
  class Handle {
26
  public:
27
36
    virtual ~Handle() = default;
28
  };
29

            
30
  using HandlePtr = std::unique_ptr<Handle>;
31

            
32
131
  virtual ~ClusterRefreshManager() = default;
33

            
34
  /**
35
   * Notifies the manager that a redirection error has been received for a given cluster.
36
   * @param cluster_name is the name of the cluster.
37
   * @return bool true if a cluster's registered callback is scheduled on the main thread, false
38
   * otherwise.
39
   */
40
  virtual bool onRedirection(const std::string& cluster_name) PURE;
41

            
42
  /**
43
   * Notifies the manager that a failure has been received for a given cluster.
44
   * @param cluster_name is the name of the cluster.
45
   * @return bool true if a cluster's registered callback is scheduled on the main thread, false
46
   * otherwise.
47
   */
48
  virtual bool onFailure(const std::string& cluster_name) PURE;
49

            
50
  /**
51
   * Notifies the manager that a degraded host has been used for a given cluster.
52
   * @param cluster_name is the name of the cluster.
53
   * @return bool true if a cluster's registered callback is scheduled on the main thread, false
54
   * otherwise.
55
   */
56
  virtual bool onHostDegraded(const std::string& cluster_name) PURE;
57

            
58
  /**
59
   * Register a cluster to be tracked by the manager (called by main thread only).
60
   * @param cluster_name is the name of the cluster.
61
   * @param min_time_between_triggering is the minimum amount of time that must pass between
62
   * callback invocations (redirects ignored and not counted during this time).
63
   * @param redirects_threshold is the number of redirects that must be reached to consider
64
   * calling the callback.
65
   * @param cb is the cluster callback function.
66
   * @return HandlePtr is a smart pointer to an opaque Handle that will unregister the cluster upon
67
   * destruction.
68
   */
69
  virtual HandlePtr registerCluster(const std::string& cluster_name,
70
                                    std::chrono::milliseconds min_time_between_triggering,
71
                                    const uint32_t redirects_threshold,
72
                                    const uint32_t failure_threshold,
73
                                    const uint32_t host_degraded_threshold,
74
                                    const RefreshCB& cb) PURE;
75
};
76

            
77
using ClusterRefreshManagerSharedPtr = std::shared_ptr<ClusterRefreshManager>;
78

            
79
} // namespace Redis
80
} // namespace Common
81
} // namespace Extensions
82
} // namespace Envoy