diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-12-21 00:04:14 +0100 |
---|---|---|
committer | funjoker <funjoker109@gmail.com> | 2023-12-21 00:13:20 +0100 |
commit | e5bf7ab086b51601985f2bbcafa62beee23be166 (patch) | |
tree | b853f734642f503adf4d94bf460c2aa6713c202a | |
parent | eff969b2c6d529beb6b27aeabf765e166cb67e1b (diff) |
Core/Database: Fixed worldserver hanging if opening a connection to database failed
(cherry picked from commit b130995814ef5bc7fc445d271d4f9521930755d3)
-rw-r--r-- | src/server/database/Database/DatabaseWorkerPool.cpp | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp index 9cc4f755d9d..8ae38d7e226 100644 --- a/src/server/database/Database/DatabaseWorkerPool.cpp +++ b/src/server/database/Database/DatabaseWorkerPool.cpp @@ -149,14 +149,17 @@ uint32 DatabaseWorkerPool<T>::Open() error = OpenConnections(IDX_SYNCH, _synch_threads); - if (!error) - { - TC_LOG_INFO("sql.driver", "DatabasePool '{}' opened successfully. " - "{} total connections running.", GetDatabaseName(), - (_connections[IDX_SYNCH].size() + _connections[IDX_ASYNC].size())); - } + if (error) + return error; + + for (std::unique_ptr<T> const& connection : _connections[IDX_ASYNC]) + connection->StartWorkerThread(_ioContext.get()); + + TC_LOG_INFO("sql.driver", "DatabasePool '{}' opened successfully. " + "{} total connections running.", GetDatabaseName(), + (_connections[IDX_SYNCH].size() + _connections[IDX_ASYNC].size())); - return error; + return 0; } template <class T> @@ -428,21 +431,9 @@ uint32 DatabaseWorkerPool<T>::OpenConnections(InternalIndex type, uint8 numConne for (uint8 i = 0; i < numConnections; ++i) { // Create the connection - auto connection = [&] { - switch (type) - { - case IDX_ASYNC: - { - auto c = std::make_unique<T>(*_connectionInfo, CONNECTION_ASYNC); - c->StartWorkerThread(_ioContext.get()); - return c; - } - case IDX_SYNCH: - return std::make_unique<T>(*_connectionInfo, CONNECTION_SYNCH); - default: - ABORT(); - } - }(); + constexpr std::array<ConnectionFlags, IDX_SIZE> flags = { { CONNECTION_ASYNC, CONNECTION_SYNCH } }; + + std::unique_ptr<T> connection = std::make_unique<T>(*_connectionInfo, flags[type]); if (uint32 error = connection->Open()) { |