From a808ad54633fde386ec6cd7e372d35bcb4cba63a Mon Sep 17 00:00:00 2001 From: Zwelf Date: Fri, 21 Aug 2020 10:37:52 +0200 Subject: [PATCH 1/2] Enhance SQL error reporting --- .../server/databases/connection_pool.cpp | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/engine/server/databases/connection_pool.cpp b/src/engine/server/databases/connection_pool.cpp index b48f51181..f7a2b8fb4 100644 --- a/src/engine/server/databases/connection_pool.cpp +++ b/src/engine/server/databases/connection_pool.cpp @@ -153,6 +153,7 @@ void CDbConnectionPool::Worker() { if(ExecSqlFunc(m_aapDbConnections[Mode::READ][i].get(), pThreadData.get(), false)) { + dbg_msg("sql", "%s done on read database %d", pThreadData->m_pName, i); Success = true; break; } @@ -164,6 +165,7 @@ void CDbConnectionPool::Worker() { if(ExecSqlFunc(m_aapDbConnections[Mode::WRITE][i].get(), pThreadData.get(), false)) { + dbg_msg("sql", "%s done on write database %d", pThreadData->m_pName, i); Success = true; break; } @@ -174,6 +176,7 @@ void CDbConnectionPool::Worker() { if(ExecSqlFunc(m_aapDbConnections[Mode::WRITE_BACKUP][i].get(), pThreadData.get(), true)) { + dbg_msg("sql", "%s done on write backup database %d", pThreadData->m_pName, i); Success = true; break; } @@ -181,8 +184,8 @@ void CDbConnectionPool::Worker() } } break; } - if(Success) - dbg_msg("sql", "%s done", pThreadData->m_pName); + if(!Success) + dbg_msg("sql", "%s failed on all databases", pThreadData->m_pName); } } @@ -208,18 +211,35 @@ bool CDbConnectionPool::ExecSqlFunc(IDbConnection *pConnection, CSqlExecData *pD #if defined(CONF_SQL) catch (sql::SQLException &e) { - dbg_msg("sql", "MySQL Error: %s", e.what()); + dbg_msg("sql", "%s MySQL Error: %s", pData->m_pName, e.what()); } #endif catch (std::runtime_error &e) { - dbg_msg("sql", "SQLite Error: %s", e.what()); + dbg_msg("sql", "%s SQLite Error: %s", pData->m_pName, e.what()); } catch (...) { - dbg_msg("sql", "Unexpected exception caught"); + dbg_msg("sql", "%s Unexpected exception caught", pData->m_pName); + } + try + { + pConnection->Unlock(); + } +#if defined(CONF_SQL) + catch (sql::SQLException &e) + { + dbg_msg("sql", "%s MySQL Error during unlock: %s", pData->m_pName, e.what()); + } +#endif + catch (std::runtime_error &e) + { + dbg_msg("sql", "%s SQLite Error during unlock: %s", pData->m_pName, e.what()); + } + catch (...) + { + dbg_msg("sql", "%s Unexpected exception caught during unlock", pData->m_pName); } - pConnection->Unlock(); pConnection->Disconnect(); if(!Success) dbg_msg("sql", "%s failed", pData->m_pName); From 3a30dfbd8495a1405df6e45f3b94eb3db1859135 Mon Sep 17 00:00:00 2001 From: Zwelf Date: Fri, 21 Aug 2020 19:46:44 +0200 Subject: [PATCH 2/2] Keep connecting to last reachable MySQL server --- src/engine/server/databases/connection_pool.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/engine/server/databases/connection_pool.cpp b/src/engine/server/databases/connection_pool.cpp index f7a2b8fb4..538bdb5c2 100644 --- a/src/engine/server/databases/connection_pool.cpp +++ b/src/engine/server/databases/connection_pool.cpp @@ -133,6 +133,9 @@ void CDbConnectionPool::Worker(void *pUser) void CDbConnectionPool::Worker() { + // remember last working server and try to connect to it first + int ReadServer = 0; + int WriteServer = 0; while(1) { m_NumElem.wait(); @@ -151,9 +154,11 @@ void CDbConnectionPool::Worker() { for(int i = 0; i < (int)m_aapDbConnections[Mode::READ].size(); i++) { - if(ExecSqlFunc(m_aapDbConnections[Mode::READ][i].get(), pThreadData.get(), false)) + int CurServer = (ReadServer + i) % (int)m_aapDbConnections[Mode::READ].size(); + if(ExecSqlFunc(m_aapDbConnections[Mode::READ][CurServer].get(), pThreadData.get(), false)) { - dbg_msg("sql", "%s done on read database %d", pThreadData->m_pName, i); + ReadServer = CurServer; + dbg_msg("sql", "%s done on read database %d", pThreadData->m_pName, CurServer); Success = true; break; } @@ -163,9 +168,11 @@ void CDbConnectionPool::Worker() { for(int i = 0; i < (int)m_aapDbConnections[Mode::WRITE].size(); i++) { + int CurServer = (WriteServer + i) % (int)m_aapDbConnections[Mode::READ].size(); if(ExecSqlFunc(m_aapDbConnections[Mode::WRITE][i].get(), pThreadData.get(), false)) { - dbg_msg("sql", "%s done on write database %d", pThreadData->m_pName, i); + WriteServer = CurServer; + dbg_msg("sql", "%s done on write database %d", pThreadData->m_pName, CurServer); Success = true; break; }