Skip to content

Commit

Permalink
Introspect for config client
Browse files Browse the repository at this point in the history
Introduce introspect pages for config cassandra client for following data
    1. FQName Cache
    2. Object Cache

Added test cases for introspect validation

TODO: Basic test for ReqIterate is added for both the request. Need to add test
for bulk data to validate batching.

Related-bug: #1632470

Change-Id: I4992047fc34af2dab4b825c9186d7969c65e933e
  • Loading branch information
bailkeri committed Apr 11, 2017
1 parent f4c1e63 commit 129ba5c
Show file tree
Hide file tree
Showing 7 changed files with 908 additions and 4 deletions.
100 changes: 98 additions & 2 deletions src/ifmap/client/config_cassandra_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,18 @@ ConfigCassandraPartition *ConfigCassandraClient::GetPartition(const string &uuid
return partitions_[worker_id];
}

const ConfigCassandraPartition *ConfigCassandraClient::GetPartition(
const string &uuid) const {
int worker_id = HashUUID(uuid);
return partitions_[worker_id];
}

const ConfigCassandraPartition *ConfigCassandraClient::GetPartition(
int worker_id) const {
assert(worker_id < num_workers_);
return partitions_[worker_id];
}

int ConfigCassandraClient::HashUUID(const string &uuid_str) const {
boost::hash<string> string_hash;
return string_hash(uuid_str) % num_workers_;
Expand Down Expand Up @@ -427,7 +439,7 @@ void ConfigCassandraClient::AddFQNameCache(const string &uuid,

void ConfigCassandraClient::InvalidateFQNameCache(const string &uuid) {
tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
map<string, FQNameCacheType>::iterator it = fq_name_cache_.find(uuid);
FQNameCacheMap::iterator it = fq_name_cache_.find(uuid);
if (it != fq_name_cache_.end()) {
it->second.deleted = true;
}
Expand All @@ -442,7 +454,7 @@ void ConfigCassandraClient::PurgeFQNameCache(const string &uuid) {
ConfigCassandraClient::ObjTypeFQNPair ConfigCassandraClient::UUIDToFQName(
const string &uuid, bool deleted_ok) const {
tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
map<string, FQNameCacheType>::const_iterator it = fq_name_cache_.find(uuid);
FQNameCacheMap::const_iterator it = fq_name_cache_.find(uuid);
if (it != fq_name_cache_.end()) {
if (!it->second.deleted || (it->second.deleted && deleted_ok)) {
return make_pair(it->second.obj_type, it->second.obj_name);
Expand All @@ -451,6 +463,51 @@ ConfigCassandraClient::ObjTypeFQNPair ConfigCassandraClient::UUIDToFQName(
return make_pair("ERROR", "ERROR");
}

void ConfigCassandraClient::FillFQNameCacheInfo(const string &uuid,
FQNameCacheMap::const_iterator it, ConfigDBFQNameCacheEntry &entry) const {
entry.set_uuid(it->first);
entry.set_obj_type(it->second.obj_type);
entry.set_fq_name(it->second.obj_name);
entry.set_deleted(it->second.deleted);
}

bool ConfigCassandraClient::UUIDToFQNameShow(const string &uuid,
ConfigDBFQNameCacheEntry &entry) const {
tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
FQNameCacheMap::const_iterator it = fq_name_cache_.find(uuid);
if (it == fq_name_cache_.end()) {
return false;
}
FillFQNameCacheInfo(uuid, it, entry);
return true;
}

bool ConfigCassandraClient::UUIDToFQNameShow(const string &start_uuid,
uint32_t num_entries, vector<ConfigDBFQNameCacheEntry> &entries) const {
uint32_t count = 0;
tbb::spin_rw_mutex::scoped_lock read_lock(rw_mutex_, false);
for(FQNameCacheMap::const_iterator it =
fq_name_cache_.upper_bound(start_uuid);
count < num_entries && it != fq_name_cache_.end(); it++, count++) {
ConfigDBFQNameCacheEntry entry;
FillFQNameCacheInfo(it->first, it, entry);
entries.push_back(entry);
}
return true;
}

bool ConfigCassandraClient::UUIDToObjCacheShow(int inst_num, const string &uuid,
ConfigDBUUIDCacheEntry &entry) const {
return GetPartition(inst_num)->UUIDToObjCacheShow(uuid, entry);
}

bool ConfigCassandraClient::UUIDToObjCacheShow(int inst_num,
const string &start_uuid, uint32_t num_entries,
vector<ConfigDBUUIDCacheEntry> &entries) const {
return GetPartition(inst_num)->UUIDToObjCacheShow(start_uuid,
num_entries, entries);
}

void ConfigCassandraClient::EnqueueUUIDRequest(string oper, string obj_type,
string uuid_str) {
ObjectProcessReq *req = new ObjectProcessReq(oper, obj_type, uuid_str);
Expand Down Expand Up @@ -823,3 +880,42 @@ void ConfigCassandraPartition::MarkCacheDirty(const string &uuid) {
it->second.second = false;
}
}

void ConfigCassandraPartition::FillUUIDToObjCacheInfo(const string &uuid,
ObjectCacheMap::const_iterator uuid_iter,
ConfigDBUUIDCacheEntry &entry) const {
entry.set_uuid(uuid);
vector<ConfigDBUUIDCacheData> fields;
for (FieldDetailMap::const_iterator it = uuid_iter->second.begin();
it != uuid_iter->second.end(); it++) {
ConfigDBUUIDCacheData each_field;
each_field.set_refresh(it->second.second);
each_field.set_field_name(it->first);
each_field.set_timestamp(UTCUsecToString(it->second.first));
fields.push_back(each_field);
}
entry.set_field_list(fields);
}

bool ConfigCassandraPartition::UUIDToObjCacheShow(const string &uuid,
ConfigDBUUIDCacheEntry &entry) const {
ObjectCacheMap::const_iterator uuid_iter = object_cache_map_.find(uuid);
if (uuid_iter == object_cache_map_.end()) {
return false;
}
FillUUIDToObjCacheInfo(uuid, uuid_iter, entry);
return true;
}

bool ConfigCassandraPartition::UUIDToObjCacheShow(const string &start_uuid,
uint32_t num_entries, vector<ConfigDBUUIDCacheEntry> &entries) const {
uint32_t count = 0;
for(ObjectCacheMap::const_iterator it =
object_cache_map_.upper_bound(start_uuid);
count < num_entries && it != object_cache_map_.end(); it++, count++) {
ConfigDBUUIDCacheEntry entry;
FillUUIDToObjCacheInfo(it->first, it, entry);
entries.push_back(entry);
}
return true;
}
31 changes: 31 additions & 0 deletions src/ifmap/client/config_cassandra_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ struct ConfigDBConnInfo;
class TaskTrigger;
class ConfigCassandraClient;
struct ConfigCassandraParseContext;
class ConfigDBFQNameCacheEntry;
class ConfigDBUUIDCacheEntry;

class ObjectProcessReq {
public:
Expand Down Expand Up @@ -60,6 +62,13 @@ class ConfigCassandraPartition {

void Enqueue(ObjectProcessReq *req);

bool UUIDToObjCacheShow(const std::string &uuid,
ConfigDBUUIDCacheEntry &entry) const;

bool UUIDToObjCacheShow(const std::string &start_uuid,
uint32_t num_entries,
std::vector<ConfigDBUUIDCacheEntry> &entries) const;

private:
friend class ConfigCassandraClient;

Expand Down Expand Up @@ -97,6 +106,10 @@ class ConfigCassandraPartition {
return config_client_;
}

void FillUUIDToObjCacheInfo(const std::string &uuid,
ObjectCacheMap::const_iterator uuid_iter,
ConfigDBUUIDCacheEntry &entry) const;

ObjProcessWorkQType obj_process_queue_;
UUIDProcessSet uuid_read_set_;
ObjectCacheMap object_cache_map_;
Expand Down Expand Up @@ -148,6 +161,8 @@ class ConfigCassandraClient : public ConfigDbClient {
ConfigClientManager *mgr() { return mgr_; }
const ConfigClientManager *mgr() const { return mgr_; }
ConfigCassandraPartition *GetPartition(const std::string &uuid);
const ConfigCassandraPartition *GetPartition(const std::string &uuid) const;
const ConfigCassandraPartition *GetPartition(int worker_id) const;

void EnqueueUUIDRequest(std::string oper, std::string obj_type,
std::string uuid_str);
Expand All @@ -164,6 +179,20 @@ class ConfigCassandraClient : public ConfigDbClient {
virtual void InvalidateFQNameCache(const std::string &uuid);
void PurgeFQNameCache(const std::string &uuid);

virtual bool UUIDToFQNameShow(const std::string &uuid,
ConfigDBFQNameCacheEntry &entry) const;

virtual bool UUIDToFQNameShow(const std::string &start_uuid,
uint32_t num_entries,
std::vector<ConfigDBFQNameCacheEntry> &entries) const;

virtual bool UUIDToObjCacheShow(int inst_num, const std::string &uuid,
ConfigDBUUIDCacheEntry &entry) const;

virtual bool UUIDToObjCacheShow(int inst_num, const std::string &start_uuid,
uint32_t num_entries,
std::vector<ConfigDBUUIDCacheEntry> &entries) const;

protected:
typedef std::pair<std::string, std::string> ObjTypeUUIDType;
typedef std::list<ObjTypeUUIDType> ObjTypeUUIDList;
Expand Down Expand Up @@ -233,6 +262,8 @@ class ConfigCassandraClient : public ConfigDbClient {
std::string *last_column);

void HandleCassandraConnectionStatus(bool success);
void FillFQNameCacheInfo(const std::string &uuid,
FQNameCacheMap::const_iterator it, ConfigDBFQNameCacheEntry &entry) const;

ConfigClientManager *mgr_;
EventManager *evm_;
Expand Down
13 changes: 13 additions & 0 deletions src/ifmap/client/config_db_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

struct IFMapConfigOptions;
struct ConfigDBConnInfo;
struct ConfigDBFQNameCacheEntry;
struct ConfigDBUUIDCacheEntry;
/*
* This is the base class for interactions with a database that stores the user
* configuration.
Expand All @@ -35,9 +37,20 @@ class ConfigDbClient {
virtual void AddFQNameCache(const std::string &uuid,
const std::string &obj_type, const std::string &fq_name) = 0;
virtual void InvalidateFQNameCache(const std::string &uuid) = 0;
virtual bool UUIDToFQNameShow(const std::string &uuid,
ConfigDBFQNameCacheEntry &entry) const = 0;
virtual bool UUIDToFQNameShow(const std::string &start_uuid,
uint32_t num_entries,
std::vector<ConfigDBFQNameCacheEntry> &entries) const = 0;

virtual void GetConnectionInfo(ConfigDBConnInfo &status) const = 0;

virtual bool UUIDToObjCacheShow(int inst_num, const std::string &uuid,
ConfigDBUUIDCacheEntry &entry) const = 0;
virtual bool UUIDToObjCacheShow(int inst_num, const std::string &start_uuid,
uint32_t num_entries,
std::vector<ConfigDBUUIDCacheEntry> &entries) const = 0;

private:
std::string config_db_user_;
std::string config_db_password_;
Expand Down

0 comments on commit 129ba5c

Please sign in to comment.