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