OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 <boost/intrusive/list.hpp>
9 #include <tbb/spin_rw_mutex.h>
10 #include <tbb/mutex.h>
11 
12 #include "db/db_entry.h"
13 
14 class DBTableBase;
15 class DBTable;
16 
17 // Table shard contained within a DBPartition.
19 public:
20  static const int kMaxIterations = 256;
21  typedef boost::intrusive::member_hook<DBEntryBase,
22  boost::intrusive::list_member_hook<>,
24 
25  typedef boost::intrusive::list<DBEntryBase, ChangeListMember> ChangeList;
26 
27 
29  : parent_(tbl_base), index_(index) {
30  }
31 
32  // Input processing stage for DBRequests. Called from per-partition thread.
33  virtual void Process(DBClient *client, DBRequest *req) = 0;
34 
35  // Enqueue a change notification. Deferred until the RunNotify stage.
36  void Notify(DBEntryBase *entry);
37 
38  // Run the notification queue.
39  bool RunNotify();
40 
41  DBTableBase *parent() { return parent_; }
42  int index() const { return index_; }
43 
44  virtual void Remove(DBEntryBase *) = 0;
45 
46  void Delete(DBEntryBase *);
47 
48  // Walk functions
49  virtual DBEntryBase *lower_bound(const DBEntryBase *key) = 0;
50  virtual DBEntryBase *GetFirst() = 0;
51  virtual DBEntryBase *GetNext(const DBEntryBase *) = 0;
52 
53  tbb::spin_rw_mutex &dbstate_mutex() {
54  return dbstate_mutex_;
55  }
56 
57  virtual ~DBTablePartBase() {};
58 private:
59  tbb::spin_rw_mutex dbstate_mutex_;
61  int index_;
64 };
65 
67 public:
68  typedef boost::intrusive::member_hook<DBEntry,
69  boost::intrusive::set_member_hook<>,
71  typedef boost::intrusive::set<DBEntry, SetMember> Tree;
72 
74 
76  // Virtual functions from DBTableBase implemented by DBTable
78  void Process(DBClient *client, DBRequest *req);
79  // Returns the matching route or next in lex order
80  virtual DBEntry *lower_bound(const DBEntryBase *entry);
81 
82  // Returns the next route (Doesn't search). Threaded walk
83  virtual DBEntry *GetNext(const DBEntryBase *entry);
84 
85  virtual DBEntry *GetFirst();
86 
88  // Methods used in implementing DBTablePartition
90 
91  // Add a DB Entry
92  virtual void Add(DBEntry *entry);
93 
94  // Generate Change notification for an entry
95  virtual void Change(DBEntry *entry);
96 
97  // Remove an entry from DB Table. Entry will not be accessible from
98  // DB anymore
99  virtual void Remove(DBEntryBase *entry);
100 
101  // Find DB Entry. Get key from from argument
102  DBEntry *Find(const DBEntry *entry);
103  const DBEntry *Find(const DBEntry *entry) const;
104  DBEntry *FindNoLock(const DBEntry *entry);
105 
106  // Find DB Entry. Get key from from argument
107  DBEntry *Find(const DBRequestKey *key);
108  DBEntry *FindNoLock(const DBRequestKey *key);
109 
110  // Find the next in lex order
111  DBEntry *FindNext(const DBRequestKey *key);
112 
113  DBTable *table();
114  size_t size() const { return tree_.size(); }
115 
116  // Add an entry to DB without allocating
117  void AddWithoutAlloc(DBEntry *entry);
118 
119  // Remove an entry from DB without delete
120  void RemoveWithoutDelete(DBEntry *entry);
121 
122 private:
123  DBEntry *FindInternal(const DBEntry *entry);
124  const DBEntry *FindInternal(const DBEntry *entry) const;
125 
126  mutable tbb::mutex mutex_;
129 };
130 
131 #endif
DBEntry * FindInternal(const DBEntry *entry)
DISALLOW_COPY_AND_ASSIGN(DBTablePartBase)
DBTablePartition(DBTable *parent, int index)
void Process(DBClient *client, DBRequest *req)
tbb::spin_rw_mutex & dbstate_mutex()
DBEntry * FindNoLock(const DBEntry *entry)
virtual DBEntryBase * GetFirst()=0
boost::intrusive::member_hook< DBEntryBase, boost::intrusive::list_member_hook<>,&DBEntryBase::chg_list_ > ChangeListMember
virtual ~DBTablePartBase()
DBEntry * Find(const DBEntry *entry)
virtual DBEntry * GetNext(const DBEntryBase *entry)
boost::intrusive::list< DBEntryBase, ChangeListMember > ChangeList
DBTableBase * parent()
tbb::spin_rw_mutex dbstate_mutex_
virtual DBEntryBase * GetNext(const DBEntryBase *)=0
DISALLOW_COPY_AND_ASSIGN(DBTablePartition)
void Delete(DBEntryBase *)
virtual void Change(DBEntry *entry)
DBEntry * FindNext(const DBRequestKey *key)
boost::intrusive::set_member_hook node_
Definition: db_entry.h:114
boost::intrusive::list_member_hook chg_list_
Definition: db_entry.h:64
boost::intrusive::member_hook< DBEntry, boost::intrusive::set_member_hook<>,&DBEntry::node_ > SetMember
virtual DBEntryBase * lower_bound(const DBEntryBase *key)=0
ChangeList change_list_
void RemoveWithoutDelete(DBEntry *entry)
virtual DBEntry * lower_bound(const DBEntryBase *entry)
DBTableBase * parent_
DBTablePartBase(DBTableBase *tbl_base, int index)
virtual void Process(DBClient *client, DBRequest *req)=0
void AddWithoutAlloc(DBEntry *entry)
size_t size() const
virtual DBEntry * GetFirst()
virtual void Add(DBEntry *entry)
void Notify(DBEntryBase *entry)
boost::intrusive::set< DBEntry, SetMember > Tree
static const int kMaxIterations
virtual void Remove(DBEntryBase *entry)
int index() const
virtual void Remove(DBEntryBase *)=0