mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
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:
@@ -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();
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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?
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user