SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
Columns.h
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 
7 #ifndef swcdb_manager_db_Columns_h
8 #define swcdb_manager_db_Columns_h
9 
10 
12 #include "swcdb/fs/Interface.h"
13 
17 #include <list>
18 
19 
20 namespace SWC { namespace Manager {
21 
22 
23 
24 class Columns final : private std::unordered_map<cid_t, Column::Ptr> {
25 
26  public:
27 
28  static void columns_by_fs(int &err, FS::IdEntries_t &entries) {
29  Env::FsInterface::interface()->get_structured_ids(
30  err, DB::RangeBase::get_column_path(), entries);
31  }
32 
33  typedef Columns* Ptr;
34 
35  Columns() noexcept : m_mutex(), m_health_last_cid(DB::Schema::NO_CID) { }
36 
37  ~Columns() noexcept { }
38 
39  void reset() {
40  {
42  clear();
43  }
44  for(auto& g : m_need_assign)
45  g.reset();
46  }
47 
48  void state(int& err) {
50  for(auto it = cbegin(); !err && it != cend(); ++it)
51  it->second->state(err);
52  }
53 
54  bool is_an_initialization(int &err, const DB::Schema::Ptr& schema) {
55  Column::Ptr col = nullptr;
56  {
58  auto res = emplace(schema->cid, nullptr);
59  if(!res.second)
60  return false;
61  res.first->second.reset(new Column(schema));
62  col = res.first->second;
63  }
64  col->init(err);
65  if(err) {
66  remove(schema->cid);
67  }
68  return !err;
69  }
70 
71  Column::Ptr get_column(int &err, const cid_t cid) {
73  auto it = find(cid);
74  if(it != cend())
75  return it->second;
77  return nullptr;
78  }
79 
80  Range::Ptr get_next_unassigned(bool& waiting_meta) {
81  #define _PRELOAD(_GROUP, _BEGIN, _END) \
82  if(Range::Ptr range = m_need_assign[_GROUP].get()) \
83  return range; \
84  for(cid_t cid = _BEGIN; cid <= _END; ++cid) { \
85  Core::MutexSptd::scope lock(m_mutex); \
86  auto it = find(cid); \
87  if(it != cend()) { \
88  if((waiting_meta = it->second->_state() != Column::State::OK)) \
89  return nullptr; \
90  } \
91  }
92  _PRELOAD(
93  0,
96  );
97  _PRELOAD(
98  1,
101  );
102  _PRELOAD(
103  2,
106  );
107  #undef _PRELOAD
108  return m_need_assign[3].get();
109  }
110 
113  for(auto it = cbegin(); it != cend(); ++it)
114  it->second->set_rgr_unassigned(rgrid);
115  }
116 
117  void change_rgr(rgrid_t rgrid_old, rgrid_t rgrid) {
119  for(auto it = cbegin(); it != cend(); ++it)
120  it->second->change_rgr(rgrid_old, rgrid);
121  }
122 
123  void assigned(rgrid_t rgrid, size_t num, Core::Vector<Range::Ptr>& ranges) {
124  for(Column::Ptr chk; num; ) {
125  {
126  const_iterator it;
128  if(chk) {
129  if((it = find(chk->cfg->cid)) == cend())
130  break;
131  ++it;
132  } else {
133  it = cbegin();
134  }
135  if(it == cend())
136  break;
137  chk = it->second;
138  }
139  chk->assigned(rgrid, num, ranges);
140  }
141  }
142 
143  Column::Ptr get_need_health_check(int64_t ts, uint32_t ms) {
145  for(auto it = m_health_last_cid ? find(m_health_last_cid) : cbegin();
146  it != cend(); ++it) {
147  if(it->second->need_health_check(ts, ms)) {
148  m_health_last_cid = it->second->cfg->cid;
149  return it->second;
150  }
151  }
153  return nullptr;
154  }
155 
156  void remove(const cid_t cid) {
157  {
159  auto it = find(cid);
160  if(it == cend())
161  return;
162  erase(it);
163  }
164  assign_group(cid).remove(cid);
165  }
166 
167  void assign_add(Range::Ptr&& range) {
168  assign_group(range->cfg->cid).add(std::move(range));
169  }
170 
171  void assign_add(const Range::Ptr& range) {
172  assign_group(range->cfg->cid).add(range);
173  }
174 
175  void assign_remove(const Range::Ptr& range) {
176  assign_group(range->cfg->cid).remove(range);
177  }
178 
179  void print(std::ostream& out) {
180  out << "ColumnsAssignment:";
182  for(auto it = cbegin(); it != cend(); ++it)
183  it->second->print(out << "\n ");
184  }
185 
186  private:
187 
188  class AssignGroup final : private std::unordered_set<Range::Ptr> {
189  public:
190 
191  AssignGroup() noexcept : m_mutex() { }
192 
194  AssignGroup(const AssignGroup&) = delete;
196  AssignGroup& operator=(const AssignGroup&) = delete;
197 
198  ~AssignGroup() noexcept { }
199 
203  return empty() ? nullptr : *cbegin();
204  }
205 
207  void add(Range::Ptr&& range) {
209  insert(std::move(range));
210  }
211 
213  void add(const Range::Ptr& range) {
215  insert(range);
216  }
217 
219  void remove(const Range::Ptr& range) {
221  erase(range);
222  }
223 
225  void remove(const cid_t cid) {
227  for(auto it = cbegin();
228  it != cend();
229  (*it)->cfg->cid == cid ? (it = erase(it)) : ++it
230  );
231  }
232 
234  void reset() {
236  clear();
237  }
238 
239  private:
241  };
242 
243  AssignGroup& assign_group(const cid_t cid) noexcept {
244  return m_need_assign[
246  ? 3
248  ? 2
250  ? 1
251  : 0))
252  ];
253  }
254 
258 
259 };
260 
261 
262 }} // namespace SWC::Manager
263 
264 
265 
266 #endif // swcdb_manager_db_Columns_h
SWC::Manager::Columns::columns_by_fs
static void columns_by_fs(int &err, FS::IdEntries_t &entries)
Definition: Columns.h:28
SWC::Manager::Columns::AssignGroup::reset
SWC_CAN_INLINE void reset()
Definition: Columns.h:234
SWC::DB::SchemaPrimitives::NO_CID
static constexpr const cid_t NO_CID
Definition: Schema.h:25
SWC::DB::RangeBase::get_column_path
static const char * get_column_path() noexcept
Definition: RangeBase.h:26
SWC::DB::Schema::Ptr
std::shared_ptr< Schema > Ptr
Definition: Schema.h:185
SWC::Manager::Columns::AssignGroup::operator=
AssignGroup & operator=(AssignGroup &&)=delete
SWC::Env::FsInterface::interface
static SWC_CAN_INLINE FS::Interface::Ptr & interface() noexcept
Definition: Interface.h:150
SWC::Manager::Columns::AssignGroup::AssignGroup
AssignGroup() noexcept
Definition: Columns.h:191
SWC::Core::MutexSptd::scope
Definition: MutexSptd.h:96
SWC::DB::Types::Column
Column
Definition: Column.h:18
SWC::Manager::Columns::remove
void remove(const cid_t cid)
Definition: Columns.h:156
SWC::Manager::Columns::assign_remove
void assign_remove(const Range::Ptr &range)
Definition: Columns.h:175
SWC::Manager::Columns::AssignGroup::m_mutex
Core::MutexSptd m_mutex
Definition: Columns.h:240
SWC::Manager::Range::Ptr
std::shared_ptr< Range > Ptr
Definition: Range.h:24
SWC::Manager::Columns::print
void print(std::ostream &out)
Definition: Columns.h:179
SWC::Manager::Columns::~Columns
~Columns() noexcept
Definition: Columns.h:37
SWC::Manager::Columns::assign_add
void assign_add(const Range::Ptr &range)
Definition: Columns.h:171
SWC::Manager::Columns::AssignGroup::remove
SWC_CAN_INLINE void remove(const Range::Ptr &range)
Definition: Columns.h:219
SWC::Manager::Columns::AssignGroup::AssignGroup
AssignGroup(const AssignGroup &)=delete
SWC::Manager::Columns::assigned
void assigned(rgrid_t rgrid, size_t num, Core::Vector< Range::Ptr > &ranges)
Definition: Columns.h:123
SWC::Manager::Columns::AssignGroup::~AssignGroup
~AssignGroup() noexcept
Definition: Columns.h:198
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
Column.h
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::Manager::Columns::Columns
Columns() noexcept
Definition: Columns.h:35
SWC::Manager::Columns::AssignGroup
Definition: Columns.h:188
SWC::Manager::Columns::is_an_initialization
bool is_an_initialization(int &err, const DB::Schema::Ptr &schema)
Definition: Columns.h:54
SWC::Manager::Columns::set_rgr_unassigned
void set_rgr_unassigned(rgrid_t rgrid)
Definition: Columns.h:111
SWC::Manager::Columns::assign_add
void assign_add(Range::Ptr &&range)
Definition: Columns.h:167
SWC::DB::Types::SystemColumn::CID_META_END
const cid_t CID_META_END
Definition: SystemColumn.h:20
SWC::rgrid_t
uint64_t rgrid_t
Definition: Identifiers.h:18
SWC::DB::Types::SystemColumn::SYS_RGR_DATA
const cid_t SYS_RGR_DATA
Definition: SystemColumn.h:22
SWC::Manager::Columns::AssignGroup::add
SWC_CAN_INLINE void add(Range::Ptr &&range)
Definition: Columns.h:207
SWC::DB::Types::SystemColumn::CID_MASTER_END
const cid_t CID_MASTER_END
Definition: SystemColumn.h:18
SWC::Manager::Columns::change_rgr
void change_rgr(rgrid_t rgrid_old, rgrid_t rgrid)
Definition: Columns.h:117
Schema.h
SWC::Manager::Columns::AssignGroup::get
SWC_CAN_INLINE Range::Ptr get()
Definition: Columns.h:201
SWC::cid_t
uint64_t cid_t
Definition: Identifiers.h:16
SWC::Error::COLUMN_NOT_EXISTS
@ COLUMN_NOT_EXISTS
Definition: Error.h:100
SWC::Manager::Columns::AssignGroup::add
SWC_CAN_INLINE void add(const Range::Ptr &range)
Definition: Columns.h:213
SWC::Core::Vector
Definition: Vector.h:14
SWC::DB::Types::SystemColumn::CID_META_BEGIN
const cid_t CID_META_BEGIN
Definition: SystemColumn.h:19
SWC::Manager::Columns::m_mutex
Core::MutexSptd m_mutex
Definition: Columns.h:256
SWC::Manager::Columns::get_column
Column::Ptr get_column(int &err, const cid_t cid)
Definition: Columns.h:71
SWC::DB::Types::SystemColumn::CID_MASTER_BEGIN
const cid_t CID_MASTER_BEGIN
Definition: SystemColumn.h:17
SWC::Manager::Columns::get_need_health_check
Column::Ptr get_need_health_check(int64_t ts, uint32_t ms)
Definition: Columns.h:143
SWC::Manager::Columns::Ptr
Columns * Ptr
Definition: Columns.h:33
SWC::Core::MutexSptd
Definition: MutexSptd.h:16
SWC::Manager::Columns::reset
void reset()
Definition: Columns.h:39
SWC::Manager::Columns::m_need_assign
AssignGroup m_need_assign[4]
Definition: Columns.h:255
SWC::Manager::Columns::state
void state(int &err)
Definition: Columns.h:48
SWC::Manager::Column::Ptr
std::shared_ptr< Column > Ptr
Definition: Column.h:24
SWC::Manager::Columns::m_health_last_cid
cid_t m_health_last_cid
Definition: Columns.h:257
SWC::Manager::Columns::AssignGroup::remove
SWC_CAN_INLINE void remove(const cid_t cid)
Definition: Columns.h:225
SWC::Manager::Columns
Definition: Columns.h:24
_PRELOAD
#define _PRELOAD(_GROUP, _BEGIN, _END)
ColumnCfg.h
Interface.h
SWC::Manager::Columns::AssignGroup::operator=
AssignGroup & operator=(const AssignGroup &)=delete
SWC::Manager::Columns::get_next_unassigned
Range::Ptr get_next_unassigned(bool &waiting_meta)
Definition: Columns.h:80
SWC::Manager::Columns::AssignGroup::AssignGroup
AssignGroup(AssignGroup &&)=delete
SystemColumn.h
SWC::Manager::Columns::assign_group
AssignGroup & assign_group(const cid_t cid) noexcept
Definition: Columns.h:243