aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/authserver/Main.cpp3
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp12
-rw-r--r--src/server/game/World/World.cpp5
-rw-r--r--src/server/game/World/World.h3
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h44
-rw-r--r--src/server/worldserver/CommandLine/CliRunnable.cpp34
-rw-r--r--src/server/worldserver/Master.cpp33
-rw-r--r--src/server/worldserver/WorldThread/WorldRunnable.cpp12
8 files changed, 62 insertions, 84 deletions
diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp
index 1e140e4e1c0..dfc04f58512 100644
--- a/src/server/authserver/Main.cpp
+++ b/src/server/authserver/Main.cpp
@@ -346,7 +346,8 @@ bool StartDB()
num_threads = 1;
}
- if (!LoginDatabase.Open(dbstring.c_str(), num_threads))
+ //- Authserver has singlethreaded synchronous DB access, hence MYSQL_BUNDLE_ALL
+ if (!LoginDatabase.Open(dbstring.c_str(), num_threads, MYSQL_BUNDLE_ALL))
{
sLog.outError("Cannot connect to database");
return false;
diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp
index 728c55b4e8f..7422170fa59 100644
--- a/src/server/game/Server/WorldSocketMgr.cpp
+++ b/src/server/game/Server/WorldSocketMgr.cpp
@@ -159,18 +159,12 @@ class ReactorRunnable : protected ACE_Task_Base
sLog.outStaticDebug ("Network Thread Starting");
bool needInit = true;
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_LOGINDB) & MYSQL_BUNDLE_RA))
+ if (!(LoginDatabase.GetBundleMask() & MYSQL_BUNDLE_RAR))
{
LoginDatabase.Init_MySQL_Connection();
needInit = false;
}
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_CHARDB) & MYSQL_BUNDLE_RA))
- {
- CharacterDatabase.Init_MySQL_Connection();
- needInit = false;
- }
-
if (needInit)
MySQL::Thread_Init();
@@ -210,10 +204,8 @@ class ReactorRunnable : protected ACE_Task_Base
}
///- Free MySQL thread resources and deallocate lingering connections
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_LOGINDB) & MYSQL_BUNDLE_RA))
+ if (!(LoginDatabase.GetBundleMask() & MYSQL_BUNDLE_RAR))
LoginDatabase.End_MySQL_Connection();
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_CHARDB) & MYSQL_BUNDLE_RA))
- CharacterDatabase.End_MySQL_Connection();
if (needInit)
MySQL::Thread_End();
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 8306cd3403d..0185aabd792 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1212,11 +1212,6 @@ void World::LoadConfigSettings(bool reload)
// Dungeon finder
m_bool_configs[CONFIG_DUNGEON_FINDER_ENABLE] = sConfig.GetBoolDefault("DungeonFinder.Enable", false);
- // MySQL thread bundling config for other runnable tasks
- m_int_configs[CONFIG_MYSQL_BUNDLE_LOGINDB] = sConfig.GetIntDefault("LoginDatabase.ThreadBundleMask", MYSQL_BUNDLE_ALL);
- m_int_configs[CONFIG_MYSQL_BUNDLE_CHARDB] = sConfig.GetIntDefault("CharacterDatabase.ThreadBundleMask", MYSQL_BUNDLE_ALL);
- m_int_configs[CONFIG_MYSQL_BUNDLE_WORLDDB] = sConfig.GetIntDefault("WorldDatabase.ThreadBundleMask", MYSQL_BUNDLE_ALL);
-
sScriptMgr.OnConfigLoad(reload);
}
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index cb54ee406be..b7bb6affdd4 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -300,9 +300,6 @@ enum WorldIntConfigs
CONFIG_CHARDELETE_KEEP_DAYS,
CONFIG_CHARDELETE_METHOD,
CONFIG_CHARDELETE_MIN_LEVEL,
- CONFIG_MYSQL_BUNDLE_LOGINDB,
- CONFIG_MYSQL_BUNDLE_CHARDB,
- CONFIG_MYSQL_BUNDLE_WORLDDB,
INT_CONFIG_VALUE_COUNT
};
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index fb154e3d8e0..d120314d230 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -33,11 +33,11 @@
enum MySQLThreadBundle
{
MYSQL_BUNDLE_NONE = 0x00, //- Each task will run their own MySQL connection
- MYSQL_BUNDLE_CLI = 0x01, //- Commandline interface thread
+ MYSQL_BUNDLE_UNUSED = 0x01, //- Temp unused
MYSQL_BUNDLE_RA = 0x02, //- Remote admin thread
MYSQL_BUNDLE_RAR = 0x04, //- Reactor runnable thread
MYSQL_BUNDLE_WORLD = 0x08, //- WorldRunnable
- MYSQL_BUNDLE_ALL = MYSQL_BUNDLE_CLI | MYSQL_BUNDLE_RA | MYSQL_BUNDLE_RAR | MYSQL_BUNDLE_WORLD,
+ MYSQL_BUNDLE_ALL = MYSQL_BUNDLE_RA | MYSQL_BUNDLE_RAR | MYSQL_BUNDLE_WORLD,
};
template <class T>
@@ -63,13 +63,18 @@ class DatabaseWorkerPool
mysql_library_end();
}
- bool Open(const std::string& infoString, uint8 num_threads)
+ bool Open(const std::string& infoString, uint8 num_threads, MySQLThreadBundle mask)
{
- sLog.outSQLDriver("Creating bundled/master MySQL connection.");
- m_bundle_conn = new T();
- m_bundle_conn->Open(infoString);
- ++m_connections;
-
+ //- Only created bundled connection if configured
+ m_bundle_conn = NULL;
+ if (mask != MYSQL_BUNDLE_NONE)
+ {
+ sLog.outSQLDriver("Creating bundled/master MySQL connection.");
+ m_bundle_conn = new T();
+ m_bundle_conn->Open(infoString);
+ ++m_connections;
+ }
+
m_async_connections.resize(num_threads);
/// Open the Async pool
@@ -97,17 +102,15 @@ class DatabaseWorkerPool
--m_connections;
}
- delete m_bundle_conn;
- m_bundle_conn = NULL;
- --m_connections;
- sLog.outSQLDriver("Closed bundled connection.");
-
- //- MySQL::Thread_End() should be called manually from the aborting calling threads
- sLog.outSQLDriver("Waiting for %u synchroneous database threads to exit.", (uint32)m_connections.value());
- while (!m_sync_connections.empty())
+ if (m_bundleMask != MYSQL_BUNDLE_NONE)
{
+ delete m_bundle_conn;
+ m_bundle_conn = NULL;
+ --m_connections;
+ sLog.outSQLDriver("Closed bundled connection.");
}
- sLog.outSQLDriver("Synchroneous database threads exited succesfuly.");
+
+ //- MySQL::Thread_End() should be called manually from the aborting calling threads
}
void Init_MySQL_Connection()
@@ -282,14 +285,16 @@ class DatabaseWorkerPool
delete[] buf;
}
+ MySQLThreadBundle GetBundleMask() { return m_bundleMask; }
+
+ private:
unsigned long escape_string(char *to, const char *from, unsigned long length)
{
if (!to || !from || !length)
return 0;
return (mysql_real_escape_string(GetConnection()->GetHandle(), to, from, length));
}
-
- private:
+
void Enqueue(SQLOperation* op)
{
m_queue->enqueue(op);
@@ -320,6 +325,7 @@ class DatabaseWorkerPool
T* m_bundle_conn; //! Bundled connection (see Database.ThreadBundleMask config)
AtomicUInt m_connections; //! Counter of MySQL connections;
std::string m_infoString; //! Infostring that is passed on to child connections.
+ MySQLThreadBundle m_bundleMask; //! Our configured bundle mask (see enum)
};
#endif
diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp
index cd93964b709..d5aa0364eaf 100644
--- a/src/server/worldserver/CommandLine/CliRunnable.cpp
+++ b/src/server/worldserver/CommandLine/CliRunnable.cpp
@@ -698,29 +698,6 @@ int kb_hit_return()
/// %Thread start
void CliRunnable::run()
{
- ///- Init MySQL threads or connections
- bool needInit = true;
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_WORLDDB) & MYSQL_BUNDLE_RA))
- {
- WorldDatabase.Init_MySQL_Connection();
- needInit = false;
- }
-
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_LOGINDB) & MYSQL_BUNDLE_RA))
- {
- LoginDatabase.Init_MySQL_Connection();
- needInit = false;
- }
-
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_CHARDB) & MYSQL_BUNDLE_RA))
- {
- CharacterDatabase.Init_MySQL_Connection();
- needInit = false;
- }
-
- if (needInit)
- MySQL::Thread_Init();
-
///- Display the list of available CLI functions then beep
//sLog.outString("");
#if PLATFORM != WINDOWS
@@ -786,15 +763,4 @@ void CliRunnable::run()
}
}
-
- ///- Free MySQL thread resources and deallocate lingering connections
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_WORLDDB) & MYSQL_BUNDLE_RA))
- WorldDatabase.End_MySQL_Connection();
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_LOGINDB) & MYSQL_BUNDLE_RA))
- LoginDatabase.End_MySQL_Connection();
-
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_CHARDB) & MYSQL_BUNDLE_RA))
- CharacterDatabase.End_MySQL_Connection();
- if (needInit)
- MySQL::Thread_End();
}
diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp
index 6f964c144f2..28e0a93fd21 100644
--- a/src/server/worldserver/Master.cpp
+++ b/src/server/worldserver/Master.cpp
@@ -33,6 +33,7 @@
#include "WorldSocketMgr.h"
#include "Configuration/Config.h"
#include "Database/DatabaseEnv.h"
+#include "Database/DatabaseWorkerPool.h"
#include "CliRunnable.h"
#include "Log.h"
@@ -134,9 +135,7 @@ public:
{
loopCounter = 0;
sLog.outDetail ("Ping MySQL to keep connection alive");
- WorldDatabase.Query ("SELECT 1 FROM command LIMIT 1");
LoginDatabase.Query ("SELECT 1 FROM realmlist LIMIT 1");
- CharacterDatabase.Query ("SELECT 1 FROM bugreport LIMIT 1");
}
}
@@ -163,6 +162,15 @@ public:
sLog.outString ("Starting Remote access listner on port %d on %s", raport, stringip.c_str ());
}
+
+ bool needInit = true;
+ if ((LoginDatabase.GetBundleMask() & MYSQL_BUNDLE_RA))
+ {
+ LoginDatabase.Init_MySQL_Connection();
+ needInit = false;
+ }
+ if (needInit)
+ MySQL::Thread_Init();
}
// Socket Selet time is in microseconds , not miliseconds!!
@@ -176,13 +184,18 @@ public:
h.Select (0, socketSelecttime);
checkping ();
}
+
+ if (!needInit)
+ LoginDatabase.End_MySQL_Connection();
+ else
+ MySQL::Thread_End();
}
else
{
while (!World::IsStopped())
{
ACE_Based::Thread::Sleep(static_cast<unsigned long> (socketSelecttime / 1000));
- checkping ();
+ // checkping (); -- What?
}
}
}
@@ -440,6 +453,7 @@ bool Master::_StartDB()
sLog.SetLogDB(false);
std::string dbstring;
uint8 num_threads;
+ int32 mask;
dbstring = sConfig.GetStringDefault("WorldDatabaseInfo", "");
if (dbstring.empty())
@@ -456,8 +470,10 @@ bool Master::_StartDB()
return false;
}
+ mask = sConfig.GetIntDefault("WorldDatabase.ThreadBundleMask", MYSQL_BUNDLE_ALL);
+
///- Initialise the world database
- if (!WorldDatabase.Open(dbstring, num_threads))
+ if (!WorldDatabase.Open(dbstring, num_threads, MySQLThreadBundle(mask)))
{
sLog.outError("Cannot connect to world database %s", dbstring.c_str());
return false;
@@ -478,12 +494,15 @@ bool Master::_StartDB()
return false;
}
+ mask = sConfig.GetIntDefault("CharacterDatabase.ThreadBundleMask", MYSQL_BUNDLE_ALL);
+
///- Initialise the Character database
- if (!CharacterDatabase.Open(dbstring, num_threads))
+ if (!CharacterDatabase.Open(dbstring, num_threads, MySQLThreadBundle(mask)))
{
sLog.outError("Cannot connect to Character database %s", dbstring.c_str());
return false;
}
+
///- Get login database info from configuration file
dbstring = sConfig.GetStringDefault("LoginDatabaseInfo", "");
if (dbstring.empty())
@@ -500,8 +519,10 @@ bool Master::_StartDB()
return false;
}
+ mask = sConfig.GetIntDefault("LoginDatabase.ThreadBundleMask", MYSQL_BUNDLE_ALL);
+
///- Initialise the login database
- if (!LoginDatabase.Open(dbstring, num_threads))
+ if (!LoginDatabase.Open(dbstring, num_threads, MySQLThreadBundle(mask)))
{
sLog.outError("Cannot connect to login database %s", dbstring.c_str());
return false;
diff --git a/src/server/worldserver/WorldThread/WorldRunnable.cpp b/src/server/worldserver/WorldThread/WorldRunnable.cpp
index 257c8e69e18..6dfe0d809a5 100644
--- a/src/server/worldserver/WorldThread/WorldRunnable.cpp
+++ b/src/server/worldserver/WorldThread/WorldRunnable.cpp
@@ -45,18 +45,18 @@ void WorldRunnable::run()
{
///- Init MySQL threads or connections
bool needInit = true;
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_WORLDDB) & MYSQL_BUNDLE_RA))
+ if (!(WorldDatabase.GetBundleMask() & MYSQL_BUNDLE_WORLD))
{
WorldDatabase.Init_MySQL_Connection();
needInit = false;
}
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_LOGINDB) & MYSQL_BUNDLE_RA))
+ if (!(LoginDatabase.GetBundleMask() & MYSQL_BUNDLE_WORLD))
{
LoginDatabase.Init_MySQL_Connection();
needInit = false;
}
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_CHARDB) & MYSQL_BUNDLE_RA))
+ if (!(CharacterDatabase.GetBundleMask() & MYSQL_BUNDLE_WORLD))
{
CharacterDatabase.Init_MySQL_Connection();
needInit = false;
@@ -117,13 +117,13 @@ void WorldRunnable::run()
sMapMgr.UnloadAll(); // unload all grids (including locked in memory)
///- Free MySQL thread resources and deallocate lingering connections
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_WORLDDB) & MYSQL_BUNDLE_RA))
+ if (!(WorldDatabase.GetBundleMask() & MYSQL_BUNDLE_WORLD))
WorldDatabase.End_MySQL_Connection();
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_LOGINDB) & MYSQL_BUNDLE_RA))
+ if (!(LoginDatabase.GetBundleMask() & MYSQL_BUNDLE_WORLD))
LoginDatabase.End_MySQL_Connection();
- if (!(sWorld.getIntConfig(CONFIG_MYSQL_BUNDLE_CHARDB) & MYSQL_BUNDLE_RA))
+ if (!(CharacterDatabase.GetBundleMask() & MYSQL_BUNDLE_WORLD))
CharacterDatabase.End_MySQL_Connection();
if (needInit)