7 #include <boost/algorithm/string.hpp>
8 #include <boost/bind.hpp>
9 #include <boost/format.hpp>
17 #include "ifmap/ifmap_agent_types.h"
25 :
IFMapTable(db, name, graph), pre_filter_(NULL) {
29 unique_ptr<DBEntry> entry(
30 new IFMapNode(const_cast<IFMapAgentTable *>(
this)));
42 unique_ptr<DBEntry> entry(
new IFMapNode(table));
50 string name = node_name;
51 std::replace(name.begin(), name.end(),
'-',
'_');
52 name =
"__ifmap__." + name +
".0";
85 static_cast<const IFMapNode *
>(key.release()));
103 assert(ltable != NULL);
110 edge = iter.operator->();
115 assert(origin_exists);
118 req_key->left_key.id_name = node->
name();
120 req_key->left_key.id_seq_num = seq;
122 req_key->right_key.id_name = right->
name();
124 req_key->right_key.id_seq_num = seq;
129 req.
key = std::move(req_key);
134 ltable->
DelLink(node, right, edge);
167 std::list<DeferredNode>::iterator it;
169 std::list<DeferredNode> *left = NULL;
172 left = left_it->second;
174 std::list<DeferredNode> *right = NULL;
177 right = right_it->second;
183 for(it = left->begin(); it != left->end(); it++) {
195 for(it = right->begin(); it != right->end(); it++) {
208 bool push_left =
true;
213 for(it = left->begin(); it != left->end(); it++) {
217 (*it).link_metadata = key->
metadata;
223 left =
new std::list<DeferredNode>();
227 bool push_right =
true;
231 for(it = right->begin(); it != right->end(); it++) {
235 (*it).link_metadata = key->
metadata;
241 right =
new std::list<DeferredNode>();
254 right->push_back(dn);
269 "Table " + key->
id_type +
" not found");
276 if (table->
pre_filter_(table, node, request) ==
false) {
278 "Node " + key->
id_name +
" neglected as filter"
285 "Node " + key->
id_name +
"ID_PERMS Null");
292 "Node " + key->
id_name +
" not found in Delete");
298 "Node " + key->
id_name +
" already deleted");
343 node != NULL; node = next) {
345 if (node->IsDeleted()) {
356 const std::string &metadata) {
360 assert(table != NULL);
362 return (link ? (link->
IsDeleted() ? NULL : link) : NULL);
366 const std::string &metadata,
371 assert(table != NULL);
381 assert(table != NULL);
382 table->
DeleteLink(static_cast<IFMapLink *>(edge));
435 "list as left is deleted marked");
445 "list as right is deleted marked");
453 "IFMap Link " + left->
name() + right->
name() +
454 " with wrong seq number");
462 "IFMap Link " + left->
name() + right->
name() +
463 " with wrong seq number");
488 std::list<DeferredNode>::iterator *list_it) {
490 std::list<DeferredNode> *list = map_it->second;
492 list->erase(*list_it);
510 LinkDefMap::iterator link_defmap_it =
link_def_map_.find(*key);
514 std::list<DeferredNode> *left_list = link_defmap_it->second;
515 std::list<DeferredNode>::iterator left_it, left_list_entry;
516 for(left_it = left_list->begin(); left_it != left_list->end();) {
517 left_list_entry = left_it++;
520 if ((*left_list_entry).node_key.id_seq_num < key->
id_seq_num)
525 &((*left_list_entry).node_key));
537 LinkDefMap::iterator right_defmap_it =
541 std::list<DeferredNode> *right_list = right_defmap_it->second;
542 std::list<DeferredNode>::iterator right_it, right_list_entry;
543 bool removed_something =
false;
544 for(right_it = right_list->begin(); right_it !=
545 right_list->end(); right_it++) {
548 if ((*right_it).node_key.id_seq_num < key->
id_seq_num)
551 if ((*right_it).node_key.id_type == key->
id_type &&
552 (*right_it).node_key.id_name == key->
id_name) {
554 removed_something =
true;
560 assert(removed_something);
563 unique_ptr <RequestKey> req_key (
new RequestKey);
564 req_key->left_key = *key;
565 req_key->right_key = (*left_list_entry).node_key;
566 req_key->metadata = (*left_list_entry).link_metadata;
568 left_list->erase(left_list_entry);
571 req.
key = std::move(req_key);
581 std::list<DeferredNode> *ent;
582 std::list<DeferredNode>::iterator it, list_entry;
583 IFMapAgentLinkTable::LinkDefMap::iterator dlist_it, temp;
588 for(it = ent->begin(); it != ent->end();) {
592 if ((*list_entry).node_key.id_seq_num < seq) {
594 &list_entry) ==
true) {
615 "IFMap Config Audit start:");
656 "Deleting node " + node->
name());
669 return "IFMapAgentStaleCleaner::IFMapAgentStaleCleanerWorker";
682 db_(db), graph_(graph) {
void EvalDefLink(IFMapTable::RequestKey *key)
edge_iterator edge_list_begin()
IFMapTable::RequestKey node_key
const DBGraph * graph() const
#define IFMAP_AGENT_TRACE(obj,...)
void UpdateProperties(const IFMapOrigin &in_origin, uint64_t sequence_number)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
virtual void Input(DBTablePartition *partition, DBClient *client, DBRequest *req)
const std::string & metadata() const
void IFMapAgentLinkTable_Init(DB *db, DBGraph *graph)
~IFMapAgentStaleCleaner()
void Remove(IFMapObject *obj)
DBTableBase * CreateTable(const std::string &name)
IFMapNode * EntryLocate(IFMapNode *node, RequestKey *key)
IFMapLink::LinkOriginInfo GetOriginInfo(IFMapOrigin::Origin in_origin, bool *exists)
virtual DBEntry * GetNext(const DBEntryBase *entry)
IFMapNode * EntryLookup(RequestKey *key)
std::map< IFMapTable::RequestKey, std::list< DeferredNode > *, comp > LinkDefMap
IFMapAgentLinkTable(DB *db, const std::string &name, DBGraph *graph)
std::unique_ptr< DBRequestData > data
virtual const char * Typename() const =0
bool Enqueue(DBRequest *req)
static DBTable * CreateTable(DB *db, const std::string &name, DBGraph *graph)
void DeleteLink(IFMapLink *link, const IFMapOrigin &origin)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
void Delete(DBEntryBase *)
bool HasAdjacencies(DBGraph *graph) const
IFMapLink * FindLink(const std::string &metadata, IFMapNode *left, IFMapNode *right)
vertex_iterator vertex_list_begin()
bool Run()
Code to execute. Returns true if task is completed. Return false to reschedule the task...
virtual void Change(DBEntry *entry)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const
vertex_iterator vertex_list_end()
edge_iterator edge_list_end()
IFMapLink * AddLink(IFMapNode *left, IFMapNode *right, const std::string &metadata, uint64_t sequence_number, const IFMapOrigin &origin)
IFMapTable::RequestKey right_key
void DestroyDefLink(uint64_t)
void AddNode(DBGraphVertex *entry)
uint64_t sequence_number()
DBGraphVertex * target() const
void DelLink(IFMapNode *first, IFMapNode *second, DBGraphEdge *edge)
static TaskScheduler * GetInstance()
void Enqueue(Task *task)
Enqueues a task for running. Starts task if all policy rules are met else puts task in waitq...
IFMapLink * FindLink(IFMapNode *left, IFMapNode *right, const std::string &metadata)
uint64_t sequence_number(IFMapOrigin::Origin in_origin, bool *exists)
std::unique_ptr< DBRequestKey > key
void Insert(IFMapObject *obj)
void RemoveNode(DBGraphVertex *entry)
void DeleteNode(IFMapNode *node)
IFMapAgentStaleCleanerWorker(DB *db, DBGraph *graph, uint64_t seq)
void HandlePendingLinks(IFMapNode *)
const std::string & name() const
void set_sequence_number(uint64_t sequence_number)
const std::string & name() const
Edge Link(DBGraphVertex *lhs, DBGraphVertex *rhs, DBGraphEdge *link)
void NotifyNode(IFMapNode *node)
static void ClearTables(DB *db)
IFMapAgentTable(DB *db, const std::string &name, DBGraph *graph)
bool StaleTimeout(uint64_t)
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
IFMapObject * GetObject()
static IFMapTable * FindTable(DB *db, const std::string &element_type)
IFMapAgentStaleCleaner(DB *db, DBGraph *graph)
std::unique_ptr< IFMapObject > content
#define IFMAP_AGENT_LINK_DB_NAME
bool HasListeners() const
IFMapTable::RequestKey left_key
DBEntry * Find(const DBEntry *entry)
static IFMapNode * TableEntryLookup(DB *db, RequestKey *key)
edge_iterator edge_list_end(DBGraph *graph)
void AddLink(IFMapNode *left, IFMapNode *right, const std::string &metadata, uint64_t seq)
virtual DBEntry * GetFirst()
virtual void Add(DBEntry *entry)
IFMapAgentTable * TableFind(const std::string &node_name)
boost::tuple< DBGraphVertex *, DBGraphVertex *, DBGraphEdge * > DBEdgeInfo
void Notify(DBEntryBase *entry)
void LinkDefAdd(DBRequest *request)
Task is a wrapper over tbb::task to support policies.
std::string Description() const
bool RemoveDefListEntry(LinkDefMap *map, LinkDefMap::iterator &map_it, std::list< DeferredNode >::iterator *list_it)
SandeshTraceBufferPtr IFMapAgentTraceBuf
DBTableBase * FindTable(const std::string &name)
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
edge_iterator edge_list_begin(DBGraph *graph)
static void RegisterFactory(const std::string &prefix, CreateFunction create_fn)
virtual void Input(DBTablePartition *partition, DBClient *client, DBRequest *req)
std::string link_metadata