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.cc
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 
8 
9 
10 namespace SWC { namespace Ranger {
11 
12 
16  auto it = find(cid);
17  return it == cend() ? nullptr : it->second;
18 }
19 
21 RangePtr Columns::get_range(int &err, const cid_t cid, const rid_t rid) {
22  ColumnPtr col = get_column(cid);
23  if(!col)
24  return nullptr;
25  if(col->removing())
27  return err ? nullptr : col->get_range(rid);
28 }
29 
30 ColumnPtr Columns::get_next(cid_t& last_cid, size_t& idx) {
32  if(last_cid) {
33  auto it = find(last_cid);
34  if(it != cend()) {
35  if(++it != cend()) {
36  last_cid = it->second->cfg->cid;
37  return it->second;
38  }
39  idx = 0;
40  last_cid = 0;
41  return nullptr;
42  }
43  }
44  if(size() > idx) {
45  auto it = cbegin();
46  for(size_t i=idx; i; --i, ++it);
47  last_cid = it->second->cfg->cid;
48  return it->second;
49  }
50  idx = 0;
51  last_cid = 0;
52  return nullptr;
53 }
54 
57  cids.reserve(size());
58  for(auto it = cbegin(); it != cend(); ++it)
59  cids.push_back(it->first);
60 }
61 
64  columns.reserve(size());
65  for(auto it = cbegin(); it != cend(); ++it)
66  columns.push_back(it->second);
67 }
68 
70  const Callback::RangeLoad::Ptr& req) {
71  int err = Error::OK;
72  ColumnPtr col;
77 
78  } else {
79  {
81  auto res = emplace(req->cid, nullptr);
82  if(res.second) {
83  res.first->second.reset(new Column(req->cid, schema));
84  } else if(!res.first->second->ranges_count()) {
85  if(res.first->second->cfg->use_count() > 1)
87  "Column cid=" SWC_FMT_LU " remained with use-count=" SWC_FMT_LU
88  ", resetting",
89  req->cid, size_t(res.first->second->cfg->use_count()));
90  res.first->second.reset(new Column(req->cid, schema));
91  } else {
92  res.first->second->cfg->update(schema);
93  }
94  col = res.first->second;
95  }
96  if(col->removing()) {
98 
99  } else if(Env::Rgr::is_shuttingdown() ||
103  }
104  }
105  err
106  ? req->response(err)
107  : col->add_managing(Callback::ManageBase::Ptr(req));
108 }
109 
110 bool Columns::unload(cid_t cid_begin, cid_t cid_end,
112  {
113  uint8_t count = 0;
114  uint32_t max = Env::Rgr::res().concurrency() / 2;
115  if(!max)
116  max = 1;
118  for(auto it = cbegin(); it != cend(); ++it) {
119  if((!cid_begin || cid_begin <= it->first) &&
120  (!cid_end || cid_end >= it->first)) {
121  req->add(it->second);
122  if(++count == max)
123  return ++it != cend();
124  }
125  }
126  }
127  return false;
128 }
129 
130 void Columns::unload_all(bool validation) {
132  new Callback::ColumnsUnloadAll(validation));
133  bool more;
134  do {
135  more = unload(DB::Types::SystemColumn::SYS_CID_END + 1, 0, req);
136  req->run();
137  req->wait();
138  } while(more);
139 
140  do {
141  more = unload(DB::Types::SystemColumn::SYS_RGR_DATA + 1, 0, req);
142  req->run();
143  req->wait();
144  } while(more);
145 
146  do {
148  req->run();
149  req->wait();
150  } while(more);
151 
152  do {
153  more = unload(0, 0, req);
154  req->run();
155  req->wait();
156  } while(more);
157 }
158 
161  auto it = find(cid);
162  if(it != cend() && it->second->is_not_used()) {
163  erase(it);
164  }
165 }
166 
169  auto it = find(cid);
170  if(it != cend())
171  erase(it);
172 }
173 
174 size_t Columns::release(size_t bytes) {
175  if(m_release.running())
176  return 0;
177 
178  size_t released = 0;
179  uint8_t level = 0;
180  /* Release-Levels:
181  0: cellstores
182  1: fragments
183  2: blocks (only data-columns)
184  3: commit-log
185  4: blocks-structure (only data-columns)
186  */
187  do {
189  "Columns::release bytes=" SWC_FMT_LU " level=%u released=" SWC_FMT_LU,
190  bytes, level, released);
191  ColumnPtr col = nullptr;
192  const_iterator it;
193  for(size_t offset = 0; ; ++offset) {
194  {
196  if(col && (it = find(col->cfg->cid)) != cend()) {
197  ++it;
198  } else {
199  it = cbegin();
200  for(size_t i=0; i < offset && it != cend(); ++it, ++i);
201  }
202  if(level == 2 || level == 4) {
203  for(; it != cend() &&
205  ++it);
206  }
207  if(it == cend())
208  break;
209  col = it->second;
210  }
211  released += col->release(bytes - released, level);
212  if(released >= bytes)
213  break;
214  }
215  } while(released < bytes && ++level < 5);
216 
217  m_release.stop();
218  return released;
219 }
220 
221 void Columns::print(std::ostream& out, bool minimal) {
222  out << "columns=[";
224  for(auto it = cbegin(); it != cend(); ++it){
225  it->second->print(out, minimal);
226  out << ", ";
227  }
228  out << "]";
229 }
230 
231 
232 }} // namespace SWC::Ranger
SWC::Env::Rgr::res
static SWC_CAN_INLINE System::Resources & res() noexcept
Definition: RangerEnv.h:131
SWC::Core::StateRunning::stop
constexpr SWC_CAN_INLINE void stop() noexcept
Definition: StateRunning.h:32
SWC::Ranger::Columns::get_range
RangePtr get_range(int &err, const cid_t cid, const rid_t rid)
Definition: Columns.cc:21
SWC::System::Resources::concurrency
SWC_CAN_INLINE uint32_t concurrency() const noexcept
Definition: Resources.h:134
SWC::Ranger::Callback::ColumnsUnload::Ptr
std::shared_ptr< ColumnsUnload > Ptr
Definition: ColumnsUnload.h:20
SWC::Ranger::Columns::internal_delete
void internal_delete(cid_t cid)
Definition: Columns.cc:167
SWC::Error::SERVER_SHUTTING_DOWN
@ SERVER_SHUTTING_DOWN
Definition: Error.h:84
SWC_LOGF
#define SWC_LOGF(priority, fmt,...)
Definition: Logger.h:188
SWC::DB::Types::SystemColumn::is_data
constexpr SWC_CAN_INLINE bool is_data(cid_t cid) noexcept
Definition: SystemColumn.h:46
SWC::Ranger::Columns::print
void print(std::ostream &out, bool minimal=true)
Definition: Columns.cc:221
SWC::Core::MutexSptd::scope
Definition: MutexSptd.h:96
SWC::DB::SchemaPrimitives
Definition: Schema.h:23
SWC::DB::Types::SystemColumn::SYS_CID_END
const cid_t SYS_CID_END
Definition: SystemColumn.h:27
SWC::DB::Types::Column
Column
Definition: Column.h:18
SWC::Ranger::Callback::ColumnsUnloadAll
Definition: ColumnsUnloadAll.h:17
SWC::Ranger::Columns::get_column
ColumnPtr get_column(const cid_t cid)
Definition: Columns.cc:14
SWC::Ranger::Columns::get_cids
void get_cids(cids_t &cids)
Definition: Columns.cc:55
SWC::Ranger::ColumnPtr
std::shared_ptr< Column > ColumnPtr
Definition: Columns.h:13
SWC::Ranger::Columns::load_range
void load_range(const DB::SchemaPrimitives &schema, const Callback::RangeLoad::Ptr &req)
Definition: Columns.cc:69
SWC::Ranger::Columns::erase_if_empty
void erase_if_empty(cid_t cid)
Definition: Columns.cc:159
SWC::Error::OK
@ OK
Definition: Error.h:45
SWC::Ranger::RangePtr
std::shared_ptr< Range > RangePtr
Definition: Columns.h:15
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::LOG_DEBUG
@ LOG_DEBUG
Definition: Logger.h:36
SWC::Ranger::Columns::m_release
Core::StateRunning m_release
Definition: Columns.h:73
SWC::Ranger::Columns::get_next
ColumnPtr get_next(cid_t &last_cid, size_t &idx)
Definition: Columns.cc:30
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
size
uint32_t size
Buffer size.
Definition: HeaderBufferInfo.h:47
SWC::Core::StateRunning::running
constexpr SWC_CAN_INLINE bool running() noexcept
Definition: StateRunning.h:37
SWC::DB::Types::SystemColumn::SYS_RGR_DATA
const cid_t SYS_RGR_DATA
Definition: SystemColumn.h:22
SWC_FMT_LU
#define SWC_FMT_LU
Definition: Compat.h:98
SWC::cid_t
uint64_t cid_t
Definition: Identifiers.h:16
SWC::Ranger::Callback::ManageBase::Ptr
std::shared_ptr< ManageBase > Ptr
Definition: ManageBase.h:23
Columns.h
SWC::Core::Vector< cid_t, cid_t >
SWC::DB::Types::SystemColumn::CID_META_BEGIN
const cid_t CID_META_BEGIN
Definition: SystemColumn.h:19
SWC::Ranger::Columns::m_mutex
Core::MutexSptd m_mutex
Definition: Columns.h:72
SWC::Ranger::Columns::unload
bool unload(cid_t cid_begin, cid_t cid_end, Callback::ColumnsUnload::Ptr req)
Definition: Columns.cc:110
SWC::Error::COLUMN_MARKED_REMOVED
@ COLUMN_MARKED_REMOVED
Definition: Error.h:102
SWC::Env::Rgr::is_shuttingdown
static SWC_CAN_INLINE bool is_shuttingdown() noexcept
Definition: RangerEnv.h:58
SWC::rid_t
uint64_t rid_t
Definition: Identifiers.h:17
SWC::Ranger::Columns::unload_all
void unload_all(bool validation)
Definition: Columns.cc:130
SWC::Ranger::Callback::RangeLoad::Ptr
std::shared_ptr< RangeLoad > Ptr
Definition: RangeLoad.h:16
SWC::Env::Rgr::is_not_accepting
static SWC_CAN_INLINE bool is_not_accepting() noexcept
Definition: RangerEnv.h:53
SWC::Ranger::Callback::ColumnsUnloadAll::Ptr
std::shared_ptr< ColumnsUnloadAll > Ptr
Definition: ColumnsUnloadAll.h:20
SWC::LOG_WARN
@ LOG_WARN
Definition: Logger.h:33
SWC::Ranger::Columns::get_columns
void get_columns(Core::Vector< ColumnPtr > &columns)
Definition: Columns.cc:62
SWC::Core::Vector::push_back
SWC_CAN_INLINE void push_back(ArgsT &&... args)
Definition: Vector.h:331
SWC::Ranger::Columns::release
size_t release(size_t bytes=0)
Definition: Columns.cc:174
SWC::Core::Vector::reserve
SWC_CAN_INLINE void reserve(size_type cap)
Definition: Vector.h:288