From 053f9f5fa4ad9215dc7409d9f648d656c7cd3ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Mon, 10 May 2021 20:09:23 +0200 Subject: [PATCH] feat(Core/DB): reconnect seconds and attempts configurable (#5673) --- src/server/authserver/authserver.conf.dist | 12 ++++++++++ .../database/Database/DatabaseLoader.cpp | 22 ++++++------------- src/server/worldserver/worldserver.conf.dist | 12 ++++++++++ 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist index c93cd4103..18f7b6789 100644 --- a/src/server/authserver/authserver.conf.dist +++ b/src/server/authserver/authserver.conf.dist @@ -150,6 +150,18 @@ WrongPass.Logging = 0 LoginDatabaseInfo = "127.0.0.1;3306;acore;acore;acore_auth" +# +# Database.Reconnect.Seconds +# Database.Reconnect.Attempts +# +# Description: How many seconds between every reconnection attempt +# and how many attempts will be performed in total +# Default: 20 attempts every 15 seconds +# + +Database.Reconnect.Seconds = 15 +Database.Reconnect.Attempts = 20 + # # LoginDatabase.WorkerThreads # Description: The amount of worker threads spawned to handle asynchronous (delayed) MySQL diff --git a/src/server/database/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp index 300ad292f..e7cc640ed 100644 --- a/src/server/database/Database/DatabaseLoader.cpp +++ b/src/server/database/Database/DatabaseLoader.cpp @@ -39,26 +39,18 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::st // Try reconnect if (error == CR_CONNECTION_ERROR) { - // Possible improvement for future: make ATTEMPTS and SECONDS configurable values - uint32 const ATTEMPTS = 5; - Seconds durationSecs = 5s; - uint32 count = 1; + uint8 const ATTEMPTS = sConfigMgr->GetOption("Database.Reconnect.Attempts", 20); + Seconds RECONNECT_SECONDS = Seconds(sConfigMgr->GetOption("Database.Reconnect.Seconds", 15)); + uint8 count = 0; - auto sleepThread = [&]() - { - LOG_INFO("sql.driver", "> Retrying after %u seconds", static_cast(durationSecs.count())); - std::this_thread::sleep_for(durationSecs); - }; - - sleepThread(); - - do + while (count < ATTEMPTS) { + LOG_INFO("sql.driver", "> Retrying after %u seconds", static_cast(RECONNECT_SECONDS.count())); + std::this_thread::sleep_for(RECONNECT_SECONDS); error = pool.Open(); if (error == CR_CONNECTION_ERROR) { - sleepThread(); count++; } else @@ -66,7 +58,7 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::st break; } - } while (count < ATTEMPTS); + } } // If the error wasn't handled quit diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 512e5bf79..e4fbf57c9 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -95,6 +95,18 @@ LoginDatabaseInfo = "127.0.0.1;3306;acore;acore;acore_auth" WorldDatabaseInfo = "127.0.0.1;3306;acore;acore;acore_world" CharacterDatabaseInfo = "127.0.0.1;3306;acore;acore;acore_characters" +# +# Database.Reconnect.Seconds +# Database.Reconnect.Attempts +# +# Description: How many seconds between every reconnection attempt +# and how many attempts will be performed in total +# Default: 20 attempts every 15 seconds +# + +Database.Reconnect.Seconds = 15 +Database.Reconnect.Attempts = 20 + # # LoginDatabase.WorkerThreads # WorldDatabase.WorkerThreads