Make keepalive ping checks more efficient
The code now only checks the need for a keepalive ping once every keepalive interval. Reduced the number of mxs_clock calls to one so that all servers use the same value.
This commit is contained in:
@ -41,8 +41,11 @@ void RWSplitSession::handle_connection_keepalive(SRWBackend& target)
|
|||||||
mxb_assert(target);
|
mxb_assert(target);
|
||||||
MXB_AT_DEBUG(int nserv = 0);
|
MXB_AT_DEBUG(int nserv = 0);
|
||||||
/** Each heartbeat is 1/10th of a second */
|
/** Each heartbeat is 1/10th of a second */
|
||||||
int keepalive = m_config.connection_keepalive * 10;
|
int64_t keepalive = m_config.connection_keepalive * 10;
|
||||||
|
int64_t now = mxs_clock();
|
||||||
|
|
||||||
|
if (now - m_last_keepalive_check > keepalive)
|
||||||
|
{
|
||||||
for (auto it = m_backends.begin(); it != m_backends.end(); it++)
|
for (auto it = m_backends.begin(); it != m_backends.end(); it++)
|
||||||
{
|
{
|
||||||
SRWBackend backend = *it;
|
SRWBackend backend = *it;
|
||||||
@ -50,7 +53,7 @@ void RWSplitSession::handle_connection_keepalive(SRWBackend& target)
|
|||||||
if (backend->in_use() && backend != target && !backend->is_waiting_result())
|
if (backend->in_use() && backend != target && !backend->is_waiting_result())
|
||||||
{
|
{
|
||||||
MXB_AT_DEBUG(nserv++);
|
MXB_AT_DEBUG(nserv++);
|
||||||
int diff = mxs_clock() - backend->dcb()->last_read;
|
int64_t diff = now - backend->dcb()->last_read;
|
||||||
|
|
||||||
if (diff > keepalive)
|
if (diff > keepalive)
|
||||||
{
|
{
|
||||||
@ -61,6 +64,7 @@ void RWSplitSession::handle_connection_keepalive(SRWBackend& target)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mxb_assert(nserv < m_nbackends);
|
mxb_assert(nserv < m_nbackends);
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include <maxscale/modutil.hh>
|
#include <maxscale/modutil.hh>
|
||||||
#include <maxscale/poll.h>
|
#include <maxscale/poll.h>
|
||||||
|
#include <maxscale/clock.h>
|
||||||
|
|
||||||
using namespace maxscale;
|
using namespace maxscale;
|
||||||
|
|
||||||
@ -28,11 +29,11 @@ RWSplitSession::RWSplitSession(RWSplit* instance,
|
|||||||
, m_backends(backends)
|
, m_backends(backends)
|
||||||
, m_current_master(master)
|
, m_current_master(master)
|
||||||
, m_config(instance->config())
|
, m_config(instance->config())
|
||||||
|
, m_last_keepalive_check(mxs_clock())
|
||||||
, m_nbackends(instance->service()->n_dbref)
|
, m_nbackends(instance->service()->n_dbref)
|
||||||
, m_client(session->client_dcb)
|
, m_client(session->client_dcb)
|
||||||
, m_sescmd_count(1)
|
, m_sescmd_count(1)
|
||||||
, // Needs to be a positive number to work
|
, m_expected_responses(0)
|
||||||
m_expected_responses(0)
|
|
||||||
, m_query_queue(NULL)
|
, m_query_queue(NULL)
|
||||||
, m_router(instance)
|
, m_router(instance)
|
||||||
, m_sent_sescmd(0)
|
, m_sent_sescmd(0)
|
||||||
|
@ -136,6 +136,7 @@ public:
|
|||||||
mxs::SRWBackend m_target_node; /**< The currently locked target node */
|
mxs::SRWBackend m_target_node; /**< The currently locked target node */
|
||||||
mxs::SRWBackend m_prev_target; /**< The previous target where a query was sent */
|
mxs::SRWBackend m_prev_target; /**< The previous target where a query was sent */
|
||||||
Config m_config; /**< Configuration for this session */
|
Config m_config; /**< Configuration for this session */
|
||||||
|
int m_last_keepalive_check; /**< When the last ping was done */
|
||||||
int m_nbackends; /**< Number of backend servers (obsolete) */
|
int m_nbackends; /**< Number of backend servers (obsolete) */
|
||||||
DCB* m_client; /**< The client DCB */
|
DCB* m_client; /**< The client DCB */
|
||||||
uint64_t m_sescmd_count; /**< Number of executed session commands */
|
uint64_t m_sescmd_count; /**< Number of executed session commands */
|
||||||
|
Reference in New Issue
Block a user