aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-10-02 14:26:58 +0200
committerMachiavelli <none@none>2010-10-02 14:26:58 +0200
commitc4710bde766bdb37477022e4a1768dab3ff311fa (patch)
tree6c6f8eaa2f20a1c1fcc2412f2942ce1010fab8d7 /src
parent0f09690c5c1d0c391df9faa6a702f3d892a452dc (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.cpp15
-rw-r--r--src/server/game/World/World.h26
-rw-r--r--src/server/worldserver/Master.cpp26
-rw-r--r--src/server/worldserver/worldserver.conf.dist5
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"