OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ifmap_update.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __DB_IFMAP_UPDATE_H__
6 #define __DB_IFMAP_UPDATE_H__
7 
8 #include <boost/crc.hpp> // for boost::crc_32_type
9 #include <boost/intrusive/list.hpp>
10 #include <boost/intrusive/slist.hpp>
11 
12 #include "base/bitset.h"
13 #include "base/dependency.h"
14 #include "db/db_entry.h"
15 #include "ifmap/ifmap_link.h"
16 
18  enum ObjectType {
19  NIL,
22  };
23 
25  explicit IFMapObjectPtr(IFMapNode *node);
26  explicit IFMapObjectPtr(IFMapLink *link);
27 
28  void set(IFMapNode *node) {
29  type = NODE;
30  u.node = node;
31  }
32  void set(IFMapLink *link) {
33  type = LINK;
34  u.link = link;
35  }
36  bool IsNode() const { return ((type == NODE) ? true : false); }
37  bool IsLink() const { return ((type == LINK) ? true : false); }
39  union {
40  void *ptr;
43  } u;
44 };
45 
47  enum EntryType {
48  UPDATE, // add or change operation
49  DEL, // delete
51  };
53  type(type), queue_insert_at(0), sequence(0) { }
54  virtual ~IFMapListEntry() { }
55 
56  boost::intrusive::list_member_hook<> node;
58  uint64_t queue_insert_at;
59  uint64_t sequence;
60 
61  virtual std::string ToString() {
62  return std::string("To implement");
63  }
64  bool IsMarker() const { return ((type == MARKER) ? true : false); }
65  bool IsUpdate() const { return ((type == UPDATE) ? true : false); }
66  bool IsDelete() const { return ((type == DEL) ? true : false); }
67  std::string TypeToString() {
68  if (IsMarker()) {
69  return "Marker";
70  } else if (IsUpdate()) {
71  return "Update";
72  } else if (IsDelete()) {
73  return "Delete";
74  } else {
75  return "Unknown";
76  }
77  }
79  // Return how much time ago the entry was inserted.
80  std::string queue_insert_ago_str();
81  void set_sequence(uint64_t seq) { sequence = seq; }
82  uint64_t get_sequence() { return sequence; }
83 };
84 
85 class IFMapUpdate : public IFMapListEntry {
86 public:
87  IFMapUpdate(IFMapNode *node, bool positive);
88  IFMapUpdate(IFMapLink *link, bool positive);
89  virtual ~IFMapUpdate() { }
90 
91  void AdvertiseReset(const BitSet &set);
92  void AdvertiseOr(const BitSet &set);
93  void SetAdvertise(const BitSet &set);
94  const BitSet &advertise() const { return advertise_; }
95 
96  const IFMapObjectPtr &data() const { return data_; }
97  std::string ConfigName();
98  virtual std::string ToString();
99  bool IsNode() const { return data_.IsNode(); }
100  bool IsLink() const { return data_.IsLink(); }
101 
102 private:
103  friend class IFMapState;
104  boost::intrusive::slist_member_hook<> node_;
107 };
108 
109 struct IFMapMarker : public IFMapListEntry {
110  IFMapMarker();
111  virtual ~IFMapMarker() { }
112  virtual std::string ToString();
114 };
115 
116 // State associated with each DB entry.
117 class IFMapState : public DBState {
118 public:
119  typedef boost::crc_32_type::value_type crc32type;
120  typedef boost::intrusive::member_hook<
121  IFMapUpdate, boost::intrusive::slist_member_hook<>, &IFMapUpdate::node_
123  typedef boost::intrusive::slist<IFMapUpdate, MemberHook> UpdateList;
124 
125  IFMapState(IFMapNode *node);
126  IFMapState(IFMapLink *link);
127  virtual ~IFMapState();
128 
129  const BitSet &interest() const { return interest_; }
130  const BitSet &advertised() const { return advertised_; }
131 
132  const UpdateList &update_list() const { return update_list_; }
134  void Insert(IFMapUpdate *update);
135  void Remove(IFMapUpdate *update);
136 
137  void InterestOr(const BitSet &bset) { interest_ |= bset; }
138  void SetInterest(const BitSet &bset) { interest_ = bset; }
139  void InterestReset(const BitSet &set) { interest_.Reset(set); }
140 
141  void AdvertisedOr(const BitSet &set) { advertised_ |= set; }
142  void AdvertisedReset(const BitSet &set) { advertised_.Reset(set); }
143 
144  template <typename Disposer>
145  void ClearAndDispose(Disposer disposer) {
146  update_list_.clear_and_dispose(disposer);
147  }
148 
149  virtual void SetValid() { sig_ = 0; }
150  virtual void ClearValid() { sig_ = kInvalidSig; }
151  virtual bool IsValid() const { return sig_ != kInvalidSig; }
152  virtual bool IsInvalid() const { return sig_ == kInvalidSig; }
153  const crc32type &crc() const { return crc_; }
154  void SetCrc(crc32type &crc) { crc_ = crc; }
155  virtual bool CanDelete() = 0;
156  const IFMapObjectPtr &data() const { return data_; }
157  IFMapNode *GetIFMapNode() const;
158  IFMapLink *GetIFMapLink() const;
159  bool IsNode() const { return data_.IsNode(); }
160  bool IsLink() const { return data_.IsLink(); }
161 
162 protected:
163  static const uint32_t kInvalidSig = -1;
164  uint32_t sig_;
166 
167 private:
168  // The set of clients known to be interested in this update.
170  // The set of clients to which this update has been advertised.
174 };
175 
176 class IFMapNodeState : public IFMapState {
177 public:
181  explicit IFMapNodeState(IFMapNode *node);
182 
184  void SetValid(const IFMapNode *node) { sig_ = 0; }
185  bool HasDependents() const;
186 
187  iterator begin() { return dependents_.begin(); }
188  iterator end() { return dependents_.end(); }
189 
190  const_iterator begin() const { return dependents_.begin(); }
191  const_iterator end() const { return dependents_.end(); }
192 
193  const BitSet &nmask() const { return nmask_; }
194  void nmask_clear() { nmask_.clear(); }
195  void nmask_set(int bit) { nmask_.set(bit); }
196  virtual bool CanDelete() {
197  return (update_list().empty() && IsInvalid() && !HasDependents());
198  }
199 
200 private:
202  BitSet nmask_; // new bitmask computed by graph traversal
203 };
204 
205 class IFMapLinkState : public IFMapState {
206 public:
207  explicit IFMapLinkState(IFMapLink *link);
208  void SetDependency(IFMapNodeState *first, IFMapNodeState *second);
209  void RemoveDependency();
210  bool HasDependency() const;
211 
213  void SetValid(const IFMapLink *link) { sig_ = 0; }
214 
215  IFMapNodeState *left() { return left_.get(); }
216  IFMapNodeState *right() { return right_.get(); }
217  virtual bool CanDelete() {
218  return (update_list().empty() && IsInvalid());
219  }
220 
221 private:
224 };
225 
226 #endif
ObjectType type
Definition: ifmap_update.h:38
BitSet advertised_
Definition: ifmap_update.h:171
const BitSet & nmask() const
Definition: ifmap_update.h:193
void Remove(IFMapUpdate *update)
IFMapNodeState(IFMapNode *node)
bool IsLink() const
Definition: ifmap_update.h:100
virtual void ClearValid()
Definition: ifmap_update.h:150
bool HasDependency() const
virtual bool CanDelete()
Definition: ifmap_update.h:217
boost::intrusive::list_member_hook node
Definition: ifmap_update.h:56
IFMapState(IFMapNode *node)
Definition: ifmap_update.cc:79
bool IsLink() const
Definition: ifmap_update.h:160
BitSet advertise_
Definition: ifmap_update.h:106
virtual bool CanDelete()=0
BitSet interest_
Definition: ifmap_update.h:169
void AdvertiseOr(const BitSet &set)
Definition: ifmap_update.cc:63
void SetAdvertise(const BitSet &set)
Definition: ifmap_update.cc:67
uint64_t queue_insert_at
Definition: ifmap_update.h:58
iterator begin()
Definition: ifmap_update.h:187
const IFMapObjectPtr & data() const
Definition: ifmap_update.h:156
const BitSet & interest() const
Definition: ifmap_update.h:129
void Reset(const BitSet &rhs)
Definition: bitset.cc:470
IFMapUpdate(IFMapNode *node, bool positive)
Definition: ifmap_update.cc:33
uint64_t sequence
Definition: ifmap_update.h:59
bool IsDelete() const
Definition: ifmap_update.h:66
const BitSet & advertise() const
Definition: ifmap_update.h:94
void SetValid(const IFMapLink *link)
Definition: ifmap_update.h:213
ObjectType * get() const
Definition: dependency.h:49
void AdvertiseReset(const BitSet &set)
Definition: ifmap_update.cc:59
bool HasDependents() const
IFMapObjectPtr data_
Definition: ifmap_update.h:165
bool IsMarker() const
Definition: ifmap_update.h:64
virtual ~IFMapListEntry()
Definition: ifmap_update.h:54
virtual std::string ToString()
Definition: ifmap_update.cc:55
void set(IFMapNode *node)
Definition: ifmap_update.h:28
bool IsNode() const
Definition: ifmap_update.h:36
boost::crc_32_type::value_type crc32type
Definition: ifmap_update.h:119
bool IsLink() const
Definition: ifmap_update.h:37
void nmask_set(int bit)
Definition: ifmap_update.h:195
void SetCrc(crc32type &crc)
Definition: ifmap_update.h:154
void RemoveDependency()
virtual void SetValid()
Definition: ifmap_update.h:149
static const uint32_t kInvalidSig
Definition: ifmap_update.h:163
uint64_t get_sequence()
Definition: ifmap_update.h:82
IFMapNodeState * left()
Definition: ifmap_update.h:215
virtual ~IFMapUpdate()
Definition: ifmap_update.h:89
bool IsUpdate() const
Definition: ifmap_update.h:65
void SetDependency(IFMapNodeState *first, IFMapNodeState *second)
uint8_t type
Definition: load_balance.h:109
UpdateList update_list_
Definition: ifmap_update.h:172
const BitSet & advertised() const
Definition: ifmap_update.h:130
void InterestOr(const BitSet &bset)
Definition: ifmap_update.h:137
std::string TypeToString()
Definition: ifmap_update.h:67
void ClearAndDispose(Disposer disposer)
Definition: ifmap_update.h:145
void InterestReset(const BitSet &set)
Definition: ifmap_update.h:139
void SetValid(const IFMapNode *node)
Definition: ifmap_update.h:184
DependencyList< IFMapLink, IFMapNodeState >::const_iterator const_iterator
Definition: ifmap_update.h:180
boost::intrusive::slist_member_hook node_
Definition: ifmap_update.h:104
iterator end()
Definition: ifmap_update.h:188
IFMapLink * link
Definition: ifmap_update.h:42
void Insert(IFMapUpdate *update)
IFMapUpdate * GetUpdate(IFMapListEntry::EntryType type)
Definition: ifmap_update.cc:91
const IFMapObjectPtr & data() const
Definition: ifmap_update.h:96
IFMapNode * node
Definition: ifmap_update.h:41
crc32type crc_
Definition: ifmap_update.h:173
bool IsNode() const
Definition: ifmap_update.h:159
void clear()
Definition: bitset.cc:158
IFMapNode * GetIFMapNode() const
std::string ConfigName()
Definition: ifmap_update.cc:43
const UpdateList & update_list() const
Definition: ifmap_update.h:132
virtual ~IFMapMarker()
Definition: ifmap_update.h:111
IFMapListEntry(EntryType type)
Definition: ifmap_update.h:52
void set_sequence(uint64_t seq)
Definition: ifmap_update.h:81
virtual bool IsValid() const
Definition: ifmap_update.h:151
Definition: bitset.h:17
IFMapLinkState(IFMapLink *link)
DependencyRef< IFMapLink, IFMapNodeState > right_
Definition: ifmap_update.h:223
BitSet & set(size_t pos)
Definition: bitset.cc:125
IFMapObjectPtr data_
Definition: ifmap_update.h:105
virtual bool IsInvalid() const
Definition: ifmap_update.h:152
virtual bool CanDelete()
Definition: ifmap_update.h:196
virtual std::string ToString()
Definition: ifmap_update.cc:75
uint32_t sig_
Definition: ifmap_update.h:164
union IFMapObjectPtr::@5 u
void AdvertisedOr(const BitSet &set)
Definition: ifmap_update.h:141
std::string queue_insert_ago_str()
Definition: ifmap_update.cc:29
DependencyList< IFMapLink, IFMapNodeState >::iterator iterator
Definition: ifmap_update.h:178
virtual std::string ToString()
Definition: ifmap_update.h:61
boost::intrusive::member_hook< IFMapUpdate, boost::intrusive::slist_member_hook<>,&IFMapUpdate::node_ > MemberHook
Definition: ifmap_update.h:122
const crc32type & crc() const
Definition: ifmap_update.h:153
const_iterator end() const
Definition: ifmap_update.h:191
EntryType type
Definition: ifmap_update.h:57
void set_queue_insert_at_to_now()
Definition: ifmap_update.cc:25
void nmask_clear()
Definition: ifmap_update.h:194
IFMapNodeState * right()
Definition: ifmap_update.h:216
virtual ~IFMapState()
Definition: ifmap_update.cc:87
void set(IFMapLink *link)
Definition: ifmap_update.h:32
bool IsNode() const
Definition: ifmap_update.h:99
boost::intrusive::slist< IFMapUpdate, MemberHook > UpdateList
Definition: ifmap_update.h:123
void AdvertisedReset(const BitSet &set)
Definition: ifmap_update.h:142
DEPENDENCY_LIST(IFMapLink, IFMapNodeState, dependents_)
void SetInterest(const BitSet &bset)
Definition: ifmap_update.h:138
const_iterator begin() const
Definition: ifmap_update.h:190
IFMapLink * GetIFMapLink() const
DependencyRef< IFMapLink, IFMapNodeState > left_
Definition: ifmap_update.h:222