You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.8 KiB
81 lines
1.8 KiB
//
|
|
// Created by mwo on 12/07/18.
|
|
//
|
|
|
|
#include "easylogging++.h"
|
|
#include "../om_log.h"
|
|
|
|
#include "MysqlPing.h"
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
namespace xmreg
|
|
{
|
|
|
|
MysqlPing::MysqlPing(
|
|
std::shared_ptr<MySqlConnector> _conn,
|
|
seconds _ping_time, seconds _sleep_time)
|
|
: conn {_conn}, ping_time {_ping_time},
|
|
thread_sleep_time {_sleep_time}
|
|
{}
|
|
|
|
void
|
|
MysqlPing::operator()()
|
|
{
|
|
|
|
// the while loop below is going to execute
|
|
// faster than ping_time specified. The reason
|
|
// is so that we can exit it in a timely manner
|
|
// when keep_looping becomes false
|
|
uint64_t between_ping_counter {0};
|
|
|
|
// if ping_time lower than thread_sleep_time,
|
|
// use ping_time for thread_sleep_time
|
|
thread_sleep_time = std::min(thread_sleep_time, ping_time);
|
|
|
|
// we are going to ping mysql every
|
|
// no_of_loops_between_pings iterations
|
|
// of the while loop
|
|
uint64_t no_of_loops_between_pings
|
|
= std::max<uint64_t>(1,
|
|
ping_time.count()/thread_sleep_time.count()) - 1;
|
|
|
|
|
|
while (keep_looping)
|
|
{
|
|
std::this_thread::sleep_for(thread_sleep_time);
|
|
|
|
if (++between_ping_counter <= no_of_loops_between_pings)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
between_ping_counter = 0;
|
|
|
|
if (auto c = conn.lock())
|
|
{
|
|
if (!c->ping())
|
|
{
|
|
OMERROR << "Pinging mysql failed. Stoping mysql pinging thread.";
|
|
why_stoped = StopReason::PingFailed;
|
|
break;
|
|
}
|
|
|
|
OMINFO << "Mysql ping successful." ;
|
|
}
|
|
else
|
|
{
|
|
OMERROR << "std::weak_ptr<MySqlConnector> conn expired!";
|
|
why_stoped = StopReason::PointerExpired;
|
|
break;
|
|
}
|
|
|
|
++counter;
|
|
}
|
|
|
|
OMINFO << "Exiting Mysql ping thread loop.";
|
|
}
|
|
|
|
}
|