SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
Common.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 
10 
11 
12 namespace SWC { namespace client { namespace Query { namespace Update {
13 
14 
15 namespace Handlers {
16 
17 
18 Common::Common(const Clients::Ptr& a_clients,
19  Cb_t&& cb, const Comm::IoContextPtr& io,
20  Clients::Flag a_executor) noexcept
21  : BaseUnorderedMap(a_clients, a_executor),
22  valid_state(true),
23  m_cb(std::move(cb)), m_dispatcher_io(io),
24  m_mutex(), m_cv() {
25 }
26 
27 bool Common::requires_commit() noexcept {
29 }
30 
31 bool Common::valid() noexcept {
32  return valid_state;
33 }
34 
35 void Common::response(int err) {
36  if(!completion.is_last()) {
38  return m_cv.notify_all();
39  }
40 
41  if(!err && requires_commit()) {
42  commit();
44  return m_cv.notify_all();
45  }
46 
47  if(err)
48  error(err);
49  else if(!empty())
51 
52  profile.finished();
53  if(m_cb) {
54  struct Task {
55  Ptr hdlr;
57  Task(Ptr&& a_hdlr) noexcept : hdlr(std::move(a_hdlr)) { }
59  Task(Task&& other) noexcept : hdlr(std::move(other.hdlr)) { }
60  Task(const Task&) = delete;
61  Task& operator=(Task&&) = delete;
62  Task& operator=(const Task&) = delete;
63  ~Task() noexcept { }
64  void operator()() {
65  hdlr->m_cb(hdlr);
66 
67  Core::ScopedLock lock(hdlr->m_mutex);
68  hdlr->m_cv.notify_all();
69  }
70  };
72  ->post(Task(std::dynamic_pointer_cast<Common>(shared_from_this())));
73 
74  } else {
76  m_cv.notify_all();
77  }
78 }
79 
80 
81 void Common::wait() {
82  Core::UniqueLock lock_wait(m_mutex);
83  if(completion.count()) {
84  m_cv.wait(lock_wait, [this]() { return !completion.count(); });
85  }
86 }
87 
89  size_t bytes = size_bytes();
90 
91  Core::UniqueLock lock_wait(m_mutex);
92  if(from == completion.count())
93  return bytes >= buff_sz;
94 
95  if(bytes < buff_sz * buff_ahead)
96  return false;
97 
98  if(from < completion.count()) {
99  m_cv.wait(lock_wait, [this, from]() {
100  return from == completion.count() ||
102  });
103  }
104  return from == completion.count() && size_bytes() >= buff_sz;
105 }
106 
107 void Common::commit_or_wait(Base::Column* colp, uint64_t from) {
109  colp ? commit(colp) : commit();
110 }
111 
113  if(!completion.count() && size_bytes())
114  commit();
115 }
116 
117 
118 
119 }}}}}
120 
SWC::client::Query::Update::Handlers::Common::m_dispatcher_io
Comm::IoContextPtr m_dispatcher_io
Definition: Common.h:58
Clients.h
SWC::client::Query::Update::Handlers::BaseUnorderedMap::empty
virtual bool empty() noexcept override
Definition: BaseUnorderedMap.cc:23
SWC::Core::UniqueLock
Definition: MutexLock.h:68
SWC::client::Query::Update::Handlers::Common::valid_state
Core::AtomicBool valid_state
Definition: Common.h:32
SWC::client::Query::Update::Handlers::Common::wait
void wait()
Definition: Common.cc:81
SWC::Core::ScopedLock
Definition: MutexLock.h:41
SWC::client::Query::Update::Handlers::Base::Ptr
std::shared_ptr< Base > Ptr
Definition: Base.h:27
SWC::client::Clients::Ptr
ClientsPtr Ptr
Definition: Clients.h:58
SWC::Comm::IoContextPtr
std::shared_ptr< IoContext > IoContextPtr
Definition: IoContext.h:16
SWC::client::Query::Update::Handlers::BaseUnorderedMap
Definition: BaseUnorderedMap.h:20
SWC::client::Query::Update::Handlers::Common::valid
virtual bool valid() noexcept override
Definition: Common.cc:31
SWC::client::Query::Update::Handlers::Common::m_cb
const Cb_t m_cb
Definition: Common.h:57
SWC::client::Query::Update::Handlers::Base::operator=
Base & operator=(const Base &)=delete
SWC::client::Query::Update::Handlers::BaseUnorderedMap::requires_commit
virtual bool requires_commit() noexcept override
Definition: BaseUnorderedMap.cc:15
SWC::client::Query::Update::Handlers::Base::commit
void commit()
Definition: Base.h:179
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::client::Query::Update::Handlers::Base::buff_sz
Core::Atomic< uint32_t > buff_sz
Definition: Base.h:117
SWC::client::Query::Update::Handlers::Common::wait_ahead_buffers
bool wait_ahead_buffers(uint64_t from=0)
Definition: Common.cc:88
SWC::client::Query::Update::Handlers::Common::commit_or_wait
void commit_or_wait(Base::Column *colp=nullptr, uint64_t from=0)
Definition: Common.cc:107
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::client::Query::Update::Handlers::Base::completion
Core::CompletionCounter< uint64_t > completion
Definition: Base.h:113
SWC::client::Query::Update::Handlers::Common::Cb_t
std::function< void(const Common::Ptr &)> Cb_t
Definition: Common.h:21
SWC::client::Clients::Flag
Flag
Definition: Clients.h:60
SWC::client::Query::Update::Handlers::Base::Column
Definition: Base.h:30
SWC::client::Query::Update::Handlers::BaseUnorderedMap::size_bytes
virtual size_t size_bytes() noexcept override
Definition: BaseUnorderedMap.cc:39
SWC::client::Query::Update::Handlers::Common::response
virtual void response(int err=Error::OK) override
Definition: Common.cc:35
SWC::client::Query::Profiling::finished
SWC_CAN_INLINE void finished() noexcept
Definition: Profiling.h:127
SWC::Error::CLIENT_DATA_REMAINED
@ CLIENT_DATA_REMAINED
Definition: Error.h:125
SWC::client::Query::Update::Handlers::Common::Common
Common(const Clients::Ptr &clients, Cb_t &&cb, const Comm::IoContextPtr &io=nullptr, Clients::Flag executor=Clients::DEFAULT) noexcept
Definition: Common.cc:18
SWC::Core::CompletionCounter::count
constexpr SWC_CAN_INLINE CountT count() const noexcept
Definition: CompletionCounter.h:42
SWC::client::Query::Update::Handlers::Common::m_mutex
std::mutex m_mutex
Definition: Common.h:59
SWC::client::Query::Update::Handlers::Base::buff_ahead
Core::Atomic< uint8_t > buff_ahead
Definition: Base.h:118
SWC::Condition::from
Comp from(const char **buf, uint32_t *remainp, uint8_t extended=0x00) noexcept
Definition: Comparators.cc:15
Committer.h
SWC::client::Query::Update::Handlers::Common::commit_if_need
void commit_if_need()
Definition: Common.cc:112
SWC::client::Query::Update::Handlers::Common::requires_commit
virtual bool requires_commit() noexcept override
Definition: Common.cc:27
SWC::Core::CompletionCounter::is_last
constexpr SWC_CAN_INLINE bool is_last() noexcept
Definition: CompletionCounter.h:37
SWC::client::Query::Update::Handlers::Base::profile
Profiling profile
Definition: Base.h:111
SWC::client::Query::Update::Handlers::Base::clients
Clients::Ptr clients
Definition: Base.h:110
SWC::client::Query::Update::Handlers::Common::error
virtual void error(cid_t cid, int err) noexcept=0
Common.h
SWC::client::Query::Update::Handlers::Common::m_cv
std::condition_variable m_cv
Definition: Common.h:60