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
This commit is contained in:
Machiavelli
2010-10-02 14:26:58 +02:00
parent 0f09690c5c
commit c4710bde76
4 changed files with 33 additions and 39 deletions

View File

@@ -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();

View File

@@ -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
};

View File

@@ -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?
}
}
}
};

View File

@@ -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"