From 96dc110f4a353871ac74c82ff4b1bcc4c34156f3 Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Sat, 24 Jul 2021 14:50:30 +0200 Subject: Core/DBLayer: Add QueueSize() method (#26733) * Core/DBLayer: Add QueueSize() method Add QueueSize() method to database objects (Login, Character and World) that returns how many tasks are queued. Include the queue size of the 3 databases in ".server debug" command * Make the code less threadsafe * Send data to InfluxDB * Update grafana dashboard --- src/common/Threading/ProducerConsumerQueue.h | 5 +++++ src/server/database/Database/DatabaseWorkerPool.cpp | 6 ++++++ src/server/database/Database/DatabaseWorkerPool.h | 2 ++ src/server/scripts/Commands/cs_server.cpp | 4 ++++ src/server/worldserver/Main.cpp | 3 +++ 5 files changed, 20 insertions(+) (limited to 'src') diff --git a/src/common/Threading/ProducerConsumerQueue.h b/src/common/Threading/ProducerConsumerQueue.h index 1341bd26747..778f434e9de 100644 --- a/src/common/Threading/ProducerConsumerQueue.h +++ b/src/common/Threading/ProducerConsumerQueue.h @@ -52,6 +52,11 @@ public: return _queue.empty(); } + size_t Size() const + { + return _queue.size(); + } + bool Pop(T& value) { std::lock_guard lock(_queueLock); diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp index c09f7c3e4b6..e5f70c5a0e0 100644 --- a/src/server/database/Database/DatabaseWorkerPool.cpp +++ b/src/server/database/Database/DatabaseWorkerPool.cpp @@ -413,6 +413,12 @@ void DatabaseWorkerPool::Enqueue(SQLOperation* op) _queue->Push(op); } +template +size_t DatabaseWorkerPool::QueueSize() const +{ + return _queue->Size(); +} + template T* DatabaseWorkerPool::GetFreeConnection() { diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index 9852ded374e..66d5a55dffa 100644 --- a/src/server/database/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -213,6 +213,8 @@ class DatabaseWorkerPool #endif } + size_t QueueSize() const; + private: uint32 OpenConnections(InternalIndex type, uint8 numConnections); diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index a0c1e3da41b..c32662b992a 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -251,6 +251,10 @@ public: handler->PSendSysMessage("Using %s DBC Locale as default. All available DBC locales: %s", localeNames[defaultLocale], availableLocales.c_str()); handler->PSendSysMessage("Using World DB: %s", sWorld->GetDBVersion()); + + handler->PSendSysMessage("LoginDatabase queue size: %zu", LoginDatabase.QueueSize()); + handler->PSendSysMessage("CharacterDatabase queue size: %zu", CharacterDatabase.QueueSize()); + handler->PSendSysMessage("WorldDatabase queue size: %zu", WorldDatabase.QueueSize()); return true; } diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 241c9ee462b..f72628f9be0 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -231,6 +231,9 @@ extern int main(int argc, char** argv) sMetric->Initialize(realm.Name, *ioContext, []() { TC_METRIC_VALUE("online_players", sWorld->GetPlayerCount()); + TC_METRIC_VALUE("db_queue_login", LoginDatabase.QueueSize()); + TC_METRIC_VALUE("db_queue_character", CharacterDatabase.QueueSize()); + TC_METRIC_VALUE("db_queue_world", WorldDatabase.QueueSize()); }); TC_METRIC_EVENT("events", "Worldserver started", ""); -- cgit v1.2.3