OpenSDN source code
db_entry.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_entry_h
6 #define ctrlplane_db_entry_h
7 
8 #include <map>
9 #include <atomic>
10 
11 #include "db/db_table.h"
12 
13 #include <boost/intrusive/list.hpp>
14 #include <boost/intrusive/set.hpp>
15 
16 struct DBState {
17  virtual ~DBState() { }
18 };
19 
20 // Generic database entry
21 class DBEntryBase {
22 public:
24  typedef std::unique_ptr<DBRequestKey> KeyPtr;
25 
26  DBEntryBase();
27  virtual ~DBEntryBase();
28  virtual std::string ToString() const = 0;
29  virtual KeyPtr GetDBRequestKey() const = 0;
30  virtual bool IsMoreSpecific(const std::string &match) const {
31  return false;
32  }
33  virtual bool IsLessSpecific(const std::string &match) const {
34  return false;
35  }
36 
37  void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state);
38  void ClearState(DBTableBase *tbl_base, ListenerId listener);
39  DBState *GetState(DBTableBase *tbl_base, ListenerId listener) const;
40  const DBState *GetState(const DBTableBase *tbl_base,
41  ListenerId listener) const;
42  bool is_state_empty(DBTablePartBase *tpart);
44 
45  void Delete();
46  void MarkDelete() { flags |= DeleteMarked; }
47  void ClearDelete() { flags &= ~DeleteMarked; }
48  bool IsDeleted() const { return (flags & DeleteMarked) != 0; }
49 
50  void set_onlist() { flags |= Onlist; }
51  void clear_onlist() { flags &= ~Onlist; }
52  bool is_onlist() { return (flags & Onlist); }
53 
54  void SetOnRemoveQ() {
55  onremoveq_.exchange(true);
56  }
57  bool IsOnRemoveQ() { return (onremoveq_); }
58  void ClearOnRemoveQ() {
59  onremoveq_.exchange(false);
60  }
61 
62  //member hook in change list
63  boost::intrusive::list_member_hook<> chg_list_;
64 
65  void set_last_change_at(uint64_t time);
67  const uint64_t last_change_at() const { return last_change_at_; }
68  const std::string last_change_at_str() const;
69  void set_last_update_at(uint64_t time);
71  const uint64_t last_update_at() const { return last_update_at_; }
74  DBTableBase *get_table() const;
75  void Notify();
76 
77 private:
78  enum DbEntryFlags {
79  Onlist = 1 << 0,
80  DeleteMarked = 1 << 1,
81  };
82  typedef std::map<ListenerId, DBState *> StateMap;
85  uint8_t flags;
86  std::atomic<bool> onremoveq_;
87  uint64_t last_change_at_; // time at which entry was last 'changed'
88  uint64_t last_update_at_; // time at which entry was last 'updated'
90 };
91 
92 // An implementation of DBEntryBase that uses boost::set as data-store
93 // Most of the DB Table implementations should derive from here instead of
94 // DBEntryBase directly.
95 // Derive directly from DBEntryBase only if there is a strong reason to do so
96 class DBEntry : public DBEntryBase {
97 public:
98  DBEntry() { };
99  virtual ~DBEntry() { };
100 
101  // Set key fields in the DBEntry
102  virtual void SetKey(const DBRequestKey *key) = 0;
103 
104  // Comparator used in Tree management
105  virtual bool IsLess(const DBEntry &rhs) const = 0;
106 
107  bool operator<(const DBEntry &rhs) const {
108  return IsLess(rhs);
109  }
110 
111 private:
112  friend class DBTablePartition;
113  boost::intrusive::set_member_hook<> node_;
115 };
116 
117 #endif
@ DeleteMarked
Definition: db_entry.h:80
void MarkDelete()
Definition: db_entry.h:46
virtual std::string ToString() const =0
DISALLOW_COPY_AND_ASSIGN(DBEntryBase)
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:24
const std::string last_change_at_str() const
Definition: db_entry.cc:123
virtual ~DBEntryBase()
Definition: db_entry.cc:19
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
Definition: db_entry.cc:37
DBTableBase * get_table() const
Definition: db_entry.cc:119
bool IsOnRemoveQ()
Definition: db_entry.h:57
const uint64_t last_update_at() const
Definition: db_entry.h:71
StateMap state_
Definition: db_entry.h:84
DBTableBase::ListenerId ListenerId
Definition: db_entry.h:23
boost::intrusive::list_member_hook chg_list_
Definition: db_entry.h:63
bool is_state_empty_unlocked(DBTablePartBase *tpart)
Definition: db_entry.cc:92
void Notify()
Definition: db_entry.cc:127
void set_onlist()
Definition: db_entry.h:50
DBTablePartBase * tpart_
Definition: db_entry.h:83
void set_last_update_at(uint64_t time)
Definition: db_entry.cc:108
virtual bool IsLessSpecific(const std::string &match) const
Definition: db_entry.h:33
void ClearOnRemoveQ()
Definition: db_entry.h:58
void ClearState(DBTableBase *tbl_base, ListenerId listener)
Definition: db_entry.cc:73
virtual bool IsMoreSpecific(const std::string &match) const
Definition: db_entry.h:30
void ClearDelete()
Definition: db_entry.h:47
void SetOnRemoveQ()
Definition: db_entry.h:54
std::map< ListenerId, DBState * > StateMap
Definition: db_entry.h:82
void set_last_update_at_to_now()
Definition: db_entry.cc:104
bool IsDeleted() const
Definition: db_entry.h:48
uint64_t last_update_at_
Definition: db_entry.h:88
bool is_onlist()
Definition: db_entry.h:52
const uint64_t last_change_at() const
Definition: db_entry.h:67
bool is_state_empty(DBTablePartBase *tpart)
Definition: db_entry.cc:87
virtual KeyPtr GetDBRequestKey() const =0
DBTablePartBase * get_table_partition() const
Definition: db_entry.cc:115
void set_last_change_at(uint64_t time)
Definition: db_entry.cc:100
void Delete()
Definition: db_entry.cc:131
void set_last_change_at_to_now()
Definition: db_entry.cc:96
uint64_t last_change_at_
Definition: db_entry.h:87
std::atomic< bool > onremoveq_
Definition: db_entry.h:86
void set_table_partition(DBTablePartBase *tpart)
Definition: db_entry.cc:111
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
Definition: db_entry.cc:22
uint8_t flags
Definition: db_entry.h:85
void clear_onlist()
Definition: db_entry.h:51
boost::intrusive::set_member_hook node_
Definition: db_entry.h:113
virtual void SetKey(const DBRequestKey *key)=0
DISALLOW_COPY_AND_ASSIGN(DBEntry)
DBEntry()
Definition: db_entry.h:98
virtual ~DBEntry()
Definition: db_entry.h:99
bool operator<(const DBEntry &rhs) const
Definition: db_entry.h:107
virtual bool IsLess(const DBEntry &rhs) const =0
int ListenerId
Definition: db_table.h:62
virtual ~DBState()
Definition: db_entry.h:17