diff options
author | Machiavelli <none@none> | 2010-10-02 14:26:58 +0200 |
---|---|---|
committer | Machiavelli <none@none> | 2010-10-02 14:26:58 +0200 |
commit | c4710bde766bdb37477022e4a1768dab3ff311fa (patch) | |
tree | 6c6f8eaa2f20a1c1fcc2412f2942ce1010fab8d7 /src | |
parent | 0f09690c5c1d0c391df9faa6a702f3d892a452dc (diff) |
Core/DBLayer: Fix MySQL timeout issue. World runnable will now call KeepAlive on each database after a specified number of seconds (MaxPingTime in worldserver.conf)
Based on patch by kingarus81
Fixes issue #4062
Also remove explicit numbering from WorldTimers enum
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/World/World.cpp | 15 | ||||
-rw-r--r-- | src/server/game/World/World.h | 26 | ||||
-rw-r--r-- | src/server/worldserver/Master.cpp | 26 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 5 |
4 files changed, 33 insertions, 39 deletions
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index ea50e28ed36..a5b7a867af1 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1206,6 +1206,9 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_AUTOBROADCAST_CENTER] = sConfig.GetIntDefault("AutoBroadcast.Center", 0); m_int_configs[CONFIG_AUTOBROADCAST_INTERVAL] = sConfig.GetIntDefault("AutoBroadcast.Timer", 60000); + // MySQL ping time interval + m_int_configs[CONFIG_DB_PING_INTERVAL] = sConfig.GetIntDefault("MaxPingTime", 1800); + sScriptMgr.OnConfigLoad(reload); } @@ -1663,6 +1666,8 @@ void World::SetInitialWorldSettings() m_timers[WUPDATE_AUTOBROADCAST].SetInterval(getIntConfig(CONFIG_AUTOBROADCAST_INTERVAL)); m_timers[WUPDATE_DELETECHARS].SetInterval(DAY*IN_MILLISECONDS); // check for chars to delete every day + m_timers[WUPDATE_PINGDB].SetInterval(getIntConfig(CONFIG_DB_PING_INTERVAL)*IN_MILLISECONDS); // Mysql ping time in seconds + //to set mailtimer to return mails every day between 4 and 5 am //mailtimer is increased when updating auctions //one second is 1000 -(tested on win system) @@ -1986,6 +1991,16 @@ void World::Update(uint32 diff) m_timers[WUPDATE_EVENTS].Reset(); } + ///- Ping to keep MySQL connections alive + if (m_timers[WUPDATE_PINGDB].Passed()) + { + m_timers[WUPDATE_PINGDB].Reset(); + sLog.outDetail("Ping MySQL to keep connection alive"); + CharacterDatabase.KeepAlive(); + LoginDatabase.KeepAlive(); + WorldDatabase.KeepAlive(); + } + // update the instance reset times sInstanceSaveMgr.Update(); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 498ddf0b7de..c06dbb26fe3 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -71,18 +71,19 @@ enum ShutdownExitCode /// Timers for different object refresh rates enum WorldTimers { - WUPDATE_OBJECTS = 0, - WUPDATE_SESSIONS = 1, - WUPDATE_AUCTIONS = 2, - WUPDATE_WEATHERS = 3, - WUPDATE_UPTIME = 4, - WUPDATE_CORPSES = 5, - WUPDATE_EVENTS = 6, - WUPDATE_CLEANDB = 7, - WUPDATE_AUTOBROADCAST = 8, - WUPDATE_MAILBOXQUEUE = 9, - WUPDATE_DELETECHARS = 10, - WUPDATE_COUNT = 11 + WUPDATE_OBJECTS, + WUPDATE_SESSIONS, + WUPDATE_AUCTIONS, + WUPDATE_WEATHERS, + WUPDATE_UPTIME, + WUPDATE_CORPSES, + WUPDATE_EVENTS, + WUPDATE_CLEANDB, + WUPDATE_AUTOBROADCAST, + WUPDATE_MAILBOXQUEUE, + WUPDATE_DELETECHARS, + WUPDATE_PINGDB, + WUPDATE_COUNT }; /// Configuration elements @@ -306,6 +307,7 @@ enum WorldIntConfigs CONFIG_AUTOBROADCAST_CENTER, CONFIG_AUTOBROADCAST_INTERVAL, CONFIG_MAX_RESULTS_LOOKUP_COMMANDS, + CONFIG_DB_PING_INTERVAL, INT_CONFIG_VALUE_COUNT }; diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index 15ec29c140c..ef1e562b412 100644 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -119,25 +119,7 @@ public: class RARunnable : public ACE_Based::Runnable { public: - uint32 numLoops, loopCounter; - - RARunnable () - { - uint32 socketSelecttime = sWorld.getIntConfig(CONFIG_SOCKET_SELECTTIME); - numLoops = (sConfig.GetIntDefault ("MaxPingTime", 30) * (MINUTE * 1000000 / socketSelecttime)); - loopCounter = 0; - } - - void checkping () - { - // ping if need - if ((++loopCounter) == numLoops) - { - loopCounter = 0; - sLog.outDetail ("Ping MySQL to keep connection alive"); - LoginDatabase.KeepAlive(); - } - } + RARunnable () {} void run () { @@ -171,18 +153,12 @@ public: if (usera) { while (!World::IsStopped()) - { h.Select (0, socketSelecttime); - checkping (); - } } else { while (!World::IsStopped()) - { ACE_Based::Thread::Sleep(static_cast<unsigned long> (socketSelecttime / 1000)); - // checkping (); -- What? - } } } }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 3bbf0cc5f9e..dc368b598da 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -53,7 +53,8 @@ # Default: 1, 1, 2 # # MaxPingTime -# Settings for maximum database-ping interval (minutes between pings) +# Settings for maximum database-ping interval (seconds between pings) +# Default: 1800 (30 minutes) # # WorldServerPort # Default WorldServerPort @@ -75,7 +76,7 @@ CharacterDatabase.WorkerThreads = 1 LoginDatabase.SynchThreads = 1 WorldDatabase.SynchThreads = 1 CharacterDatabase.SynchThreads = 2 -MaxPingTime = 30 +MaxPingTime = 1800 WorldServerPort = 8085 BindIP = "0.0.0.0" |