OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
config_db_client.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "config_db_client.h"
6 
7 #include <boost/tokenizer.hpp>
8 
9 #include "base/string_util.h"
10 #include "config_client_options.h"
11 #include "config_client_log.h"
12 #include "config_client_log_types.h"
13 #include "config_client_show_types.h"
14 
15 using contrail::regex;
18 
19 using namespace std;
20 
24  : mgr_(mgr), evm_(evm),
25  config_db_user_(options.config_db_username),
26  config_db_password_(options.config_db_password) {
27 
28  for (vector<string>::const_iterator iter =
29  options.config_db_server_list.begin();
30  iter != options.config_db_server_list.end(); iter++) {
31  string server_info(*iter);
32  typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
33  boost::char_separator<char> sep(":");
34  tokenizer tokens(server_info, sep);
35  tokenizer::iterator tit = tokens.begin();
36  string ip(*tit);
37  config_db_ips_.push_back(ip);
38  ++tit;
39  string port_str(*tit);
40  int port;
41  stringToInteger(port_str, port);
42  config_db_ports_.push_back(port);
43  }
44 }
45 
47 }
48 
49 const string& ConfigDbClient::config_db_user() const {
50  return config_db_user_;
51 }
52 
53 const string& ConfigDbClient::config_db_password() const {
54  return config_db_password_;
55 }
56 
57 const vector<string>& ConfigDbClient::config_db_ips() const {
58  return config_db_ips_;
59 }
60 
62  return !config_db_ports_.empty() ? config_db_ports_[0] : 0;
63 }
64 
65 string ConfigDbClient::uuid_str(const string &uuid) {
66  return uuid;
67 }
68 
70  static bool init_ = false;
71  static uint32_t num_read_req_to_bunch = 0;
72 
73  if (!init_) {
74  // XXX To be used for testing purposes only.
75  char *count_str = getenv("CONFIG_NUM_DB_READ_REQ_TO_BUNCH");
76  if (count_str) {
77  num_read_req_to_bunch = strtol(count_str, NULL, 0);
78  } else {
79  num_read_req_to_bunch = kNumEntriesToRead;
80  }
81  init_ = true;
82  }
83  return num_read_req_to_bunch;
84 }
85 
87  const string &obj_type,
88  const string &fq_name) {
89  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
90  FQNameCacheType cache_obj(obj_type, fq_name);
91  fq_name_cache_.insert(make_pair(uuid, cache_obj));
92  return;
93 }
94 
96  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
97  FQNameCacheMap::iterator it = fq_name_cache_.find(uuid);
98  if (it != fq_name_cache_.end()) {
99  it->second.deleted = true;
100  }
101  return;
102 }
103 
105  tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
106  fq_name_cache_.erase(uuid);
107 }
108 
109 string ConfigDbClient::FindFQName(const string &uuid) const {
110  ObjTypeFQNPair obj_type_fq_name_pair = UUIDToFQName(uuid);
111  return obj_type_fq_name_pair.second;
112 }
113 
115  const string &uuid, bool deleted_ok) const {
116  tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
117  FQNameCacheMap::const_iterator it = fq_name_cache_.find(uuid);
118  if (it != fq_name_cache_.end()) {
119  if (!it->second.deleted || (it->second.deleted && deleted_ok)) {
120  return make_pair(it->second.obj_type, it->second.fq_name);
121  }
122  }
123  return make_pair("ERROR", "ERROR");
124 }
125 
127  FQNameCacheMap::const_iterator it, ConfigDBFQNameCacheEntry *entry) const {
128  entry->set_uuid(it->first);
129  entry->set_obj_type(it->second.obj_type);
130  entry->set_fq_name(it->second.fq_name);
131  entry->set_deleted(it->second.deleted);
132 }
133 
135  const string &search_string, const string &last_uuid,
136  uint32_t num_entries,
137  vector<ConfigDBFQNameCacheEntry> *entries) const {
138  uint32_t count = 0;
139  bool more = false;
140  regex search_expr(search_string);
141  tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
142  for (FQNameCacheMap::const_iterator it =
143  fq_name_cache_.upper_bound(last_uuid);
144  it != fq_name_cache_.end(); it++) {
145  if (regex_search(it->first, search_expr) ||
146  regex_search(it->second.obj_type, search_expr) ||
147  regex_search(it->second.fq_name, search_expr)) {
148  if (++count > num_entries) {
149  more = true;
150  break;
151  }
152  ConfigDBFQNameCacheEntry entry;
153  FillFQNameCacheInfo(it->first, it, &entry);
154  entries->push_back(entry);
155  }
156  }
157  return more;
158 }
159 
161  client_connection_up_ = false;
163 }
164 
166  bool force) {
167  bool previous_status =
168  client_connection_up_.fetch_and_store(success);
169  if ((previous_status == success) && !force) {
170  return;
171  }
172 
174 }
175 
176 void ConfigDbClient::GetConnectionInfo(ConfigDBConnInfo &status) const {
177  status.cluster = boost::algorithm::join(config_db_ips(), ", ");
178  status.connection_status = client_connection_up_;
179  status.connection_status_change_at =
181  return;
182 }
183 
185  return false;
186 }
187 
189 }
virtual void InvalidateFQNameCache(const std::string &uuid)
virtual void GetConnectionInfo(ConfigDBConnInfo &status) const
virtual ~ConfigDbClient()
std::vector< int > config_db_ports_
bool stringToInteger(const std::string &str, NumberType &num)
Definition: string_util.h:71
const std::string & config_db_user() const
ConfigDbClient(ConfigClientManager *mgr, EventManager *evm, const ConfigClientOptions &options)
virtual void StartWatcher()
ObjTypeFQNPair UUIDToFQName(const std::string &uuid_str, bool deleted_ok=true) const
static const int kNumEntriesToRead
boost::uuids::uuid uuid
FQNameCacheMap fq_name_cache_
virtual void InitConnectionInfo()
virtual void UpdateConnectionInfo(bool success, bool force)
std::pair< std::string, std::string > ObjTypeFQNPair
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)
static bool regex_match(const std::string &input, const regex &regex)
Definition: regex.h:34
virtual void PurgeFQNameCache(const std::string &uuid)
static Options options
std::string config_db_user_
virtual void FillFQNameCacheInfo(const std::string &uuid, FQNameCacheMap::const_iterator it, ConfigDBFQNameCacheEntry *entry) const
boost::tokenizer< boost::char_separator< char > > tokenizer
std::string config_db_password_
virtual bool IsTaskTriggered() const
const std::string & config_db_password() const
static bool regex_search(const std::string &input, const regex &regex)
Definition: regex.h:25
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 uint64_t UTCTimestampUsec()
Definition: time_util.h:13
std::vector< std::string > config_db_server_list
virtual std::string FindFQName(const std::string &uuid) const
std::vector< std::string > config_db_ips_
int GetFirstConfigDbPort() const
virtual uint32_t GetNumReadRequestToBunch() const
tbb::atomic< bool > client_connection_up_
static EventManager evm
tbb::spin_rw_mutex rw_mutex_
static std::string UTCUsecToString(uint64_t tstamp)
Definition: time_util.h:54