From 8f82badc23947dc3350fb43474a4ad20a81cb703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Czern=C3=BD?= Date: Thu, 8 Oct 2020 16:22:10 +0200 Subject: [PATCH] B #5094: Fix DB reconnect (#304) * B #5094: Improve MySQL reconnect * B #5094: PostgreSQL reconnect --- src/sql/MySqlDB.cc | 3 +++ src/sql/PostgreSqlDB.cc | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/sql/MySqlDB.cc b/src/sql/MySqlDB.cc index a1100f4c09..02216342f3 100644 --- a/src/sql/MySqlDB.cc +++ b/src/sql/MySqlDB.cc @@ -202,6 +202,9 @@ MySqlDB::MySqlDB(const string& s, int p, const string& u, const string& _p, { connections[i] = mysql_init(NULL); + bool reconnect = true; + mysql_options(connections[i], MYSQL_OPT_RECONNECT, &reconnect); + rc = mysql_real_connect(connections[i], server.c_str(), user.c_str(), password.c_str(), 0, port, NULL, 0); diff --git a/src/sql/PostgreSqlDB.cc b/src/sql/PostgreSqlDB.cc index c826496d25..b9ea42eaa1 100644 --- a/src/sql/PostgreSqlDB.cc +++ b/src/sql/PostgreSqlDB.cc @@ -163,6 +163,29 @@ int PostgreSqlDB::exec_ext(std::ostringstream& cmd, Callbackable *obj, bool quie PGresult* res = PQexec(conn, c_str); + if ( PQstatus(conn) == CONNECTION_BAD ) + { + PQreset(conn); + + if ( PQstatus(conn) == CONNECTION_BAD ) + { + NebulaLog::error("ONE", "Lost connection to DB, unable to reconnect"); + + PQclear(res); + free_db_connection(conn); + + return SqlDB::CONNECTION; + } + else + { + NebulaLog::info("ONE", "Succesfully reconnected to DB"); + + // Re-execute the query + PQclear(res); + res = PQexec(conn, c_str); + } + } + if ( PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK ) {