aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-12-21 00:04:14 +0100
committerfunjoker <funjoker109@gmail.com>2023-12-21 00:13:20 +0100
commite5bf7ab086b51601985f2bbcafa62beee23be166 (patch)
treeb853f734642f503adf4d94bf460c2aa6713c202a
parenteff969b2c6d529beb6b27aeabf765e166cb67e1b (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.cpp35
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())
{