7 #include <boost/assign/list_of.hpp>
8 #include <boost/bind/bind.hpp>
20 #include "ifmap/ifmap_log_types.h"
23 #include "schema/vnc_cfg_types.h"
25 using boost::assign::list_of;
26 using boost::assign::map_list_of;
29 using namespace boost::placeholders;
36 : exporter_(exporter),
37 type_filter_(type_filter),
42 return type_filter_->VertexFilter(vertex);
59 node->
GetState(table, exporter_->TableListenerId(table));
65 return type_filter_->AllowedEdges(vertex);
78 TaskScheduler::GetInstance()->GetTaskId(
"db::IFMapTable"), 0)),
79 walk_client_index_(
BitSet::npos) {
116 assert(
dynamic_cast<IFMapNode *
>(lnode));
117 assert(
dynamic_cast<IFMapNode *
>(rnode));
119 assert(!
dynamic_cast<IFMapLink *
>(lnode));
120 assert(!
dynamic_cast<IFMapLink *
>(rnode));
144 rnode = link->
right();
225 rm_mask.
set(client_index);
236 ninterest |= state->
nmask();
238 if (state->
interest() == ninterest) {
247 iter != state->
end(); ++iter) {
249 table->
Change(iter.operator->());
264 while (iter != end_iter) {
275 assert(state == nstate);
291 for (
Rns_citer iter = rnset->begin(); iter != rnset->end(); ++iter) {
297 assert(state == nstate);
338 rnset->insert(state);
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> >())
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>())
370 list_of(
"bgp-router-sub-cluster")
371 .convert_to_container<set<string> >())
373 list_of(
"instance-bgp-router")
374 (
"physical-router-bgp-router")
375 (
"bgp-router-control-node-zone")
376 .convert_to_container<set<string> >())
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> >())
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> >())
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")
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> >())
void Set(const BitSet &rhs)
size_t find_first() const
void BuildComplement(const BitSet &lhs, const BitSet &rhs)
void Reset(const BitSet &rhs)
size_t find_next(size_t pos) const
bool Contains(const BitSet &rhs) const
bool test(size_t pos) const
std::string ToString() const
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
virtual std::string ToString() const =0
void Visit(DBGraphVertex *start, VertexVisitor vertex_visit_fn, EdgeVisitor edge_visit_fn)
virtual void Change(DBEntryBase *entry)
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
Cs_citer ClientConfigTrackerEnd(TrackerType tracker_type, int index) const
void StateInterestOr(IFMapState *state, const BitSet &interest_bits)
Cs_citer ClientConfigTrackerBegin(TrackerType tracker_type, int index) const
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 AddNodesToWhitelist()
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)
size_t walk_client_index_
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)
BitSet link_delete_clients_
void ResetLinkDeleteClients(const BitSet &bset)
void RecomputeInterest(DBGraphVertex *vertex, int bit)
std::unique_ptr< IFMapTypenameWhiteList > traversal_white_list_
const BitSet & nmask() const
virtual std::string ToString() const
IFMapClient * GetClient(int index)
const BitSet & interest() const
IFMapNode * GetIFMapNode() const
static IFMapTable * FindTable(DB *db, const std::string &element_type)
IFMapNode * FindNode(const std::string &name)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
#define IFMAP_DEBUG(obj,...)
std::map< std::string, DBGraph::VisitorFilter::AllowedEdgeSet > VertexEdgeMap
std::pair< bool, AllowedEdgeSet > AllowedEdgeRetVal