Core/DBLayer:

- Fix a race condition in KeepAlive() when connections are using mysql context when ping is called.
- Don´t wait for locks to be released on a connection when pinging, this means the connection is not idle and locking is redundant.

Patch by admin@****.net

Fixes issue #4599

--HG--
branch : trunk
This commit is contained in:
Machiavelli
2010-10-31 10:55:29 +01:00
parent c9bbe85e48
commit 05a292633c

View File

@@ -37,13 +37,12 @@ class PingOperation : public SQLOperation
/// Operation for idle delaythreads
bool Execute()
{
for (;;)
if (m_conn->LockIfReady())
{
m_conn->Ping();
m_conn->Unlock();
return true;
}
if (m_conn->LockIfReady())
{
m_conn->Ping();
m_conn->Unlock();
return true;
}
return false;
}
@@ -305,10 +304,17 @@ class DatabaseWorkerPool
void KeepAlive()
{
/// Ping syncrhonous connections
/// Ping synchronous connections
for (uint8 i = 0; i < m_connections[IDX_SYNCH].size(); ++i)
m_connections[IDX_SYNCH][i]->Ping();
{
T* t = m_connections[IDX_SYNCH][i];
if (t->LockIfReady())
{
t->Ping();
t->Unlock();
}
}
/// Assuming all worker threads are free, every worker thread will receive 1 ping operation request
/// If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter
/// as the sole purpose is to prevent connections from idling.