OpenSDN source code
config_db_client.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef config_db_client_h
6 #define config_db_client_h
7 
8 #include <string>
9 #include <vector>
10 #include <atomic>
11 #include <tbb/spin_rw_mutex.h>
12 
13 #include "base/regex.h"
14 #include "base/timer.h"
15 #include "base/task_annotations.h"
16 #include "config_client_manager.h"
17 
18 struct ConfigClientOptions;
19 struct ConfigDBConnInfo;
20 struct ConfigDBUUIDCacheEntry;
21 struct ConfigDBFQNameCacheEntry;
22 
24  public:
25  ObjectProcessReq(std::string oper,
26  std::string uuid_str,
27  std::string value) : oper_(oper),
28  uuid_str_(uuid_str), value_(value) {
29  }
30 
31  std::string oper_;
32  std::string uuid_str_;
33  std::string value_; // obj_type for Cassandra/json_value for ETCD
34 
35  private:
37 };
38 
39 /*
40  * This is the base class for interactions with a database that stores the user
41  * configuration.
42  */
44 public:
45  // wait time before retrying in seconds
46  static const uint64_t kInitRetryTimeUSec = 5000000;
47 
48  // Number of requests to handle in one config reader task execution
49  static const int kMaxRequestsToYield = 512;
50 
51  // Number of config entries to read in one read request
52  static const int kNumEntriesToRead = 4096;
53 
57  virtual ~ConfigDbClient();
58 
59  typedef std::pair<std::string, std::string> ObjTypeFQNPair;
60 
61  const std::string& config_db_user() const;
62  const std::string& config_db_password() const;
63  const std::vector<std::string>& config_db_ips() const;
64  int GetFirstConfigDbPort() const;
65  virtual void PostShutdown() = 0;
66  virtual void InitDatabase() = 0;
67  virtual void EnqueueUUIDRequest(std::string uuid_str, std::string obj_type,
68  std::string oper) = 0;
69 
70  virtual bool UUIDToObjCacheShow(
71  const std::string &search_string, int inst_num,
72  const std::string &last_uuid, uint32_t num_entries,
73  std::vector<ConfigDBUUIDCacheEntry> *entries) const = 0;
74 
75  virtual bool IsListOrMapPropEmpty(const std::string &uuid_key,
76  const std::string &lookup_key) = 0;
77 
78  // FQ Name Cache
79  virtual void AddFQNameCache(const std::string &uuid,
80  const std::string &obj_type, const std::string &fq_name);
81  virtual std::string FindFQName(const std::string &uuid) const;
82  virtual void InvalidateFQNameCache(const std::string &uuid);
83  virtual void PurgeFQNameCache(const std::string &uuid);
84  virtual void ClearFQNameCache() {
85  fq_name_cache_.clear();
86  }
87  ObjTypeFQNPair UUIDToFQName(const std::string &uuid_str,
88  bool deleted_ok = true) const;
89 
90  virtual bool UUIDToFQNameShow(
91  const std::string &search_string, const std::string &last_uuid,
92  uint32_t num_entries,
93  std::vector<ConfigDBFQNameCacheEntry> *entries) const;
94 
95  virtual std::string uuid_str(const std::string &uuid);
96  virtual std::string GetUUID(const std::string &key) const {
97  return key;
98  }
99 
100  virtual void InitConnectionInfo();
101  virtual void UpdateConnectionInfo(bool success,
102  bool force);
103  virtual void GetConnectionInfo(ConfigDBConnInfo &status) const;
104 
105  virtual bool IsTaskTriggered() const;
106  virtual void StartWatcher();
107 
108  ConfigClientManager *mgr() { return mgr_; }
109  const ConfigClientManager *mgr() const { return mgr_; }
110 
111 protected:
112  // UUID to FQName mapping
114  FQNameCacheType(std::string in_obj_type, std::string in_fq_name)
115  : obj_type(in_obj_type), fq_name(in_fq_name), deleted(false) {
116  }
117  std::string obj_type;
118  std::string fq_name;
119  bool deleted;
120  };
121  typedef std::map<std::string, FQNameCacheType> FQNameCacheMap;
122 
123  virtual void FillFQNameCacheInfo(
124  const std::string &uuid,
125  FQNameCacheMap::const_iterator it,
126  ConfigDBFQNameCacheEntry *entry) const;
127 
128  virtual const int GetMaxRequestsToYield() const {
129  return kMaxRequestsToYield;
130  }
131  virtual const uint64_t GetInitRetryTimeUSec() const {
132  return kInitRetryTimeUSec;
133  }
134 
135  virtual uint32_t GetNumReadRequestToBunch() const;
137 
138 private:
141  std::string config_db_user_;
142  std::string config_db_password_;
143  std::vector<std::string> config_db_ips_;
144  std::vector<int> config_db_ports_;
146  mutable tbb::spin_rw_mutex rw_mutex_;
147  std::atomic<bool> client_connection_up_;
148  std::atomic<uint64_t> connection_status_change_at_;
149 };
150 
152  public:
153  ObjectCacheEntry(uint64_t last_read_tstamp)
154  : last_read_tstamp_(last_read_tstamp) {
155  }
156 
158 
159  virtual void SetLastReadTimeStamp(uint64_t ts) {
160  last_read_tstamp_ = ts;
161  }
162  virtual uint64_t GetLastReadTimeStamp() const {
163  return last_read_tstamp_;
164  }
165 
166  virtual void SetFQName(std::string fq_name) {
167  fq_name_ = fq_name;
168  }
169  virtual const std::string &GetFQName() const {
170  return fq_name_;
171  }
172 
173  virtual void SetObjType(std::string obj_type) {
174  obj_type_ = obj_type;
175  }
176  virtual const std::string &GetObjType() const {
177  return obj_type_;
178  }
179 
180  private:
181  std::string obj_type_;
182  std::string fq_name_;
184 };
185 #endif // config_db_client_h
virtual void FillFQNameCacheInfo(const std::string &uuid, FQNameCacheMap::const_iterator it, ConfigDBFQNameCacheEntry *entry) const
FQNameCacheMap fq_name_cache_
ConfigClientManager * mgr_
virtual std::string FindFQName(const std::string &uuid) const
virtual bool IsListOrMapPropEmpty(const std::string &uuid_key, const std::string &lookup_key)=0
std::vector< int > config_db_ports_
virtual std::string uuid_str(const std::string &uuid)
virtual bool UUIDToObjCacheShow(const std::string &search_string, int inst_num, const std::string &last_uuid, uint32_t num_entries, std::vector< ConfigDBUUIDCacheEntry > *entries) const =0
std::atomic< uint64_t > connection_status_change_at_
EventManager * event_manager()
std::atomic< bool > client_connection_up_
std::pair< std::string, std::string > ObjTypeFQNPair
std::vector< std::string > config_db_ips_
ConfigDbClient(ConfigClientManager *mgr, EventManager *evm, const ConfigClientOptions &options)
virtual void PostShutdown()=0
tbb::spin_rw_mutex rw_mutex_
virtual ~ConfigDbClient()
std::string config_db_password_
static const int kNumEntriesToRead
std::string config_db_user_
const std::vector< std::string > & config_db_ips() const
ObjTypeFQNPair UUIDToFQName(const std::string &uuid_str, bool deleted_ok=true) const
virtual uint32_t GetNumReadRequestToBunch() const
virtual const int GetMaxRequestsToYield() const
virtual bool UUIDToFQNameShow(const std::string &search_string, const std::string &last_uuid, uint32_t num_entries, std::vector< ConfigDBFQNameCacheEntry > *entries) const
const ConfigClientManager * mgr() const
virtual void GetConnectionInfo(ConfigDBConnInfo &status) const
virtual std::string GetUUID(const std::string &key) const
std::map< std::string, FQNameCacheType > FQNameCacheMap
static const uint64_t kInitRetryTimeUSec
static const int kMaxRequestsToYield
virtual void InitDatabase()=0
virtual void InvalidateFQNameCache(const std::string &uuid)
int GetFirstConfigDbPort() const
virtual void UpdateConnectionInfo(bool success, bool force)
virtual bool IsTaskTriggered() const
EventManager * evm_
virtual void AddFQNameCache(const std::string &uuid, const std::string &obj_type, const std::string &fq_name)
const std::string & config_db_password() const
virtual void EnqueueUUIDRequest(std::string uuid_str, std::string obj_type, std::string oper)=0
virtual void InitConnectionInfo()
virtual void PurgeFQNameCache(const std::string &uuid)
virtual void ClearFQNameCache()
ConfigClientManager * mgr()
const std::string & config_db_user() const
virtual void StartWatcher()
virtual const uint64_t GetInitRetryTimeUSec() const
virtual void SetLastReadTimeStamp(uint64_t ts)
ObjectCacheEntry(uint64_t last_read_tstamp)
virtual const std::string & GetFQName() const
uint64_t last_read_tstamp_
virtual const std::string & GetObjType() const
std::string obj_type_
virtual void SetFQName(std::string fq_name)
virtual void SetObjType(std::string obj_type)
virtual uint64_t GetLastReadTimeStamp() const
std::string fq_name_
DISALLOW_COPY_AND_ASSIGN(ObjectProcessReq)
ObjectProcessReq(std::string oper, std::string uuid_str, std::string value)
std::string uuid_str_
std::string value_
static EventManager evm
FQNameCacheType(std::string in_obj_type, std::string in_fq_name)
boost::uuids::uuid uuid