OpenSDN source code
ifmap_graph_walker.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
6 
7 #include <boost/assign/list_of.hpp>
8 #include <boost/bind/bind.hpp>
9 
10 #include "base/logging.h"
11 #include "base/task_trigger.h"
12 #include "db/db_graph.h"
13 #include "db/db_table.h"
14 #include "ifmap/ifmap_client.h"
15 #include "ifmap/ifmap_exporter.h"
16 #include "ifmap/ifmap_link.h"
17 #include "ifmap/ifmap_log.h"
18 #include "ifmap/ifmap_table.h"
19 #include "ifmap/ifmap_server.h"
20 #include "ifmap/ifmap_log_types.h"
21 #include "ifmap/ifmap_update.h"
22 #include "ifmap/ifmap_util.h"
23 #include "schema/vnc_cfg_types.h"
24 
25 using boost::assign::list_of;
26 using boost::assign::map_list_of;
27 using std::set;
28 using std::string;
29 using namespace boost::placeholders;
30 
32 public:
34  const IFMapTypenameWhiteList *type_filter,
35  const BitSet &bitset)
36  : exporter_(exporter),
37  type_filter_(type_filter),
38  bset_(bitset) {
39  }
40 
41  bool VertexFilter(const DBGraphVertex *vertex) const {
42  return type_filter_->VertexFilter(vertex);
43  }
44 
45  bool EdgeFilter(const DBGraphVertex *source, const DBGraphVertex *target,
46  const DBGraphEdge *edge) const {
47  const IFMapNode *tgt = static_cast<const IFMapNode *>(target);
48  const IFMapNodeState *state = NodeStateLookup(tgt);
49  if (state != NULL && state->interest().Contains(bset_)) {
50  return false;
51  }
52 
53  return true;
54  }
55 
56  const IFMapNodeState *NodeStateLookup(const IFMapNode *node) const {
57  const DBTable *table = node->table();
58  const DBState *state =
59  node->GetState(table, exporter_->TableListenerId(table));
60  return static_cast<const IFMapNodeState *>(state);
61  }
62 
64  const DBGraphVertex *vertex) const {
65  return type_filter_->AllowedEdges(vertex);
66  }
67 private:
70  const BitSet &bset_;
71 };
72 
74  : graph_(graph),
75  exporter_(exporter),
76  link_delete_walk_trigger_(new TaskTrigger(
77  boost::bind(&IFMapGraphWalker::LinkDeleteWalk, this),
78  TaskScheduler::GetInstance()->GetTaskId("db::IFMapTable"), 0)),
79  walk_client_index_(BitSet::npos) {
82 }
83 
85 }
86 
88  DBTable *table = exporter_->link_table();
89  table->Change(edge);
90 }
91 
93  IFMapNode *node = static_cast<IFMapNode *>(vertex);
95  IFMAP_DEBUG(JoinVertex, vertex->ToString(), state->interest().ToString(),
96  bset.ToString());
97  exporter_->StateInterestOr(state, bset);
98  node->table()->Change(node);
99 }
100 
102  const BitSet &bset) {
104  graph_->Visit(rnode,
105  boost::bind(&IFMapGraphWalker::JoinVertex, this, _1, bset),
106  boost::bind(&IFMapGraphWalker::NotifyEdge, this, _1, bset),
107  filter);
108 }
109 
110 void IFMapGraphWalker::LinkAdd(IFMapLink *link, IFMapNode *lnode, const BitSet &lhs,
111  IFMapNode *rnode, const BitSet &rhs) {
112  IFMAP_DEBUG(LinkOper, "LinkAdd", lnode->ToString(), rnode->ToString(),
113  lhs.ToString(), rhs.ToString());
114 
115  // Ensure that nodes are passed are indeed nodes and not links.
116  assert(dynamic_cast<IFMapNode *>(lnode));
117  assert(dynamic_cast<IFMapNode *>(rnode));
118 
119  assert(!dynamic_cast<IFMapLink *>(lnode));
120  assert(!dynamic_cast<IFMapLink *>(rnode));
121 
122  if (!lhs.empty() && !rhs.Contains(lhs) &&
123  traversal_white_list_->VertexFilter(rnode) &&
124  traversal_white_list_->EdgeFilter(lnode, rnode, link)) {
125  ProcessLinkAdd(lnode, rnode, lhs);
126  }
127  if (!rhs.empty() && !lhs.Contains(rhs) &&
128  traversal_white_list_->VertexFilter(lnode) &&
129  traversal_white_list_->EdgeFilter(rnode, lnode, link)) {
130  ProcessLinkAdd(rnode, lnode, rhs);
131  }
132 }
133 
135  OrLinkDeleteClients(bset); // link_delete_clients_ | bset
137 }
138 
139 // Check if the neighbor or link to neighbor should be filtered. Returns true
140 // if rnode or link to rnode should be filtered.
142  IFMapNode *rnode = link->left();
143  if (rnode == lnode)
144  rnode = link->right();
145  if (!traversal_white_list_->VertexFilter(rnode) ||
146  !traversal_white_list_->EdgeFilter(lnode, NULL, link)) {
147  return true;
148  }
149  return false;
150 }
151 
153  IFMapNode *node = static_cast<IFMapNode *>(vertex);
154  IFMapNodeState *state = exporter_->NodeStateLocate(node);
155  state->nmask_set(bit);
156  UpdateNewReachableNodesTracker(bit, state);
157 }
158 
160  if (link_delete_clients_.empty()) {
162  return true;
163  }
164 
165  IFMapServer *server = exporter_->server();
166  size_t i;
167 
168  // Get the index of the client we want to start with.
171  } else {
172  // walk_client_index_ was the last client that we finished processing.
174  }
175  int count = 0;
176  BitSet done_set;
177  while (i != BitSet::npos) {
178  IFMapClient *client = server->GetClient(i);
179  assert(client);
181 
182  IFMapTable *table = IFMapTable::FindTable(server->database(),
183  "virtual-router");
184  IFMapNode *node = table->FindNode(client->identifier());
185  if ((node != NULL) && node->IsVertexValid()) {
186  graph_->Visit(node,
187  boost::bind(&IFMapGraphWalker::RecomputeInterest, this, _1, i),
188  0, *traversal_white_list_.get());
189  }
190  done_set.set(i);
191  if (++count == kMaxLinkDeleteWalks) {
192  // client 'i' has been processed. If 'i' is the last bit set, we
193  // will return true below. Else we will return false and there
194  // is atleast one more bit left to process.
195  break;
196  }
197 
199  }
200  // Remove the subset of clients that we have finished processing.
201  ResetLinkDeleteClients(done_set);
202 
203  LinkDeleteWalkBatchEnd(done_set);
204 
205  if (link_delete_clients_.empty()) {
207  return true;
208  } else {
209  walk_client_index_ = i;
210  return false;
211  }
212 }
213 
215  link_delete_clients_.Set(bset); // link_delete_clients_ | bset
216 }
217 
220 }
221 
222 void IFMapGraphWalker::CleanupInterest(int client_index, IFMapNode *node,
223  IFMapNodeState *state) {
224  BitSet rm_mask;
225  rm_mask.set(client_index);
226 
227  // interest = interest - rm_mask + nmask
228 
229  if (!state->interest().empty() && !state->nmask().empty()) {
231  state->interest().ToString(), rm_mask.ToString(),
232  state->nmask().ToString());
233  }
234  BitSet ninterest;
235  ninterest.BuildComplement(state->interest(), rm_mask);
236  ninterest |= state->nmask();
237  state->nmask_clear();
238  if (state->interest() == ninterest) {
239  return;
240  }
241 
242  exporter_->StateInterestSet(state, ninterest);
243  node->table()->Change(node);
244 
245  // Mark all dependent links as potentially modified.
246  for (IFMapNodeState::iterator iter = state->begin();
247  iter != state->end(); ++iter) {
248  DBTable *table = exporter_->link_table();
249  table->Change(iter.operator->());
250  }
251 }
252 
253 // Cleanup all the graph nodes that were reachable before this link delete.
254 // After this link delete, these nodes may still be reachable. But, its
255 // also possible that the link delete has made them unreachable.
257  IFMapState *state = NULL;
258  IFMapNode *node = NULL;
260  IFMapExporter::INTEREST, client_index);
262  IFMapExporter::INTEREST, client_index);
263 
264  while (iter != end_iter) {
265  state = *iter;
266  // Get the iterator to the next element before calling
267  // CleanupInterest() since the state might be removed from the
268  // client's config-tracker, thereby invalidating the iterator of the
269  // container we are iterating over.
270  ++iter;
271  if (state->IsNode()) {
272  node = state->GetIFMapNode();
273  assert(node);
274  IFMapNodeState *nstate = exporter_->NodeStateLookup(node);
275  assert(state == nstate);
276  CleanupInterest(client_index, node, nstate);
277  }
278  }
279 }
280 
281 // Cleanup all the graph nodes that were not reachable before the link delete
282 // but are reachable now. Note, we store nodes in new_reachable_nodes_tracker_
283 // only if we visited them during the graph-walk via RecomputeInterest() and if
284 // their interest bit was not set i.e. they were not reachable before we
285 // started the walk.
287  IFMapState *state = NULL;
288  IFMapNode *node = NULL;
289  ReachableNodesSet *rnset = new_reachable_nodes_tracker_.at(client_index);
290 
291  for (Rns_citer iter = rnset->begin(); iter != rnset->end(); ++iter) {
292  state = *iter;
293  assert(state->IsNode());
294  node = state->GetIFMapNode();
295  assert(node);
296  IFMapNodeState *nstate = exporter_->NodeStateLookup(node);
297  assert(state == nstate);
298  CleanupInterest(client_index, node, nstate);
299  }
300  DeleteNewReachableNodesTracker(client_index);
301 }
302 
304  for (size_t i = done_set.find_first(); i != BitSet::npos;
305  i = done_set.find_next(i)) {
306  // Examine all the nodes that were reachable before the link delete.
308  // Examine all the nodes that were not reachable before the link
309  // delete but are now reachable.
311  }
312 }
313 
315  if (client_index >= (int)new_reachable_nodes_tracker_.size()) {
316  new_reachable_nodes_tracker_.resize(client_index + 1, NULL);
317  }
318  assert(new_reachable_nodes_tracker_[client_index] == NULL);
319  ReachableNodesSet *rnset = new ReachableNodesSet();
320  new_reachable_nodes_tracker_[client_index] = rnset;
321 }
322 
324  ReachableNodesSet *rnset = new_reachable_nodes_tracker_.at(client_index);
325  assert(rnset);
326  delete rnset;
327  new_reachable_nodes_tracker_[client_index] = NULL;
328 }
329 
330 // Keep track of this node if it was unreachable earlier.
332  IFMapState *state) {
333  ReachableNodesSet *rnset = new_reachable_nodes_tracker_.at(client_index);
334  assert(rnset);
335  // If the interest is not set, the node was not reachable earlier but is
336  // reachable now.
337  if (!state->interest().test(client_index)) {
338  rnset->insert(state);
339  }
340 }
341 
343  const {
344  return *traversal_white_list_.get();
345 }
346 
347 // The nodes listed below and the nodes in
348 // IFMapGraphTraversalFilterCalculator::CreateNodeBlackList() are mutually
349 // exclusive
351  traversal_white_list_->include_vertex = map_list_of<std::string, std::set<std::string> >
352  ("virtual-router",
353  list_of("physical-router-virtual-router")
354  ("virtual-router-virtual-machine")
355  ("virtual-router-network-ipam")
356  ("global-system-config-virtual-router")
357  ("provider-attachment-virtual-router")
358  ("virtual-router-virtual-machine-interface")
359  ("virtual-router-sub-cluster")
360  .convert_to_container<set<string> >())
361  ("virtual-router-network-ipam", list_of("virtual-router-network-ipam")
362  .convert_to_container<set<string> >())
363  ("virtual-machine",
364  list_of("virtual-machine-service-instance")
365  ("virtual-machine-interface-virtual-machine")
366  ("virtual-machine-tag")
367  .convert_to_container<set<string> >())
368  ("control-node-zone", set<string>())
369  ("sub-cluster",
370  list_of("bgp-router-sub-cluster")
371  .convert_to_container<set<string> >())
372  ("bgp-router",
373  list_of("instance-bgp-router")
374  ("physical-router-bgp-router")
375  ("bgp-router-control-node-zone")
376  .convert_to_container<set<string> >())
377  ("bgp-as-a-service",
378  list_of("bgpaas-bgp-router")
379  ("bgpaas-health-check")
380  ("bgpaas-control-node-zone")
381  .convert_to_container<set<string> >())
382  ("bgpaas-control-node-zone", list_of("bgpaas-control-node-zone")
383  .convert_to_container<set<string> >())
384  ("global-system-config",
385  list_of("global-system-config-global-vrouter-config")
386  ("global-system-config-global-qos-config")
387  ("global-system-config-bgp-router")
388  ("qos-config-global-system-config")
389  .convert_to_container<set<string> >())
390  ("provider-attachment", set<string>())
391  ("service-instance", list_of("service-instance-service-template")
392  ("service-instance-port-tuple")
393  .convert_to_container<set<string> >())
394  ("global-vrouter-config",
395  list_of("application-policy-set-global-vrouter-config")
396  ("global-vrouter-config-security-logging-object")
397  .convert_to_container<set<string> >())
398  ("virtual-machine-interface",
399  list_of("virtual-machine-virtual-machine-interface")
400  ("virtual-machine-interface-sub-interface")
401  ("instance-ip-virtual-machine-interface")
402  ("virtual-machine-interface-virtual-network")
403  ("virtual-machine-interface-security-group")
404  ("floating-ip-virtual-machine-interface")
405  ("alias-ip-virtual-machine-interface")
406  ("customer-attachment-virtual-machine-interface")
407  ("virtual-machine-interface-routing-instance")
408  ("virtual-machine-interface-route-table")
409  ("subnet-virtual-machine-interface")
410  ("service-port-health-check")
411  ("bgpaas-virtual-machine-interface")
412  ("virtual-machine-interface-qos-config")
413  ("virtual-machine-interface-bridge-domain")
414  ("virtual-machine-interface-security-logging-object")
415  ("project-virtual-machine-interface")
416  ("port-tuple-interface")
417  ("virtual-machine-interface-tag")
418  ("virtual-machine-interface-bgp-router")
419  .convert_to_container<set<string> >())
420  ("virtual-machine-interface-bridge-domain",
421  list_of("virtual-machine-interface-bridge-domain")
422  .convert_to_container<set<string> >())
423  ("security-group", list_of("security-group-access-control-list")
424  .convert_to_container<set<string> >())
425  ("physical-router",
426  list_of("physical-router-physical-interface")
427  ("physical-router-logical-interface")
428  ("physical-router-virtual-network")
429  .convert_to_container<set<string> >())
430  ("service-template", list_of("domain-service-template")
431  .convert_to_container<set<string> >())
432  ("instance-ip", list_of("instance-ip-virtual-network")
433  .convert_to_container<set<string> >())
434  ("virtual-network",
435  list_of("virtual-network-floating-ip-pool")
436  ("virtual-network-alias-ip-pool")
437  ("virtual-network-network-ipam")
438  ("virtual-network-access-control-list")
439  ("virtual-network-routing-instance")
440  ("virtual-network-qos-config")
441  ("virtual-network-bridge-domain")
442  ("virtual-network-security-logging-object")
443  ("virtual-network-tag")
444  ("virtual-network-provider-network")
445  ("virtual-network-multicast-policy")
446  ("vn-health-check")
447  ("host-based-service-virtual-network")
448  ("project-virtual-network")
449  .convert_to_container<set<string> >())
450  ("floating-ip", list_of("floating-ip-pool-floating-ip")
451  ("instance-ip-floating-ip").convert_to_container<set<string> >())
452  ("alias-ip", list_of("alias-ip-pool-alias-ip")
453  .convert_to_container<set<string> >())
454  ("customer-attachment", set<string>())
455  ("virtual-machine-interface-routing-instance",
456  list_of("virtual-machine-interface-routing-instance")
457  .convert_to_container<set<string> >())
458  ("physical-interface", list_of("physical-interface-logical-interface")
459  ("virtual-port-group-physical-interface")
460  .convert_to_container<set<string> >())
461  ("virtual-port-group-physical-interface",
462  list_of("virtual-port-group-physical-interface")
463  .convert_to_container<std::set<std::string> >())
464  ("virtual-port-group",
465  list_of("virtual-port-group-virtual-machine-interface")
466  ("virtual-port-group-physical-interface")
467  .convert_to_container<std::set<std::string> >())
468  ("domain", list_of("domain-namespace")("domain-virtual-DNS")
469  .convert_to_container<set<string> >())
470  ("floating-ip-pool", list_of("virtual-network-floating-ip-pool")
471  .convert_to_container<set<string> >())
472  ("alias-ip-pool", list_of("virtual-network-alias-ip-pool")
473  .convert_to_container<set<string> >())
474  ("logical-interface", list_of("logical-interface-virtual-machine-interface")
475  .convert_to_container<set<string> >())
476  ("logical-router-virtual-network", list_of("logical-router-virtual-network")
477  .convert_to_container<set<string> >())
478  ("logical-router", list_of("logical-router-virtual-network")
479  ("logical-router-interface")
480  .convert_to_container<set<string> >())
481  ("virtual-network-network-ipam", list_of("virtual-network-network-ipam")
482  .convert_to_container<set<string> >())
483  ("access-control-list", set<string>())
484  ("routing-instance", set<string>())
485  ("namespace", set<string>())
486  ("virtual-DNS", list_of("virtual-DNS-virtual-DNS-record")
487  .convert_to_container<set<string> >())
488  ("network-ipam", list_of("network-ipam-virtual-DNS")
489  .convert_to_container<set<string> >())
490  ("virtual-DNS-record", std::set<std::string>())
491  ("interface-route-table", std::set<std::string>())
492  ("subnet", std::set<std::string>())
493  ("service-health-check", std::set<std::string>())
494  ("qos-config", std::set<std::string>())
495  ("qos-queue", std::set<std::string>())
496  ("forwarding-class", list_of("forwarding-class-qos-queue")
497  .convert_to_container<set<string> >())
498  ("global-qos-config",
499  list_of("global-qos-config-forwarding-class")
500  ("global-qos-config-qos-queue")
501  ("global-qos-config-qos-config")
502  .convert_to_container<set<string> >())
503  ("bridge-domain", std::set<std::string>())
504  ("security-logging-object",
505  list_of("virtual-network-security-logging-object")
506  ("virtual-machine-interface-security-logging-object")
507  ("global-vrouter-config-security-logging-object")
508  ("security-logging-object-network-policy")
509  ("security-logging-object-security-group")
510  .convert_to_container<set<string> >())
511  ("tag", list_of("application-policy-set-tag")
512  .convert_to_container<std::set<std::string> >())
513  ("application-policy-set", list_of("application-policy-set-firewall-policy")
514  ("policy-management-application-policy-set")
515  .convert_to_container<std::set<std::string> >())
516  ("application-policy-set-firewall-policy",
517  list_of("application-policy-set-firewall-policy")
518  .convert_to_container<std::set<std::string> >())
519  ("firewall-policy", list_of("firewall-policy-firewall-rule")
520  ("firewall-policy-security-logging-object")
521  .convert_to_container<std::set<std::string> >())
522  ("firewall-policy-firewall-rule",
523  list_of("firewall-policy-firewall-rule")
524  .convert_to_container<std::set<std::string> >())
525  ("firewall-policy-security-logging-object",
526  list_of("firewall-policy-security-logging-object")
527  .convert_to_container<std::set<std::string> >())
528  ("firewall-rule", list_of("firewall-rule-tag")
529  ("firewall-rule-service-group")
530  ("firewall-rule-address-group")
531  ("firewall-rule-security-logging-object")
532  .convert_to_container<std::set<std::string> >())
533  ("firewall-rule-security-logging-object",
534  list_of("firewall-rule-security-logging-object")
535  .convert_to_container<std::set<std::string> >())
536  ("service-group", std::set<std::string>())
537  ("address-group", list_of("address-group-tag")
538  .convert_to_container<std::set<std::string> >())
539  ("host-based-service", list_of("host-based-service-virtual-network")
540  .convert_to_container<std::set<std::string> >())
541  ("host-based-service-virtual-network", list_of("virtual-network")
542  .convert_to_container<std::set<std::string> >())
543  ("project", list_of("project-tag")
544  ("project-logical-router")
545  ("project-host-based-service")
546  .convert_to_container<std::set<std::string> >())
547  ("port-tuple", list_of("service-instance-port-tuple")
548  ("port-tuple-interface")
549  .convert_to_container<std::set<std::string> >())
550  ("policy-management", std::set<std::string>())
551  ("multicast-policy", list_of("virtual-network-multicast-policy")
552  .convert_to_container<std::set<std::string> >())
553  .convert_to_container<VertexEdgeMap>();
554 }
Definition: bitset.h:17
void Set(const BitSet &rhs)
Definition: bitset.cc:462
static const size_t npos
Definition: bitset.h:19
size_t find_first() const
Definition: bitset.cc:242
void BuildComplement(const BitSet &lhs, const BitSet &rhs)
Definition: bitset.cc:486
void Reset(const BitSet &rhs)
Definition: bitset.cc:470
size_t find_next(size_t pos) const
Definition: bitset.cc:255
bool empty() const
Definition: bitset.cc:165
bool Contains(const BitSet &rhs) const
Definition: bitset.cc:536
BitSet & set(size_t pos)
Definition: bitset.cc:125
bool test(size_t pos) const
Definition: bitset.cc:146
std::string ToString() const
Definition: bitset.cc:551
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
Definition: db_entry.cc:37
virtual std::string ToString() const =0
void Visit(DBGraphVertex *start, VertexVisitor vertex_visit_fn, EdgeVisitor edge_visit_fn)
Definition: db_graph.cc:111
virtual void Change(DBEntryBase *entry)
Definition: db_table.cc:433
DBGraph::VisitorFilter::AllowedEdgeRetVal AllowedEdges(const DBGraphVertex *vertex) const
bool EdgeFilter(const DBGraphVertex *source, const DBGraphVertex *target, const DBGraphEdge *edge) const
GraphPropagateFilter(IFMapExporter *exporter, const IFMapTypenameWhiteList *type_filter, const BitSet &bitset)
bool VertexFilter(const DBGraphVertex *vertex) const
const IFMapNodeState * NodeStateLookup(const IFMapNode *node) const
const IFMapTypenameWhiteList * type_filter_
IFMapExporter * exporter_
virtual const std::string & identifier() const =0
int index() const
Definition: ifmap_client.h:31
Cs_citer ClientConfigTrackerEnd(TrackerType tracker_type, int index) const
IFMapServer * server()
void StateInterestOr(IFMapState *state, const BitSet &interest_bits)
Cs_citer ClientConfigTrackerBegin(TrackerType tracker_type, int index) const
DBTable * link_table()
void StateInterestSet(IFMapState *state, const BitSet &interest_bits)
ConfigSet::const_iterator Cs_citer
IFMapNodeState * NodeStateLookup(IFMapNode *node)
IFMapNodeState * NodeStateLocate(IFMapNode *node)
std::set< IFMapState * > ReachableNodesSet
void JoinVertex(DBGraphVertex *vertex, const BitSet &bset)
void OrLinkDeleteClients(const BitSet &bset)
void UpdateNewReachableNodesTracker(int client_index, IFMapState *state)
const IFMapTypenameWhiteList & get_traversal_white_list() const
void LinkAdd(IFMapLink *link, IFMapNode *lnode, const BitSet &lhs, IFMapNode *rnode, const BitSet &rhs)
void NotifyEdge(DBGraphEdge *edge, const BitSet &bset)
ReachableNodesTracker new_reachable_nodes_tracker_
void LinkDeleteWalkBatchEnd(const BitSet &done_set)
ReachableNodesSet::const_iterator Rns_citer
IFMapGraphWalker(DBGraph *graph, IFMapExporter *exporter)
boost::scoped_ptr< TaskTrigger > link_delete_walk_trigger_
IFMapExporter * exporter_
void NewReachableNodesCleanupInterest(int client_index)
void OldReachableNodesCleanupInterest(int client_index)
void LinkRemove(const BitSet &bset)
static const int kMaxLinkDeleteWalks
void ProcessLinkAdd(IFMapNode *lnode, IFMapNode *rnode, const BitSet &bset)
bool FilterNeighbor(IFMapNode *lnode, IFMapLink *link)
void DeleteNewReachableNodesTracker(int client_index)
void CleanupInterest(int client_index, IFMapNode *node, IFMapNodeState *state)
void AddNewReachableNodesTracker(int client_index)
void ResetLinkDeleteClients(const BitSet &bset)
void RecomputeInterest(DBGraphVertex *vertex, int bit)
std::unique_ptr< IFMapTypenameWhiteList > traversal_white_list_
void nmask_set(int bit)
Definition: ifmap_update.h:195
iterator end()
Definition: ifmap_update.h:188
iterator begin()
Definition: ifmap_update.h:187
void nmask_clear()
Definition: ifmap_update.h:194
const BitSet & nmask() const
Definition: ifmap_update.h:193
IFMapTable * table()
Definition: ifmap_node.h:29
virtual std::string ToString() const
Definition: ifmap_node.cc:31
DB * database()
Definition: ifmap_server.h:82
IFMapClient * GetClient(int index)
bool IsNode() const
Definition: ifmap_update.h:159
const BitSet & interest() const
Definition: ifmap_update.h:129
IFMapNode * GetIFMapNode() const
static IFMapTable * FindTable(DB *db, const std::string &element_type)
Definition: ifmap_table.cc:39
IFMapNode * FindNode(const std::string &name)
Definition: ifmap_table.cc:23
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:304
#define IFMAP_DEBUG(obj,...)
Definition: ifmap_log.h:33
std::map< std::string, DBGraph::VisitorFilter::AllowedEdgeSet > VertexEdgeMap
Definition: ifmap_util.h:14
std::pair< bool, AllowedEdgeSet > AllowedEdgeRetVal
Definition: db_graph.h:30