OpenSDN source code
db.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "base/task.h"
6 #include "db/db.h"
7 #include "db/db_partition.h"
8 #include "db/db_table.h"
9 #include "db/db_table_walker.h"
10 #include "db/db_table_walk_mgr.h"
11 
12 using namespace std;
13 
15 
16 // factory map is declared as a local static variable in order to avoid
17 // static initialization order dependencies.
19  static FactoryMap factory_map;
20  return &factory_map;
21 }
22 
23 void DB::RegisterFactory(const std::string &prefix, CreateFunction create_fn) {
24  DB::factories()->insert(make_pair(prefix, create_fn));
25 }
26 
28  DB::factories()->clear();
29 }
30 
32 
33  // Initialize static partition_count_.
34  if (!partition_count_) {
35  partition_count_ = TaskScheduler::GetInstance()->HardwareThreadCount();
36  }
37  return partition_count_;
38 }
39 
40 // For unit testing only.
41 void DB::SetPartitionCount(int partition_count) {
42  partition_count_ = partition_count;
43 }
44 
45 DB::DB(int task_id) : task_id_(task_id) {
46  if (task_id == -1)
47  task_id_ = TaskScheduler::GetInstance()->GetTaskId("db::DBTable");
48  walker_.reset(new DBTableWalker(task_id_));
49  walk_mgr_.reset(new DBTableWalkMgr());
50  for (int i = 0; i < PartitionCount(); i++) {
51  partitions_.push_back(new DBPartition(this, i));
52  }
53 }
54 
56  Clear();
57 }
58 
60  return partitions_[index];
61 }
62 
63 const DBPartition *DB::GetPartition(int index) const {
64  return partitions_[index];
65 }
66 
67 DBTableBase *DB::FindTable(const string &name) {
68  TableMap::iterator loc = tables_.find(name);
69  if (loc != tables_.end()) {
70  DBTableBase *tbl_base = loc->second;
71  return tbl_base;
72  }
73  return NULL;
74 }
75 
76 DB::iterator DB::FindTableIter(const string &name) {
77  return tables_.find(name);
78 }
79 
80 void DB::AddTable(DBTableBase *tbl_base) {
81  pair<TableMap::iterator, bool> result =
82  tables_.insert(make_pair(tbl_base->name(), tbl_base));
83  assert(result.second);
84 }
85 
86 void DB::RemoveTable(DBTableBase *tbl_base) {
87  tables_.erase(tbl_base->name());
88 }
89 
90 bool DB::IsDBQueueEmpty() const {
91  for (int i = 0; i < PartitionCount(); i++) {
92  if (!GetPartition(i)->IsDBQueueEmpty()) return false;
93  }
94 
95  return true;
96 }
97 
98 DBTableBase *DB::CreateTable(const string &name) {
99  FactoryMap *factory_map = factories();
100  string prefix = name;
101  while (prefix.size()) {
102  FactoryMap::iterator loc = factory_map->find(prefix);
103  if (loc != factory_map->end()) {
104  DBTableBase *tbl_base = (loc->second)(this, name);
105  std::scoped_lock lock(mutex_);
106  tables_.insert(make_pair(name, tbl_base));
107  return tbl_base;
108  }
109  size_t index = prefix.find('.');
110  if (index == string::npos) {
111  break;
112  }
113  if (index == (prefix.length()-1)) {
114  break;
115  }
116  prefix = prefix.substr(index+1);
117  }
118  return NULL;
119 }
120 
121 DBGraph *DB::GetGraph(const std::string &name) {
122  GraphMap::iterator loc = graph_map_.find(name);
123  if (loc != graph_map_.end()) {
124  return loc->second;
125  }
126  return NULL;
127 }
128 
129 void DB::SetGraph(const std::string &name, DBGraph *graph) {
130  pair<GraphMap::iterator, bool> result =
131  graph_map_.insert(make_pair(name, graph));
132  assert(result.second);
133 }
134 
135 void DB::SetQueueDisable(bool disable) {
136  for (int i = 0; i < PartitionCount(); i++) {
137  partitions_[i]->SetQueueDisable(disable);
138  }
139 }
140 
141 void DB::Clear() {
144 }
bool IsDBQueueEmpty() const
const std::string & name() const
Definition: db_table.h:110
static void SetPartitionCount(int partition_count)
Definition: db.cc:41
bool IsDBQueueEmpty() const
Definition: db.cc:90
void AddTable(DBTableBase *tbl_base)
Definition: db.cc:80
void SetQueueDisable(bool disable)
Definition: db.cc:135
std::mutex mutex_
Definition: db.h:88
std::unique_ptr< DBTableWalker > walker_
Definition: db.h:93
boost::function< DBTableBase *(DB *, const std::string &)> CreateFunction
Definition: db.h:27
int task_id() const
Definition: db.h:79
std::unique_ptr< DBTableWalkMgr > walk_mgr_
Definition: db.h:94
std::vector< DBPartition * > partitions_
Definition: db.h:90
static int partition_count_
Definition: db.h:85
int task_id_
Definition: db.h:89
static void ClearFactoryRegistry()
Definition: db.cc:27
void SetGraph(const std::string &name, DBGraph *graph)
Definition: db.cc:129
~DB()
Definition: db.cc:55
DB(int task_id=-1)
Definition: db.cc:45
std::map< std::string, CreateFunction > FactoryMap
Definition: db.h:82
TableMap tables_
Definition: db.h:91
static void RegisterFactory(const std::string &prefix, CreateFunction create_fn)
Definition: db.cc:23
void RemoveTable(DBTableBase *tbl_base)
Definition: db.cc:86
TableMap::iterator iterator
Definition: db.h:29
GraphMap graph_map_
Definition: db.h:92
void Clear()
Definition: db.cc:141
DBPartition * GetPartition(int index)
Definition: db.cc:59
static int PartitionCount()
Definition: db.cc:31
DBTableBase * FindTable(const std::string &name)
Definition: db.cc:67
DBGraph * GetGraph(const std::string &name)
Definition: db.cc:121
static FactoryMap * factories()
Definition: db.cc:18
DBTableBase * CreateTable(const std::string &name)
Definition: db.cc:98
iterator FindTableIter(const std::string &name)
Definition: db.cc:76
int GetTaskId(const std::string &name)
Definition: task.cc:883
static TaskScheduler * GetInstance()
Definition: task.cc:573
int HardwareThreadCount()
Definition: task.h:404
void STLDeleteElements(Container *container)
Definition: util.h:114
void STLDeleteValues(Container *container)
Definition: util.h:101