SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
Column.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_Column_h
8 #define swcdb_manager_db_Column_h
9 
10 
11 #include "swcdb/manager/db/Range.h"
13 
14 
15 namespace SWC { namespace Manager {
16 
17 
18 class Column final : private Core::Vector<Range::Ptr> {
19 
20  public:
21 
23 
24  typedef std::shared_ptr<Column> Ptr;
25 
26  static bool create(int &err, const cid_t cid) {
28  return true;
29  }
30 
31  static bool remove(int &err, const cid_t cid) {
32  Env::FsInterface::interface()->rmdir_incl_opt_subs(
33  err,
36  );
37  return true;
38  }
39 
41 
43  Column(const DB::Schema::Ptr& schema)
44  : cfg(new ColumnCfg(schema)),
45  m_mutex(),
47  }
48 
49  ~Column() noexcept { }
50 
51  void init(int &err);
52 
53  void set_loading() {
55  _set_loading();
56  }
57 
58  void set_unloaded(const Range::Ptr& range) {
60  range->set_state_none();
61  _set_loading();
62  }
63 
64  bool set_merging(const Range::Ptr& range) {
66  if(m_state == State::DELETED)
67  return false;
68  range->set_state(Range::State::MERGE, 0);
70  return true;
71  }
72 
76  return m_state;
77  }
78 
81  return m_state;
82  }
83 
85  void state(int& err) {
87  switch(m_state) {
88  case State::OK:
89  break;
90  case State::DELETED:
92  break;
93  default:
95  break;
96  }
97  }
98 
99  size_t ranges() {
101  return size();
102  }
103 
104  void assigned(rgrid_t rgrid, size_t& num,
105  Core::Vector<Range::Ptr>& _ranges) {
107  for(auto& range : *this) {
108  if(range->assigned(rgrid)) {
109  _ranges.push_back(range);
110  if(!-num)
111  break;
112  }
113  }
114  }
115 
118  _ranges.assign(cbegin(), cend());
119  }
120 
123  for(auto& range : *this) {
124  if(range->rid == rid)
125  return range;
126  }
127  return nullptr;
128  }
129 
131  const DB::Cell::Key& range_begin,
132  const DB::Cell::Key& range_end,
133  bool next_range) {
134  bool found = false;
136  for(auto& range : *this) {
137  if(!range->includes(range_begin, range_end))
138  continue;
139  if(!next_range)
140  return range;
141  if(!found) {
142  found = true;
143  continue;
144  }
145  return range;
146  }
147  return nullptr;
148  }
149 
150  void sort(Range::Ptr& range,
151  const DB::Cells::Interval& interval, int64_t revision) {
153 
154  // std::sort(begin(), end(), Range);
155  if(!range->equal(interval)) {
156  range->set(interval, revision);
157 
158  if(size() > 1) {
159  for(auto it = cbegin(); it != cend(); ++it) {
160  if(range->rid == (*it)->rid) {
161  erase(it);
162  break;
163  }
164  }
165  bool added = false;
166  for(auto it=cbegin(); it != cend(); ++it) {
167  if((*it)->after(range)) {
168  insert(it, range);
169  added = true;
170  break;
171  }
172  }
173  if(!added)
174  push_back(range);
175  }
176  }
177 
179  }
180 
183 
184  if(!empty()) for(auto it = cbegin() + 1; it != cend(); ++it) {
185  if((*it)->rid == right->rid)
186  return *--it;
187  }
188  return nullptr;
189  }
190 
193 
194  auto& range = emplace_back(new Range(cfg, _get_next_rid()));
195  // if !rid - err reached id limit
196  range->set_state(Range::State::CREATED, rgrid);
197  return range;
198  }
199 
202  return _get_next_rid();
203  }
204 
207 
208  for(auto& range : *this) {
209  if(range->need_assign()) {
210  _set_loading();
211  return range;
212  }
213  }
214  return nullptr;
215  }
216 
219 
220  for(auto& range : *this) {
221  if(range->get_rgr_id() == rgrid) {
222  range->set_state_none();
223  _set_loading();
224  }
225  }
226  _remove_rgr_schema(rgrid);
227  }
228 
229  void change_rgr(rgrid_t rgrid_old, rgrid_t rgrid) {
231 
232  for(auto& range : *this) {
233  if(range->get_rgr_id() == rgrid_old) {
234  range->set_rgr_id(rgrid);
235  }
236  }
237  auto it = m_schemas_rev.find(rgrid_old);
238  if(it != m_schemas_rev.cend()) {
239  int64_t rev = it->second;
240  m_schemas_rev.erase(it);
241  m_schemas_rev[rgrid] = rev;
242  }
243  }
244 
245  void change_rgr_schema(const rgrid_t rgrid, int64_t rev=0) {
247  m_schemas_rev[rgrid] = rev;
248  }
249 
250  void remove_rgr_schema(const rgrid_t rgrid) {
252  _remove_rgr_schema(rgrid);
253  }
254 
255  void need_schema_sync(int64_t rev, Core::Vector<rgrid_t> &rgrids) {
257 
258  for(auto it = m_schemas_rev.cbegin(); it != m_schemas_rev.cend(); ++it) {
259  if(it->second != rev)
260  rgrids.push_back(it->first);
261  }
262  }
263 
264  bool need_schema_sync(const rgrid_t rgrid, int64_t rev) {
266 
267  auto it = m_schemas_rev.find(rgrid);
268  if(it != m_schemas_rev.cend())
269  return rev != it->second;
270  return true;
271  }
272 
275 
276  rgrid_t rgrid;
277  for(auto& range : *this) {
278  if(!(rgrid = range->get_rgr_id()))
279  continue;
280  if(std::find(rgrids.cbegin(), rgrids.cend(), rgrid) == rgrids.cend())
281  rgrids.push_back(rgrid);
282  }
283  }
284 
287  m_check_ts = 0;
288  }
289 
290  bool need_health_check(int64_t ts, uint32_t ms) {
292  if(m_state == State::OK && m_check_ts + ms < ts) {
293  m_check_ts = ts;
294  return true;
295  }
296  return false;
297  }
298 
299  void need_health_check(int64_t ts, uint32_t ms,
300  Core::Vector<Range::Ptr> &_ranges,
301  rgrid_t rgrid = 0, size_t max = 0) {
303  for(auto& range : *this) {
304  if(range->need_health_check(ts, ms, rgrid)) {
305  _ranges.push_back(range);
306  if(max && _ranges.size() == max)
307  return;
308  }
309  }
310  }
311 
312  void remove_range(rid_t rid) {
314  for(auto it = cbegin(); it != cend(); ++it) {
315  if(rid == (*it)->rid) {
316  (*it)->set_deleted();
317  erase(it);
319  break;
320  }
321  }
322  }
323 
324  bool do_remove() {
326 
328  m_schemas_rev.clear();
329 
330  if(!was) {
331  for(auto& range : *this)
332  range->set_deleted();
333  }
334  return !was;
335  }
336 
337  bool finalize_remove(int &err, rgrid_t rgrid=0) {
339 
340  if(!rgrid) {
341  clear();
342  } else {
343  rgrid_t eid;
344  for(auto it=cbegin(); it != cend(); ) {
345  if((eid = (*it)->get_rgr_id()) == rgrid || !eid)
346  erase(it);
347  else
348  ++it;
349  }
350  }
351  if(empty()) {
353  err, DB::RangeBase::get_path(cfg->cid));
354  SWC_LOG_OUT(LOG_DEBUG, _print(SWC_LOG_OSTREAM << "FINALIZED REMOVE "); );
355  return true;
356  }
357  return false;
358  }
359 
360  void print(std::ostream& out) {
362  _print(out);
363  }
364 
365  private:
366 
367  void _print(std::ostream& out) {
368  cfg->print(out << '(');
369  out << " next-rid=" << _get_next_rid()
370  << " ranges=[";
371  for(auto& range : *this) {
372  range->print(out);
373  out << ',';
374  }
375  out << "])";
376  }
377 
379  void _set_loading() {
380  State at(State::OK);
382  m_check_ts = 0;
383  }
384 
385  rid_t SWC_PURE_FUNC _get_next_rid() const noexcept {
386  rid_t rid = 0;
387  for(bool unused; ++rid; ) {
388  unused = true;
389  for(auto& range : *this) {
390  if(range->rid == rid) {
391  unused = false;
392  break;
393  }
394  }
395  if(unused)
396  break;
397  }
398  return rid;
399  }
400 
401  void _remove_rgr_schema(const rgrid_t rgrid) {
402  auto it = m_schemas_rev.find(rgrid);
403  if(it != m_schemas_rev.cend())
404  m_schemas_rev.erase(it);
405  }
406 
408  if(m_state != State::LOADING)
409  return;
410 
411  for(auto& range : *this) {
412  if(!range->assigned())
413  return;
414  }
415  State at = State::LOADING;
417  /* if Ranger do not select/check ranges on rid value match
418  once on start, Master & Meta column check rid consistency
419  on dup. cell of rid, delete earliest
420  */
422  }
423  }
424 
425  std::shared_mutex m_mutex;
427  int64_t m_check_ts;
428 
429  std::unordered_map<rgrid_t, int64_t> m_schemas_rev;
430 
431 };
432 
433 }}
434 
435 #endif // swcdb_manager_db_Column_h
SWC::Core::Vector< Range::Ptr >::erase
SWC_CAN_INLINE iterator erase(size_type offset) noexcept(_NoExceptMoveAssign &&_NoExceptDestructor)
Definition: Vector.h:464
SWC::Manager::Column::apply_loaded_state
void apply_loaded_state()
Definition: Column.h:407
SWC::Core::AtomicBase::compare_exchange_weak
constexpr SWC_CAN_INLINE bool compare_exchange_weak(T &at, T value) noexcept
Definition: Atomic.h:52
SWC::Manager::Column
Definition: Column.h:18
SWC::Manager::Column::init
void init(int &err)
Definition: Column.cc:14
SWC::Manager::Column::finalize_remove
bool finalize_remove(int &err, rgrid_t rgrid=0)
Definition: Column.h:337
SWC::Manager::ColumnCfg
Definition: ColumnCfg.h:15
SWC::Manager::Column::create_new_range
Range::Ptr create_new_range(rgrid_t rgrid)
Definition: Column.h:191
SWC::Manager::Column::~Column
~Column() noexcept
Definition: Column.h:49
SWC_LOG_OSTREAM
#define SWC_LOG_OSTREAM
Definition: Logger.h:44
SWC::Manager::Column::m_mutex
std::shared_mutex m_mutex
Definition: Column.h:425
Range.h
SWC::Manager::Column::need_health_check
bool need_health_check(int64_t ts, uint32_t ms)
Definition: Column.h:290
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::Core::Vector< Range::Ptr >::clear
SWC_CAN_INLINE void clear() noexcept(_NoExceptDestructor)
Definition: Vector.h:120
SWC_LOG_OUT
#define SWC_LOG_OUT(pr, _code_)
Definition: Logger.h:178
SWC::Manager::Column::left_sibling
Range::Ptr left_sibling(const Range::Ptr &right)
Definition: Column.h:181
SWC::Manager::Column::state
SWC_CAN_INLINE State state()
Definition: Column.h:74
SWC::Core::Atomic< State >
SWC::Core::ScopedLock
Definition: MutexLock.h:41
SWC::Manager::Column::get_next_rid
rid_t get_next_rid()
Definition: Column.h:200
SWC::Env::FsInterface::interface
static SWC_CAN_INLINE FS::Interface::Ptr & interface() noexcept
Definition: Interface.h:150
SWC::Core::SharedLock
Definition: MutexLock.h:19
SWC::Manager::Column::remove
static bool remove(int &err, const cid_t cid)
Definition: Column.h:31
SWC::DB::Cell::Key
Definition: CellKey.h:24
SWC::Manager::Range::Ptr
std::shared_ptr< Range > Ptr
Definition: Range.h:24
SWC::Manager::Column::change_rgr
void change_rgr(rgrid_t rgrid_old, rgrid_t rgrid)
Definition: Column.h:229
SWC::Manager::Column::state
SWC_CAN_INLINE void state(int &err)
Definition: Column.h:85
SWC::Manager::Column::Column
SWC_CAN_INLINE Column(const DB::Schema::Ptr &schema)
Definition: Column.h:43
SWC::Core::AtomicBase::store
constexpr SWC_CAN_INLINE void store(T v) noexcept
Definition: Atomic.h:37
SWC::Error::OK
@ OK
Definition: Error.h:45
SWC::DB::RangeBase::get_path
static const std::string get_path(const cid_t cid)
Definition: RangeBase.h:38
SWC::Core::Vector< Range::Ptr >::empty
constexpr SWC_CAN_INLINE bool empty() const noexcept
Definition: Vector.h:168
SWC::Manager::Column::cfg
const ColumnCfg::Ptr cfg
Definition: Column.h:40
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::Manager::Column::remove_rgr_schema
void remove_rgr_schema(const rgrid_t rgrid)
Definition: Column.h:250
SWC::LOG_DEBUG
@ LOG_DEBUG
Definition: Logger.h:36
SWC::Manager::Column::remove_range
void remove_range(rid_t rid)
Definition: Column.h:312
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC_PURE_FUNC
#define SWC_PURE_FUNC
Definition: Compat.h:108
SWC::DB::Types::MngrRange::CREATED
@ CREATED
Definition: MngrRangeState.h:20
SWC::Manager::Column::get_range
Range::Ptr get_range(const rid_t rid)
Definition: Column.h:121
SWC::Manager::Column::print
void print(std::ostream &out)
Definition: Column.h:360
SWC::DB::Types::MngrColumn::State
State
Definition: MngrColumnState.h:16
SWC::Manager::Column::_set_loading
SWC_CAN_INLINE void _set_loading()
Definition: Column.h:379
MngrColumnState.h
SWC::Manager::Column::get_range
Range::Ptr get_range(int &, const DB::Cell::Key &range_begin, const DB::Cell::Key &range_end, bool next_range)
Definition: Column.h:130
SWC::Manager::Column::m_check_ts
int64_t m_check_ts
Definition: Column.h:427
SWC::Manager::Column::set_loading
void set_loading()
Definition: Column.h:53
SWC::Manager::Column::do_remove
bool do_remove()
Definition: Column.h:324
SWC::Error::COLUMN_NOT_READY
@ COLUMN_NOT_READY
Definition: Error.h:99
SWC::Manager::Column::_print
void _print(std::ostream &out)
Definition: Column.h:367
SWC::rgrid_t
uint64_t rgrid_t
Definition: Identifiers.h:18
SWC::Manager::Column::set_unloaded
void set_unloaded(const Range::Ptr &range)
Definition: Column.h:58
SWC::Manager::Column::_get_next_rid
rid_t SWC_PURE_FUNC _get_next_rid() const noexcept
Definition: Column.h:385
SWC::Core::NotMovableSharedPtr< ColumnCfg >
SWC::cid_t
uint64_t cid_t
Definition: Identifiers.h:16
SWC::Core::AtomicBase::exchange
constexpr SWC_CAN_INLINE T exchange(T value) noexcept
Definition: Atomic.h:47
SWC::Core::Vector
Definition: Vector.h:14
SWC::Manager::Column::get_next_unassigned
Range::Ptr get_next_unassigned()
Definition: Column.h:205
SWC::Manager::Column::assigned
void assigned(rgrid_t rgrid, size_t &num, Core::Vector< Range::Ptr > &_ranges)
Definition: Column.h:104
SWC::DB::Types::MngrColumn::LOADING
@ LOADING
Definition: MngrColumnState.h:19
SWC::Core::Vector< Range::Ptr >::cend
constexpr SWC_CAN_INLINE const_iterator cend() const noexcept
Definition: Vector.h:232
SWC::Error::COLUMN_MARKED_REMOVED
@ COLUMN_MARKED_REMOVED
Definition: Error.h:102
SWC::Manager::Column::m_schemas_rev
std::unordered_map< rgrid_t, int64_t > m_schemas_rev
Definition: Column.h:429
SWC::Manager::Column::need_health_check
void need_health_check(int64_t ts, uint32_t ms, Core::Vector< Range::Ptr > &_ranges, rgrid_t rgrid=0, size_t max=0)
Definition: Column.h:299
SWC::rid_t
uint64_t rid_t
Definition: Identifiers.h:17
SWC::Manager::Column::m_state
Core::Atomic< State > m_state
Definition: Column.h:426
SWC::Manager::Column::get_ranges
void get_ranges(Core::Vector< Range::Ptr > &_ranges)
Definition: Column.h:116
SWC::Time::now_ms
SWC_CAN_INLINE int64_t now_ms() noexcept
Definition: Time.h:36
SWC::Manager::Column::_state
SWC_CAN_INLINE State _state()
Definition: Column.h:80
SWC::Manager::Column::set_rgr_unassigned
void set_rgr_unassigned(rgrid_t rgrid)
Definition: Column.h:217
SWC::Manager::Column::need_schema_sync
void need_schema_sync(int64_t rev, Core::Vector< rgrid_t > &rgrids)
Definition: Column.h:255
SWC::Manager::Column::need_schema_sync
bool need_schema_sync(const rgrid_t rgrid, int64_t rev)
Definition: Column.h:264
SWC::DB::Types::MngrColumn::DELETED
@ DELETED
Definition: MngrColumnState.h:20
SWC::Manager::Column::Ptr
std::shared_ptr< Column > Ptr
Definition: Column.h:24
SWC::Manager::Column::create
static bool create(int &err, const cid_t cid)
Definition: Column.h:26
SWC::Manager::Column::_remove_rgr_schema
void _remove_rgr_schema(const rgrid_t rgrid)
Definition: Column.h:401
SWC::Core::Vector::assign
SWC_CAN_INLINE void assign(IteratorT first, IteratorT last)
Definition: Vector.h:452
SWC::DB::Cells::Interval
Definition: Interval.h:17
SWC::Core::Vector::push_back
SWC_CAN_INLINE void push_back(ArgsT &&... args)
Definition: Vector.h:331
SWC::Core::Vector< Range::Ptr >::cbegin
constexpr SWC_CAN_INLINE const_iterator cbegin() const noexcept
Definition: Vector.h:216
SWC::Manager::Column::change_rgr_schema
void change_rgr_schema(const rgrid_t rgrid, int64_t rev=0)
Definition: Column.h:245
SWC::Core::Vector< Range::Ptr >::size
constexpr SWC_CAN_INLINE size_type size() const noexcept
Definition: Vector.h:189
SWC::Manager::Column::sort
void sort(Range::Ptr &range, const DB::Cells::Interval &interval, int64_t revision)
Definition: Column.h:150
SWC::DB::Types::Range
Range
Definition: Range.h:14
SWC::Core::Vector< Range::Ptr >::emplace_back
SWC_CAN_INLINE reference emplace_back(ArgsT &&... args)
Definition: Vector.h:349
SWC::Manager::Column::assigned
void assigned(Core::Vector< rgrid_t > &rgrids)
Definition: Column.h:273
SWC::Core::Vector< Range::Ptr >::insert
SWC_CAN_INLINE iterator insert(size_type offset, ArgsT &&... args)
Definition: Vector.h:367
SWC::Manager::Column::ranges
size_t ranges()
Definition: Column.h:99
SWC::Manager::Column::set_merging
bool set_merging(const Range::Ptr &range)
Definition: Column.h:64
SWC::DB::Types::MngrRange::MERGE
@ MERGE
Definition: MngrRangeState.h:22
SWC::Manager::Column::reset_health_check
void reset_health_check()
Definition: Column.h:285