]> granicus.if.org Git - icinga2/commitdiff
ido_mysql: Fix deadlock.
authorGunnar Beutner <gunnar.beutner@netways.de>
Fri, 19 Jul 2013 08:34:46 +0000 (10:34 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Fri, 19 Jul 2013 08:34:46 +0000 (10:34 +0200)
components/ido_mysql/mysqldbconnection.cpp

index e4e71a092687e0ac164e7f11747df52dc28bca13..24037b554e1588ce24f3fe364eab1fdcdd8d4550 100644 (file)
@@ -74,77 +74,79 @@ void MysqlDbConnection::TxTimerHandler(void)
 
 void MysqlDbConnection::ReconnectTimerHandler(void)
 {
-       boost::mutex::scoped_lock lock(m_ConnectionMutex);
+       {
+               boost::mutex::scoped_lock lock(m_ConnectionMutex);
 
-       if (m_Connected) {
-               /* Check if we're really still connected */
-               if (mysql_ping(&m_Connection) == 0)
-                       return;
+               if (m_Connected) {
+                       /* Check if we're really still connected */
+                       if (mysql_ping(&m_Connection) == 0)
+                               return;
 
-               mysql_close(&m_Connection);
-               m_Connected = false;
-       }
+                       mysql_close(&m_Connection);
+                       m_Connected = false;
+               }
 
-       String ihost, iuser, ipasswd, idb;
-       const char *host, *user , *passwd, *db;
-       long port;
+               String ihost, iuser, ipasswd, idb;
+               const char *host, *user , *passwd, *db;
+               long port;
 
-       ihost = m_Host;
-       iuser = m_User;
-       ipasswd = m_Password;
-       idb = m_Database;
+               ihost = m_Host;
+               iuser = m_User;
+               ipasswd = m_Password;
+               idb = m_Database;
 
-       host = (!ihost.IsEmpty()) ? ihost.CStr() : NULL;
-       port = m_Port;
-       user = (!iuser.IsEmpty()) ? iuser.CStr() : NULL;
-       passwd = (!ipasswd.IsEmpty()) ? ipasswd.CStr() : NULL;
-       db = (!idb.IsEmpty()) ? idb.CStr() : NULL;
+               host = (!ihost.IsEmpty()) ? ihost.CStr() : NULL;
+               port = m_Port;
+               user = (!iuser.IsEmpty()) ? iuser.CStr() : NULL;
+               passwd = (!ipasswd.IsEmpty()) ? ipasswd.CStr() : NULL;
+               db = (!idb.IsEmpty()) ? idb.CStr() : NULL;
 
-       if (!mysql_init(&m_Connection))
-               BOOST_THROW_EXCEPTION(std::bad_alloc());
+               if (!mysql_init(&m_Connection))
+                       BOOST_THROW_EXCEPTION(std::bad_alloc());
 
-       if (!mysql_real_connect(&m_Connection, host, user, passwd, db, port, NULL, 0))
-               BOOST_THROW_EXCEPTION(std::runtime_error(mysql_error(&m_Connection)));
+               if (!mysql_real_connect(&m_Connection, host, user, passwd, db, port, NULL, 0))
+                       BOOST_THROW_EXCEPTION(std::runtime_error(mysql_error(&m_Connection)));
 
-       m_Connected = true;
+               m_Connected = true;
 
-       String instanceName = "default";
+               String instanceName = "default";
 
-       if (!m_InstanceName.IsEmpty())
-               instanceName = m_InstanceName;
+               if (!m_InstanceName.IsEmpty())
+                       instanceName = m_InstanceName;
 
-       Array::Ptr rows = Query("SELECT instance_id FROM icinga_instances WHERE instance_name = '" + Escape(instanceName) + "'");
+               Array::Ptr rows = Query("SELECT instance_id FROM icinga_instances WHERE instance_name = '" + Escape(instanceName) + "'");
 
-       if (rows->GetLength() == 0) {
-               Query("INSERT INTO icinga_instances (instance_name, instance_description) VALUES ('" + Escape(instanceName) + "', '" + m_InstanceDescription + "')");
-               m_InstanceID = GetInsertID();
-       } else {
-               Dictionary::Ptr row = rows->Get(0);
-               m_InstanceID = DbReference(row->Get("instance_id"));
-       }
+               if (rows->GetLength() == 0) {
+                       Query("INSERT INTO icinga_instances (instance_name, instance_description) VALUES ('" + Escape(instanceName) + "', '" + m_InstanceDescription + "')");
+                       m_InstanceID = GetInsertID();
+               } else {
+                       Dictionary::Ptr row = rows->Get(0);
+                       m_InstanceID = DbReference(row->Get("instance_id"));
+               }
 
-       std::ostringstream msgbuf;
-       msgbuf << "MySQL IDO instance id: " << static_cast<long>(m_InstanceID);
-       Log(LogInformation, "ido_mysql", msgbuf.str());
+               std::ostringstream msgbuf;
+               msgbuf << "MySQL IDO instance id: " << static_cast<long>(m_InstanceID);
+               Log(LogInformation, "ido_mysql", msgbuf.str());
 
-       Query("UPDATE icinga_objects SET is_active = 0");
+               Query("UPDATE icinga_objects SET is_active = 0");
 
-       std::ostringstream qbuf;
-       qbuf << "SELECT object_id, objecttype_id, name1, name2 FROM icinga_objects WHERE instance_id = " << static_cast<long>(m_InstanceID);
-       rows = Query(qbuf.str());
+               std::ostringstream qbuf;
+               qbuf << "SELECT object_id, objecttype_id, name1, name2 FROM icinga_objects WHERE instance_id = " << static_cast<long>(m_InstanceID);
+               rows = Query(qbuf.str());
 
-       ObjectLock olock(rows);
-       BOOST_FOREACH(const Dictionary::Ptr& row, rows) {
-               DbType::Ptr dbtype = DbType::GetByID(row->Get("objecttype_id"));
+               ObjectLock olock(rows);
+               BOOST_FOREACH(const Dictionary::Ptr& row, rows) {
+                       DbType::Ptr dbtype = DbType::GetByID(row->Get("objecttype_id"));
 
-               if (!dbtype)
-                       continue;
+                       if (!dbtype)
+                               continue;
 
-               DbObject::Ptr dbobj = dbtype->GetOrCreateObjectByName(row->Get("name1"), row->Get("name2"));
-               SetReference(dbobj, DbReference(row->Get("object_id")));
-       }
+                       DbObject::Ptr dbobj = dbtype->GetOrCreateObjectByName(row->Get("name1"), row->Get("name2"));
+                       SetReference(dbobj, DbReference(row->Get("object_id")));
+               }
 
-       Query("BEGIN");
+               Query("BEGIN");
+       }
 
        UpdateAllObjects();
 }