diff --git a/include/maxscale/session_stats.hh b/include/maxscale/session_stats.hh index d5c9984d1..6c5c8566e 100644 --- a/include/maxscale/session_stats.hh +++ b/include/maxscale/session_stats.hh @@ -15,7 +15,7 @@ #include -#include +#include #include #include @@ -59,5 +59,5 @@ private: maxbase::CumulativeAverage m_num_ave_session_selects; }; -using SrvStatMap = std::map; +using SrvStatMap = std::unordered_map; } diff --git a/server/modules/routing/readwritesplit/readwritesplit.cc b/server/modules/routing/readwritesplit/readwritesplit.cc index 01d9dff9b..b71c062c7 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.cc +++ b/server/modules/routing/readwritesplit/readwritesplit.cc @@ -107,9 +107,9 @@ const Stats& RWSplit::stats() const return m_stats; } -ServerStats& RWSplit::server_stats(SERVER* server) +SrvStatMap& RWSplit::local_server_stats() { - return (*m_server_stats)[server]; + return *m_server_stats; } maxscale::SrvStatMap RWSplit::all_server_stats() const diff --git a/server/modules/routing/readwritesplit/readwritesplit.hh b/server/modules/routing/readwritesplit/readwritesplit.hh index 02823f6ef..f4364311f 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.hh +++ b/server/modules/routing/readwritesplit/readwritesplit.hh @@ -264,7 +264,7 @@ public: const Config& config() const; Stats& stats(); const Stats& stats() const; - ServerStats& server_stats(SERVER* server); + SrvStatMap& local_server_stats(); SrvStatMap all_server_stats() const; int max_slave_count() const; diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index ba363319d..65cf6092f 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -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) { diff --git a/server/modules/routing/readwritesplit/rwsplitsession.cc b/server/modules/routing/readwritesplit/rwsplitsession.cc index aa0d31e6f..705dc1047 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.cc +++ b/server/modules/routing/readwritesplit/rwsplitsession.cc @@ -45,6 +45,7 @@ RWSplitSession::RWSplitSession(RWSplit* instance, , m_retry_duration(0) , m_is_replay_active(false) , m_can_replay_trx(true) + , m_server_stats(instance->local_server_stats()) { if (m_config.rw_max_slave_conn_percent) { @@ -84,7 +85,7 @@ RWSplitSession* RWSplitSession::create(RWSplit* router, MXS_SESSION* session) for (auto& b : backends) { - router->server_stats(b->server()).start_session(); + rses->m_server_stats[b->server()].start_session(); } } } @@ -122,9 +123,9 @@ void RWSplitSession::close() } backend->response_stat().reset(); - m_router->server_stats(backend->server()).end_session(backend->session_timer().split(), - backend->select_timer().total(), - backend->num_selects()); + m_server_stats[backend->server()].end_session(backend->session_timer().split(), + backend->select_timer().total(), + backend->num_selects()); } } diff --git a/server/modules/routing/readwritesplit/rwsplitsession.hh b/server/modules/routing/readwritesplit/rwsplitsession.hh index 426af5f61..ed769b058 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.hh +++ b/server/modules/routing/readwritesplit/rwsplitsession.hh @@ -169,6 +169,10 @@ public: otrx_state m_otrx_state = OTRX_INACTIVE; /**< Optimistic trx state*/ + SrvStatMap& m_server_stats; /**< The server stats local to this thread, cached in the session object. + * This avoids the lookup involved in getting the worker-local value from + * the worker's container.*/ + private: RWSplitSession(RWSplit* instance, MXS_SESSION* session,