7 #include <boost/bind.hpp>
8 #include <boost/checked_delete.hpp>
17 #include "ifmap/ifmap_log_types.h"
25 using namespace boost::algorithm;
39 : server_(server), link_table_(NULL) {
48 iter != db->
end(); ++iter) {
50 if (table->
name().find(
"__ifmap__") != 0) {
71 for (
int i = 0; i <
TT_END; ++i) {
94 TableMap::const_iterator loc =
124 if (table->
name() ==
"__ifmap__.virtual_router.0") {
131 ptr->
reset(merged_set);
165 template <
class ObjectType>
172 if (update != NULL) {
177 if (update != NULL) {
185 if (!change && add_set.
empty()) {
189 bool is_move =
false;
190 if (update != NULL) {
217 template <
class ObjectType>
222 if (update != NULL) {
226 if (rm_set.
empty()) {
227 if (update != NULL) {
235 bool is_move =
false;
236 if (update != NULL) {
253 template <
class ObjectType>
256 if (update != NULL) {
263 if (update != NULL) {
267 assert(update == NULL);
271 if (update == NULL) {
298 if (update == NULL) {
310 if (update != NULL) {
321 iter != state->
end(); iter = next) {
329 if (!common.
empty()) {
419 if (!rm_set.
empty()) {
423 }
else if (state != NULL) {
461 bool add_link =
false;
462 bool force_update =
false;
482 if (starts_with(link->
left()->
ToString(),
"virtual-router") &&
483 (starts_with(link->
right()->
ToString(),
"virtual-machine:"))) {
484 if (!s_right->advertised().empty())
492 s_left = state->
left();
493 s_right = state->
right();
497 s_left = state->
left();
498 s_right = state->
right();
501 if (s_left->advertised().Contains(state->
interest()))
502 s_left->AdvertisedReset(state->
interest());
514 if (s_left->advertised().Contains(state->
interest()))
515 s_left->AdvertisedReset(state->
interest());
516 if (s_right->advertised().Contains(state->
interest()))
517 s_right->AdvertisedReset(state->
interest());
523 std::unique_ptr<BitSet> ml, mr;
526 if (*lset != *rset) {
551 if (!add_set.
empty()) {
563 }
else if ((state != NULL) && state->
IsValid()) {
566 assert((left != NULL) && (s_left != NULL));
569 assert((right != NULL) && (s_right != NULL));
592 const BitSet &dequeue_set,
601 table = node->
table();
631 boost::checked_delete(ptr);
645 *next = NULL; entry != NULL; entry = next) {
648 entry->GetState(table, tsid));
652 entry->ClearState(table, tsid);
654 boost::checked_delete(state);
660 return walker_->FilterNeighbor(lnode, link);
665 bool changed =
false;
669 if (state->
crc() != node_crc) {
678 for (
int tracker_type = 0; tracker_type <
TT_END; ++tracker_type) {
689 for (
int tracker_type = 0; tracker_type <
TT_END; ++tracker_type) {
718 for (ConfigSet::iterator iter = set->begin(); iter != set->end(); ++iter) {
725 for (ConfigSet::iterator iter = set->begin(); iter != set->end(); ++iter) {
734 return ((set != NULL) ?
true :
false);
741 ConfigSet::iterator iter = set->find(state);
742 return (iter == set->end() ?
false :
true);
774 const BitSet& interest_bits) {
780 if (!new_clients.
empty()) {
789 if (!old_clients.
empty()) {
799 const BitSet& interest_bits) {
808 const BitSet& interest_bits) {
816 const BitSet& advertised_bits) {
825 const BitSet& advertised_bits) {
832 return walker_->get_traversal_white_list();
836 walker_->ResetLinkDeleteClients(bset);
IFMapUpdateQueue * queue()
void MoveDependentLinks(IFMapNodeState *state)
bool ClientConfigTrackerEmpty(TrackerType tracker_type, int index)
DBTableBase::ListenerId id() const
void Remove(IFMapUpdate *update)
void DeleteStateIfAppropriate(DBTable *table, DBEntryBase *entry, IFMapState *state)
IFMapUpdateDisposer(IFMapUpdateQueue *queue)
bool IsFeasible(const IFMapNode *node)
virtual void ClearValid()
bool HasDependency() const
const TableInfo * Find(const DBTable *table) const
void UpdateClientConfigTracker(IFMapState *state, const BitSet &client_bits, bool add, TrackerType tracker_type)
void RemoveDependentLinks(IFMapNodeState *state, const BitSet &rm_set)
bool ConfigChanged(IFMapNode *node)
IFMapUpdateSender * sender()
IFMapClient * FindClient(const std::string &id)
boost::scoped_ptr< IFMapGraphWalker > walker_
const BitSet * MergeClientInterest(IFMapNode *node, IFMapNodeState *state, std::unique_ptr< BitSet > *ptr)
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
virtual bool CanDelete()=0
void ProcessAdjacentNode(IFMapNode *node, const BitSet &add_set, IFMapNodeState *state, bool force_process=false)
void AdvertiseOr(const BitSet &set)
void SetAdvertise(const BitSet &set)
virtual void QueueActive()
virtual std::string ToString() const
BitSet & reset(size_t pos)
void NodeTableExport(DBTablePartBase *partition, DBEntryBase *entry)
std::string ToString() const
const BitSet & interest() const
void StateInterestReset(IFMapState *state, const BitSet &interest_bits)
boost::crc_32_type::value_type crc32type
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
virtual DBEntry * GetNext(const DBEntryBase *entry)
IFMapNode * RightNode(DB *db)
static void MaybeNotifyOnLinkDelete(IFMapNode *node, IFMapNodeState *state)
bool link_revival() const
virtual void Change(DBEntryBase *entry)
const BitSet & advertise() const
void AdvertiseReset(const BitSet &set)
void AddClientConfigTracker(int index)
bool HasDependents() const
bool Contains(const BitSet &rhs) const
void StateInterestSet(IFMapState *state, const BitSet &interest_bits)
void StateAdvertisedReset(IFMapState *state, const BitSet &interest_bits)
const IFMapTypenameWhiteList & get_traversal_white_list() const
void LinkTableExport(DBTablePartBase *partition, DBEntryBase *entry)
void Unregister(ListenerId listener)
void EnqueueDelete(ObjectType *obj, IFMapState *state)
Cs_citer ClientConfigTrackerEnd(TrackerType tracker_type, int index) const
Cs_citer ClientConfigTrackerBegin(TrackerType tracker_type, int index) const
DBTable::ListenerId TableListenerId(const DBTable *table) const
IFMapNode * LeftNode(DB *db)
#define IFMAP_DEBUG(obj,...)
void Dequeue(IFMapUpdate *update)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
bool ClientHasConfigTracker(TrackerType tracker_type, int index)
void SetCrc(crc32type &crc)
IFMapNodeState * NodeStateLocate(IFMapNode *node)
void operator()(IFMapUpdate *ptr)
void TableStateClear(DBTable *table, DBTable::ListenerId tsid)
bool UpdateRemove(ObjectType *obj, IFMapState *state, const BitSet &rm_set)
DBTableBase::ListenerId id_
bool ClientConfigTrackerHasState(TrackerType tracker_type, int index, IFMapState *state)
void SetDependency(IFMapNodeState *first, IFMapNodeState *second)
const BitSet & advertised() const
IFMapNodeState * NodeStateLookup(IFMapNode *node)
IFMapUpdateSender * sender()
void InterestOr(const BitSet &bset)
void ClearAndDispose(Disposer disposer)
TableMap::iterator iterator
void InterestReset(const BitSet &set)
void StateInterestOr(IFMapState *state, const BitSet &interest_bits)
ConfigSet::const_iterator Cs_citer
boost::unordered_set< IFMapState * > ConfigSet
void Insert(IFMapUpdate *update)
IFMapUpdate * GetUpdate(IFMapListEntry::EntryType type)
const IFMapObjectPtr & data() const
void StateAdvertisedOr(IFMapState *state, const BitSet &interest_bits)
void CleanupClientConfigTrackedEntries(int index)
const std::string & name() const
IFMapUpdateQueue * queue()
const UpdateList & update_list() const
const std::string & name() const
void ClearState(DBTableBase *tbl_base, ListenerId listener)
iterator lower_bound(const std::string &name)
virtual bool IsValid() const
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
void StateUpdateOnDequeue(IFMapUpdate *update, const BitSet &dequeue_set, bool is_delete)
size_t ClientConfigTrackerSize(TrackerType tracker_type, int index)
void MoveAdjacentNode(IFMapNodeState *state)
size_t find_first() const
IFMapExporter(IFMapServer *server)
bool UpdateAddChange(ObjectType *obj, IFMapState *state, const BitSet &add_set, const BitSet &rm_set, bool change)
ConfigSet::size_type CsSz_t
static const int kInvalidId
void BuildComplement(const BitSet &lhs, const BitSet &rhs)
void ResetLinkDeleteClients(const BitSet &bset)
size_t find_next(size_t pos) const
IFMapUpdateQueue * queue_
IFMapLinkState * LinkStateLookup(IFMapLink *link)
union IFMapObjectPtr::@5 u
void AdvertisedOr(const BitSet &set)
virtual DBEntry * GetFirst()
DBTablePartBase * get_table_partition() const
const crc32type & crc() const
bool FilterNeighbor(IFMapNode *lnode, IFMapLink *link)
void DeleteClientConfigTracker(int index)
void AdvertisedReset(const BitSet &set)
void SetInterest(const BitSet &bset)
TableInfo(DBTable::ListenerId id)
ClientConfigTracker client_config_tracker_[TT_END]
DBTableBase * FindTable(const std::string &name)
void SetLinkRevival(bool lr)
bool Enqueue(IFMapUpdate *update)