From 27977b913da3321653e7d6cdc34d9f1c97609b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Fri, 6 May 2011 17:06:57 +0200 Subject: [PATCH] Bug #408: reconnect to MySQL server when connection fails --- include/MySqlDB.h | 23 ++++++++++++++++++----- src/nebula/Nebula.cc | 10 +--------- src/sql/MySqlDB.cc | 41 +++++++++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/include/MySqlDB.h b/include/MySqlDB.h index b733020de2..24fc5844db 100644 --- a/include/MySqlDB.h +++ b/include/MySqlDB.h @@ -43,11 +43,11 @@ class MySqlDB : public SqlDB { public: - MySqlDB(const string& server, - int port, - const string& user, - const string& password, - const char * database); + MySqlDB(const string& _server, + int _port, + const string& _user, + const string& _password, + const string& _database); ~MySqlDB(); @@ -81,6 +81,19 @@ private: */ MYSQL * db; + /** + * MySQL Connection parameters + */ + string server; + + int port; + + string user; + + string password; + + string database; + /** * Fine-grain mutex for DB access */ diff --git a/src/nebula/Nebula.cc b/src/nebula/Nebula.cc index a3cd371947..786370364e 100644 --- a/src/nebula/Nebula.cc +++ b/src/nebula/Nebula.cc @@ -208,7 +208,7 @@ void Nebula::start() { ostringstream oss; - db = new MySqlDB(server,port,user,passwd,0); + db = new MySqlDB(server,port,user,passwd,db_name); oss << "CREATE DATABASE IF NOT EXISTS " << db_name; rc = db->exec(oss); @@ -217,14 +217,6 @@ void Nebula::start() { throw runtime_error("Could not create database."); } - - oss.str(""); - oss << "USE " << db_name; - rc = db->exec(oss); - if ( rc != 0 ) - { - throw runtime_error("Could not open database."); - } } NebulaLog::log("ONE",Log::INFO,"Bootstraping OpenNebula database."); diff --git a/src/sql/MySqlDB.cc b/src/sql/MySqlDB.cc index 0a8895d5b6..1e9cebd815 100644 --- a/src/sql/MySqlDB.cc +++ b/src/sql/MySqlDB.cc @@ -15,6 +15,7 @@ /* -------------------------------------------------------------------------- */ #include "MySqlDB.h" +#include /********* * Doc: http://dev.mysql.com/doc/refman/5.5/en/c-api-function-overview.html @@ -23,12 +24,17 @@ /* -------------------------------------------------------------------------- */ MySqlDB::MySqlDB( - const string& server, - int port, - const string& user, - const string& password, - const char * database) + const string& _server, + int _port, + const string& _user, + const string& _password, + const string& _database) { + server = _server; + port = _port; + user = _user; + password = _password; + database = _database; // Initialize the MySQL library mysql_library_init(0, NULL, NULL); @@ -38,7 +44,7 @@ MySqlDB::MySqlDB( // Connect to the server if (!mysql_real_connect(db, server.c_str(), user.c_str(), - password.c_str(), database, port, NULL, 0)) + password.c_str(), database.c_str(), port, NULL, 0)) { throw runtime_error("Could not open database."); } @@ -81,8 +87,27 @@ int MySqlDB::exec(ostringstream& cmd, Callbackable* obj) const char * err_msg = mysql_error(db); int err_num = mysql_errno(db); - oss << "SQL command was: " << c_str; - oss << ", error " << err_num << " : " << err_msg; + if( err_num == CR_SERVER_GONE_ERROR || err_num == CR_SERVER_LOST ) + { + oss << "MySQL connection error " << err_num << " : " << err_msg; + + // Try to re-connect + if (mysql_real_connect(db, server.c_str(), user.c_str(), + password.c_str(), database.c_str(), + port, NULL, 0)) + { + oss << "... Reconnected."; + } + else + { + oss << "... Reconnection attempt failed."; + } + } + else + { + oss << "SQL command was: " << c_str; + oss << ", error " << err_num << " : " << err_msg; + } NebulaLog::log("ONE",Log::ERROR,oss);