Cache the local server statistics object

By storing the server statistics object in side the session, the lookup
involved in getting a worker-local value is avoided. Since the lookup is
done multiple times for a single query, it is beneficial to store it in
the session.

As the worker-local value is never deleted, it is safe to store a
reference to it in the session. It is also never updated concurrently so
no atomic operations are necessary.
This commit is contained in:
Markus Mäkelä
2018-12-09 15:01:52 +02:00
parent 1fa3b133c7
commit 9adbd2f8f0
6 changed files with 19 additions and 14 deletions

View File

@ -477,8 +477,8 @@ bool RWSplitSession::route_session_write(GWBUF* querybuf, uint8_t command, uint3
{
nsucc += 1;
mxb::atomic::add(&backend->server()->stats.packets, 1, mxb::atomic::RELAXED);
m_router->server_stats(backend->server()).total++;
m_router->server_stats(backend->server()).read++;
m_server_stats[backend->server()].total++;
m_server_stats[backend->server()].read++;
if (expecting_response)
{
@ -853,7 +853,7 @@ SRWBackend RWSplitSession::handle_slave_is_target(uint8_t cmd, uint32_t stmt_id)
if (target)
{
mxb::atomic::add(&m_router->stats().n_slave, 1, mxb::atomic::RELAXED);
m_router->server_stats(target->server()).read++;
m_server_stats[target->server()].read++;
mxb_assert(target->in_use() || target->can_connect());
}
else
@ -990,7 +990,7 @@ bool RWSplitSession::handle_master_is_target(SRWBackend* dest)
if (target && target == m_current_master)
{
mxb::atomic::add(&m_router->stats().n_master, 1, mxb::atomic::RELAXED);
m_router->server_stats(target->server()).write++;
m_server_stats[target->server()].write++;
}
else
{
@ -1170,7 +1170,7 @@ bool RWSplitSession::handle_got_target(GWBUF* querybuf, SRWBackend& target, bool
mxb::atomic::add(&m_router->stats().n_queries, 1, mxb::atomic::RELAXED);
mxb::atomic::add(&target->server()->stats.packets, 1, mxb::atomic::RELAXED);
m_router->server_stats(target->server()).total++;
m_server_stats[target->server()].total++;
if (!m_qc.large_query() && response == mxs::Backend::EXPECT_RESPONSE)
{