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