mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 09:02:00 +00:00
81d9d3237f
Remove stalled unrecoverable connections from myqsl connections pool
99 lines
2.8 KiB
C++
99 lines
2.8 KiB
C++
#include <mysqlxx/mysqlxx.h>
|
|
|
|
#include <chrono>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <thread>
|
|
|
|
|
|
namespace
|
|
{
|
|
mysqlxx::Pool::Entry getWithFailover(mysqlxx::Pool & connections_pool)
|
|
{
|
|
using namespace std::chrono;
|
|
|
|
constexpr size_t max_tries = 3;
|
|
|
|
mysqlxx::Pool::Entry worker_connection;
|
|
|
|
for (size_t try_no = 1; try_no <= max_tries; ++try_no)
|
|
{
|
|
try
|
|
{
|
|
worker_connection = connections_pool.tryGet();
|
|
|
|
if (!worker_connection.isNull())
|
|
{
|
|
return worker_connection;
|
|
}
|
|
}
|
|
catch (const Poco::Exception & e)
|
|
{
|
|
if (e.displayText().find("mysqlxx::Pool is full") != std::string::npos)
|
|
{
|
|
std::cerr << e.displayText() << std::endl;
|
|
}
|
|
|
|
std::cerr << "Connection to " << connections_pool.getDescription() << " failed: " << e.displayText() << std::endl;
|
|
}
|
|
|
|
std::clog << "Connection to all replicas failed " << try_no << " times" << std::endl;
|
|
std::this_thread::sleep_for(1s);
|
|
}
|
|
|
|
std::stringstream message;
|
|
message << "Connections to all replicas failed: " << connections_pool.getDescription();
|
|
|
|
throw Poco::Exception(message.str());
|
|
}
|
|
}
|
|
|
|
int main(int, char **)
|
|
{
|
|
using namespace std::chrono;
|
|
|
|
const char * remote_mysql = "localhost";
|
|
const std::string test_query = "SHOW DATABASES";
|
|
|
|
mysqlxx::Pool mysql_conn_pool("", remote_mysql, "default", "10203040", 3306);
|
|
|
|
size_t iteration = 0;
|
|
while (++iteration)
|
|
{
|
|
std::clog << "Iteration: " << iteration << std::endl;
|
|
try
|
|
{
|
|
std::clog << "Acquiring DB connection ...";
|
|
mysqlxx::Pool::Entry worker = getWithFailover(mysql_conn_pool);
|
|
std::clog << "ok" << std::endl;
|
|
|
|
std::clog << "Preparing query (5s sleep) ...";
|
|
std::this_thread::sleep_for(5s);
|
|
mysqlxx::Query query = worker->query();
|
|
query << test_query;
|
|
std::clog << "ok" << std::endl;
|
|
|
|
std::clog << "Querying result (5s sleep) ...";
|
|
std::this_thread::sleep_for(5s);
|
|
mysqlxx::UseQueryResult result = query.use();
|
|
std::clog << "ok" << std::endl;
|
|
|
|
std::clog << "Fetching result data (5s sleep) ...";
|
|
std::this_thread::sleep_for(5s);
|
|
size_t rows_count = 0;
|
|
while (result.fetch())
|
|
++rows_count;
|
|
std::clog << "ok" << std::endl;
|
|
|
|
std::clog << "Read " << rows_count << " rows." << std::endl;
|
|
}
|
|
catch (const Poco::Exception & e)
|
|
{
|
|
std::cerr << "Iteration FAILED:\n" << e.displayText() << std::endl;
|
|
}
|
|
|
|
std::clog << "====================" << std::endl;
|
|
std::this_thread::sleep_for(3s);
|
|
}
|
|
}
|