9 namespace SWC {
namespace Manager {
14 : m_local_endpoints(endpoints),
16 m_mutex(), m_states(), m_checkin(), m_local_groups(),
18 m_major_updates(false), m_mngrs_client_srv(),
20 m_check_timer(asio::high_resolution_timer(app_io->executor())),
22 m_mngr_inchain(new Comm::client::ConnQueue(app_io)),
24 Env::Config::settings()->get<Config::Property::Value_uint16_g>(
25 "swc.mngr.role.connection.probes")),
27 Env::Config::settings()->get<Config::Property::Value_int32_g>(
28 "swc.mngr.role.connection.timeout")),
30 Env::Config::settings()->get<Config::Property::Value_int32_g>(
31 "swc.mngr.role.connection.fallback.failures")),
33 Env::Config::settings()->get<Config::Property::Value_int32_g>(
34 "swc.mngr.role.request.timeout")),
36 Env::Config::settings()->get<Config::Property::Value_int32_g>(
37 "swc.mngr.role.check.delay.updated")),
39 Env::Config::settings()->get<Config::Property::Value_int32_g>(
40 "swc.mngr.role.check.interval")),
42 Env::Config::settings()->get<Config::Property::Value_int32_g>(
43 "swc.mngr.role.check.delay.fallback")) {
52 auto set_in = std::chrono::milliseconds(t_ms);
54 auto now = asio::high_resolution_timer::clock_type::now();
55 if(set_on > now && set_on < now + set_in)
62 TimerTask(
MngrRole* a_ptr) noexcept : ptr(a_ptr) { }
63 void operator()(
const asio::error_code& ec) {
64 if(ec != asio::error::operation_aborted)
90 host->cid_begin <= cid &&
91 (!host->cid_end || host->cid_end >= cid))
109 for(
auto& g : groups) {
114 g->role == host->role &&
115 g->cid_begin == host->cid_begin && g->cid_end == host->cid_end) {
144 bool new_recs =
false;
147 for(
auto& host : states) {
151 if(local && !token &&
152 uint8_t(host->state.load()) < uint8_t(DB::Types::MngrState::STANDBY)) {
153 update_state(host->endpoints, DB::Types::MngrState::STANDBY);
161 if(host_set->state == DB::Types::MngrState::OFF
162 && host->state > DB::Types::MngrState::OFF) {
167 if(uint8_t(host->state.load()) < uint8_t(DB::Types::MngrState::STANDBY)) {
168 if(host->state != host_set->state) {
171 host->state : host_set->state);
182 if(host->state != host_set->state
183 && host_set->priority != high_set->priority) {
184 update_state(host->endpoints, DB::Types::MngrState::STANDBY);
197 if(host->priority > high_set->priority) {
198 if(uint8_t(host->state.load())
199 > uint8_t(DB::Types::MngrState::STANDBY)) {
207 if(uint8_t(host->state.load())
218 for(
auto& host : states) {
221 auto hosts_pr_group =
223 host->role, host->cid_begin, host->cid_end);
224 for(
auto& h : hosts_pr_group) {
231 if(!l_high || l_high->state < DB::Types::MngrState::WANT) {
241 if(!token || !turn_around) {
311 <<
" server=" << endpoint_server
312 <<
" client=" << endpoint_client;
315 update_state(endpoint_server, DB::Types::MngrState::OFF);
340 if(h->conn && h->conn->is_open())
347 out <<
"Mngrs Role:";
349 h->print(out <<
"\n ");
353 out <<
"\nLocal-Endpoints: [";
355 out << endpoint <<
',';
361 for(
auto& g : groups) {
364 for(
auto& endpoints : g->get_hosts()) {
369 host->priority.store(pr);
378 g->role, g->cid_begin, g->cid_end, endpoints,
nullptr, pr));
383 for(
auto& g : groups) {
384 for(
auto& endpoints : g->get_hosts()) {
414 if(h->state != DB::Types::MngrState::OFF)
426 endpoint.address().to_string() +
"|" +
481 if(host_chk->conn && host_chk->conn->is_open())
492 uint32_t a_next, uint32_t a_total,
bool a_flw) noexcept
493 : ptr(a_ptr), host_chk(a_host_chk),
494 next(a_next), total(a_total), flw(a_flw) { }
495 Callback(Callback&& other) noexcept
496 : ptr(other.ptr), host_chk(std::move(other.host_chk)),
497 next(other.next), total(other.total), flw(other.flw) { }
498 Callback(
const Callback&) =
delete;
499 Callback&
operator=(Callback&&) =
delete;
500 Callback&
operator=(
const Callback&) =
delete;
501 ~Callback() noexcept { }
510 this, host_chk, next, total, flw
515 uint32_t next, uint32_t total,
bool flw,
517 if(!conn || !conn->is_open()) {
525 host->state.store(DB::Types::MngrState::OFF);
540 host->state.store(state);
551 host->state.store(state);
571 if(host->eq_grouping(*other.get()) &&
572 (!h || h->state < host->state))
583 if(host->eq_grouping(*other.get()) &&
584 host->state != DB::Types::MngrState::OFF)
592 uint8_t role_old, role_new;
593 bool has_cols =
false;
609 cid_begin = host_local->cid_begin;
610 cid_end = host_local->cid_end;
620 if(role_old == role_new)