diff options
| author | Machiavelli <none@none> | 2010-09-25 01:05:24 +0200 | 
|---|---|---|
| committer | Machiavelli <none@none> | 2010-09-25 01:05:24 +0200 | 
| commit | 62946f9ef643e33adbb0b4fe1d5139a1cb37dae1 (patch) | |
| tree | 2bd1bc4cd742d42f188dcc1164525244225f47fa | |
| parent | 154d11acc0afdf3639e6a07c931e35674102e44a (diff) | |
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.
Update issue #4062
--HG--
branch : trunk
| -rw-r--r-- | src/server/authserver/Main.cpp | 2 | ||||
| -rw-r--r-- | src/server/shared/Database/DatabaseWorkerPool.h | 31 | ||||
| -rw-r--r-- | src/server/shared/Database/MySQLConnection.h | 1 | ||||
| -rw-r--r-- | src/server/worldserver/Master.cpp | 2 | 
4 files changed, 34 insertions, 2 deletions
| diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index dfc04f58512..d23aecf3313 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -314,7 +314,7 @@ extern int main(int argc, char **argv)          {              loopCounter = 0;              sLog.outDetail("Ping MySQL to keep connection alive"); -            LoginDatabase.Query("SELECT 1 FROM realmlist"); +            LoginDatabase.KeepAlive();          }  #ifdef _WIN32          if (m_ServiceStatus == 0) stopEvent = true; 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 T>  class DatabaseWorkerPool  { @@ -304,6 +314,27 @@ class DatabaseWorkerPool              return PreparedQueryResult(ret);          } +        void KeepAlive() +        { +            ConnectionMap::const_iterator itr; +            { +                /*! MapUpdate + unbundled threads */ +                ACE_Guard<ACE_Thread_Mutex> 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; } diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index f9f9c1450d4..3dca8d3935b 100644 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -135,7 +135,7 @@ public:          {              loopCounter = 0;              sLog.outDetail ("Ping MySQL to keep connection alive"); -            LoginDatabase.Query ("SELECT 1 FROM realmlist LIMIT 1"); +            LoginDatabase.KeepAlive();          }      } | 
