From 05a292633cdfdb9383d0a914d5b95c838837e1eb Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Sun, 31 Oct 2010 10:55:29 +0100 Subject: 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. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch by admin@****.net Fixes issue #4599 --HG-- branch : trunk --- src/server/shared/Database/DatabaseWorkerPool.h | 26 +++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index 899c0f8f63d..9f7bf6d72dc 100755 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -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. -- cgit v1.2.3