OpenSDN source code
db_table_partition.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef ctrlplane_db_table_partition_h
6 #define ctrlplane_db_table_partition_h
7 
8 #include <mutex>
9 
10 #include <boost/intrusive/list.hpp>
11 #include <tbb/spin_rw_mutex.h>
12 
13 #include "db/db_entry.h"
14 
15 class DBTableBase;
16 class DBTable;
17 
18 // Table shard contained within a DBPartition.
20 public:
21  static const int kMaxIterations = 256;
22  typedef boost::intrusive::member_hook<DBEntryBase,
23  boost::intrusive::list_member_hook<>,
25 
26  typedef boost::intrusive::list<DBEntryBase, ChangeListMember> ChangeList;
27 
28 
30  : parent_(tbl_base), index_(index) {
31  }
32 
33  // Input processing stage for DBRequests. Called from per-partition thread.
34  virtual void Process(DBClient *client, DBRequest *req) = 0;
35 
36  // Enqueue a change notification. Deferred until the RunNotify stage.
37  void Notify(DBEntryBase *entry);
38 
39  // Run the notification queue.
40  bool RunNotify();
41 
42  DBTableBase *parent() { return parent_; }
43  int index() const { return index_; }
44 
45  virtual void Remove(DBEntryBase *) = 0;
46 
47  void Delete(DBEntryBase *);
48 
49  // Walk functions
50  virtual DBEntryBase *lower_bound(const DBEntryBase *key) = 0;
51  virtual DBEntryBase *GetFirst() = 0;
52  virtual DBEntryBase *GetNext(const DBEntryBase *) = 0;
53 
54  tbb::spin_rw_mutex &dbstate_mutex() {
55  return dbstate_mutex_;
56  }
57 
58  virtual ~DBTablePartBase() {};
59 private:
60  tbb::spin_rw_mutex dbstate_mutex_;
62  int index_;
65 };
66 
68 public:
69  typedef boost::intrusive::member_hook<DBEntry,
70  boost::intrusive::set_member_hook<>,
72  typedef boost::intrusive::set<DBEntry, SetMember> Tree;
73 
75 
77  // Virtual functions from DBTableBase implemented by DBTable
79  void Process(DBClient *client, DBRequest *req);
80  // Returns the matching route or next in lex order
81  virtual DBEntry *lower_bound(const DBEntryBase *entry);
82 
83  // Returns the next route (Doesn't search). Threaded walk
84  virtual DBEntry *GetNext(const DBEntryBase *entry);
85 
86  virtual DBEntry *GetFirst();
87 
89  // Methods used in implementing DBTablePartition
91 
92  // Add a DB Entry
93  virtual void Add(DBEntry *entry);
94 
95  // Generate Change notification for an entry
96  virtual void Change(DBEntry *entry);
97 
98  // Remove an entry from DB Table. Entry will not be accessible from
99  // DB anymore
100  virtual void Remove(DBEntryBase *entry);
101 
102  // Find DB Entry. Get key from from argument
103  DBEntry *Find(const DBEntry *entry);
104  const DBEntry *Find(const DBEntry *entry) const;
105  DBEntry *FindNoLock(const DBEntry *entry);
106 
107  // Find DB Entry. Get key from from argument
108  DBEntry *Find(const DBRequestKey *key);
109  DBEntry *FindNoLock(const DBRequestKey *key);
110 
111  // Find the next in lex order
112  DBEntry *FindNext(const DBRequestKey *key);
113 
114  DBTable *table();
115  size_t size() const { return tree_.size(); }
116 
117  // Add an entry to DB without allocating
118  void AddWithoutAlloc(DBEntry *entry);
119 
120  // Remove an entry from DB without delete
121  void RemoveWithoutDelete(DBEntry *entry);
122 
123 private:
124  DBEntry *FindInternal(const DBEntry *entry);
125  const DBEntry *FindInternal(const DBEntry *entry) const;
126 
127  mutable std::mutex mutex_;
130 };
131 
132 #endif
boost::intrusive::list_member_hook chg_list_
Definition: db_entry.h:63
boost::intrusive::set_member_hook node_
Definition: db_entry.h:113
DBTableBase * parent()
void Notify(DBEntryBase *entry)
virtual DBEntryBase * GetNext(const DBEntryBase *)=0
DISALLOW_COPY_AND_ASSIGN(DBTablePartBase)
tbb::spin_rw_mutex & dbstate_mutex()
virtual DBEntryBase * GetFirst()=0
tbb::spin_rw_mutex dbstate_mutex_
virtual DBEntryBase * lower_bound(const DBEntryBase *key)=0
void Delete(DBEntryBase *)
DBTablePartBase(DBTableBase *tbl_base, int index)
virtual ~DBTablePartBase()
boost::intrusive::list< DBEntryBase, ChangeListMember > ChangeList
virtual void Process(DBClient *client, DBRequest *req)=0
ChangeList change_list_
DBTableBase * parent_
boost::intrusive::member_hook< DBEntryBase, boost::intrusive::list_member_hook<>, &DBEntryBase::chg_list_ > ChangeListMember
static const int kMaxIterations
virtual void Remove(DBEntryBase *)=0
virtual void Change(DBEntry *entry)
void Process(DBClient *client, DBRequest *req)
size_t size() const
virtual void Add(DBEntry *entry)
void RemoveWithoutDelete(DBEntry *entry)
DBEntry * FindNext(const DBRequestKey *key)
DBEntry * FindInternal(const DBEntry *entry)
DBEntry * FindNoLock(const DBEntry *entry)
DBTablePartition(DBTable *parent, int index)
virtual DBEntry * GetNext(const DBEntryBase *entry)
void AddWithoutAlloc(DBEntry *entry)
virtual DBEntry * lower_bound(const DBEntryBase *entry)
boost::intrusive::set< DBEntry, SetMember > Tree
DBEntry * Find(const DBEntry *entry)
virtual void Remove(DBEntryBase *entry)
DISALLOW_COPY_AND_ASSIGN(DBTablePartition)
virtual DBEntry * GetFirst()
boost::intrusive::member_hook< DBEntry, boost::intrusive::set_member_hook<>, &DBEntry::node_ > SetMember