From 62946f9ef643e33adbb0b4fe1d5139a1cb37dae1 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Sat, 25 Sep 2010 01:05:24 +0200 Subject: Core/DBLayer: - Rewrite KeepAlive method for DatabaseWorkerPool. Use mysql_ping instead of explicit select queries, and also schedule KeepAlives for asynchronous threads. NOTE: While the function is implemented and previous keepalive calls were transformed, it´s possible the keepalive call will need to be placed in several other locations in the code. Please leave feedback on whether or not this fixes your timeout issues. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update issue #4062 --HG-- branch : trunk --- src/server/shared/Database/DatabaseWorkerPool.h | 31 +++++++++++++++++++++++++ src/server/shared/Database/MySQLConnection.h | 1 + 2 files changed, 32 insertions(+) (limited to 'src/server/shared') diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index 6092381f86f..2c6afa2e9e2 100644 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -43,6 +43,16 @@ enum MySQLThreadBundle MYSQL_BUNDLE_ALL = MYSQL_BUNDLE_RA | MYSQL_BUNDLE_RAR | MYSQL_BUNDLE_WORLD, }; +class PingOperation : public SQLOperation +{ + /// Operation for idle delaythreads + bool Execute() + { + m_conn->Ping(); + return true; + } +}; + template class DatabaseWorkerPool { @@ -304,6 +314,27 @@ class DatabaseWorkerPool return PreparedQueryResult(ret); } + void KeepAlive() + { + ConnectionMap::const_iterator itr; + { + /*! MapUpdate + unbundled threads */ + ACE_Guard guard(m_connectionMap_mtx); + itr = m_sync_connections.find(ACE_Based::Thread::current()); + if (itr != m_sync_connections.end()) + itr->second->Ping(); + } + + if (m_bundle_conn) + m_bundle_conn->Ping(); + + /// 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. + for (size_t i = 0; i < m_async_connections.size(); ++i) + Enqueue(new PingOperation); + } + private: unsigned long escape_string(char *to, const char *from, unsigned long length) { diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h index 09c30e7073e..93812421c8a 100644 --- a/src/server/shared/Database/MySQLConnection.h +++ b/src/server/shared/Database/MySQLConnection.h @@ -50,6 +50,7 @@ class MySQLConnection void CommitTransaction(); operator bool () const { return m_Mysql != NULL; } + void Ping() { mysql_ping(m_Mysql); } protected: MYSQL* GetHandle() { return m_Mysql; } -- cgit v1.2.3