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(
42 unique_ptr<DBEntry> entry(
new IFMapNode(table));
50 string name = node_name;
51 std::replace(
name.begin(),
name.end(),
'-',
'_');
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);
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");
487 (
LinkDefMap *map, LinkDefMap::iterator &map_it,
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) {
const DBGraph * graph() const
DBGraphVertex * target() const
edge_iterator edge_list_begin(DBGraph *graph)
bool HasAdjacencies(DBGraph *graph) const
edge_iterator edge_list_end(DBGraph *graph)
edge_iterator edge_list_begin()
boost::tuple< DBGraphVertex *, DBGraphVertex *, DBGraphEdge * > DBEdgeInfo
vertex_iterator vertex_list_begin()
Edge Link(DBGraphVertex *lhs, DBGraphVertex *rhs, DBGraphEdge *link)
edge_iterator edge_list_end()
void RemoveNode(DBGraphVertex *entry)
vertex_iterator vertex_list_end()
void AddNode(DBGraphVertex *entry)
bool Enqueue(DBRequest *req)
bool HasListeners() const
const std::string & name() const
void Notify(DBEntryBase *entry)
void Delete(DBEntryBase *)
virtual void Change(DBEntry *entry)
virtual void Add(DBEntry *entry)
virtual DBEntry * GetNext(const DBEntryBase *entry)
virtual DBEntry * GetFirst()
DBEntry * Find(const DBEntry *entry)
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
static void RegisterFactory(const std::string &prefix, CreateFunction create_fn)
DBTableBase * FindTable(const std::string &name)
DBTableBase * CreateTable(const std::string &name)
virtual void Input(DBTablePartition *partition, DBClient *client, DBRequest *req)
std::map< IFMapTable::RequestKey, std::list< DeferredNode > *, comp > LinkDefMap
static DBTable * CreateTable(DB *db, const std::string &name, DBGraph *graph)
IFMapLink * FindLink(IFMapNode *left, IFMapNode *right, const std::string &metadata)
void DestroyDefLink(uint64_t)
bool RemoveDefListEntry(LinkDefMap *map, LinkDefMap::iterator &map_it, std::list< DeferredNode >::iterator *list_it)
void DelLink(IFMapNode *first, IFMapNode *second, DBGraphEdge *edge)
IFMapAgentLinkTable(DB *db, const std::string &name, DBGraph *graph)
void AddLink(IFMapNode *left, IFMapNode *right, const std::string &metadata, uint64_t seq)
void LinkDefAdd(DBRequest *request)
void EvalDefLink(IFMapTable::RequestKey *key)
IFMapAgentStaleCleanerWorker(DB *db, DBGraph *graph, uint64_t seq)
bool Run()
Code to execute. Returns true if task is completed. Return false to reschedule the task.
std::string Description() const
~IFMapAgentStaleCleaner()
bool StaleTimeout(uint64_t)
IFMapAgentStaleCleaner(DB *db, DBGraph *graph)
IFMapNode * EntryLocate(IFMapNode *node, RequestKey *key)
IFMapNode * EntryLookup(RequestKey *key)
IFMapAgentTable * TableFind(const std::string &node_name)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const
void NotifyNode(IFMapNode *node)
static IFMapNode * TableEntryLookup(DB *db, RequestKey *key)
void DeleteNode(IFMapNode *node)
virtual void Input(DBTablePartition *partition, DBClient *client, DBRequest *req)
IFMapAgentTable(DB *db, const std::string &name, DBGraph *graph)
void HandlePendingLinks(IFMapNode *)
IFMapLink * FindLink(const std::string &metadata, IFMapNode *left, IFMapNode *right)
IFMapLink * AddLink(IFMapNode *left, IFMapNode *right, const std::string &metadata, uint64_t sequence_number, const IFMapOrigin &origin)
void DeleteLink(IFMapLink *link, const IFMapOrigin &origin)
void UpdateProperties(const IFMapOrigin &in_origin, uint64_t sequence_number)
const std::string & metadata() const
IFMapLink::LinkOriginInfo GetOriginInfo(IFMapOrigin::Origin in_origin, bool *exists)
uint64_t sequence_number(IFMapOrigin::Origin in_origin, bool *exists)
void Remove(IFMapObject *obj)
const std::string & name() const
IFMapObject * GetObject()
void Insert(IFMapObject *obj)
uint64_t sequence_number()
void set_sequence_number(uint64_t sequence_number)
static IFMapTable * FindTable(DB *db, const std::string &element_type)
virtual const char * Typename() const =0
static void ClearTables(DB *db)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
void Enqueue(Task *task)
Enqueues a task for running. Starts task if all policy rules are met else puts task in waitq....
static TaskScheduler * GetInstance()
Task is a wrapper over tbb::task to support policies.
void IFMapAgentLinkTable_Init(DB *db, DBGraph *graph)
SandeshTraceBufferPtr IFMapAgentTraceBuf(SandeshTraceBufferCreate("IFMapAgentTrace", 1000))
#define IFMAP_AGENT_TRACE(obj,...)
#define IFMAP_AGENT_LINK_DB_NAME
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
std::unique_ptr< DBRequestKey > key
std::unique_ptr< DBRequestData > data
std::string link_metadata
IFMapTable::RequestKey node_key
IFMapTable::RequestKey left_key
IFMapTable::RequestKey right_key
std::unique_ptr< IFMapObject > content