From 446a3fac1538a6cd61f87f8da1e76965e5925b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Thu, 10 Oct 2019 08:57:38 +0300 Subject: [PATCH] MXS-2720: Fix service session count The number of sessions wasn't always incremented but it was always decremented. This happened primarily when authentication failed. By making the management of the counters a part of the object lifecycle, this problem goes away. --- server/core/session.cc | 10 ++++++---- server/modules/filter/test/mock_session.cc | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/server/core/session.cc b/server/core/session.cc index 75514cc41..6fb196241 100644 --- a/server/core/session.cc +++ b/server/core/session.cc @@ -244,7 +244,6 @@ static MXS_SESSION* session_alloc_body(SERVICE* service, session->client_dcb->remote); } mxb::atomic::add(&service->stats.n_sessions, 1, mxb::atomic::RELAXED); - mxb::atomic::add(&service->stats.n_current, 1, mxb::atomic::RELAXED); // Store the session in the client DCB even if the session creation fails. // It will be freed later on when the DCB is closed. @@ -383,9 +382,6 @@ static void session_final_free(MXS_SESSION* ses) session->state = SESSION_STATE_TO_BE_FREED; - mxb::atomic::add(&session->service->stats.n_current, -1, mxb::atomic::RELAXED); - mxb_assert(session->service->stats.n_current >= 0); - if (session->client_dcb) { dcb_free_all_memory(session->client_dcb); @@ -1265,6 +1261,9 @@ Session::Session(SERVICE* service) { m_retain_last_statements = this_unit.retain_last_statements; } + + mxb::atomic::add(&service->stats.n_current, 1, mxb::atomic::RELAXED); + mxb_assert(service->stats.n_current >= 0); } Session::~Session() @@ -1279,6 +1278,9 @@ Session::~Session() f.filter->obj->closeSession(f.instance, f.session); f.filter->obj->freeSession(f.instance, f.session); } + + mxb::atomic::add(&service->stats.n_current, -1, mxb::atomic::RELAXED); + mxb_assert(service->stats.n_current >= 0); } namespace diff --git a/server/modules/filter/test/mock_session.cc b/server/modules/filter/test/mock_session.cc index 29686de51..83513a122 100644 --- a/server/modules/filter/test/mock_session.cc +++ b/server/modules/filter/test/mock_session.cc @@ -17,7 +17,6 @@ namespace { SERVICE dummy_service; - } namespace maxscale @@ -44,6 +43,7 @@ Session::Session(Client* pClient) strcpy(m_mysql_session.db, "dummy"); m_client_dcb.data = &m_mysql_session; + service = &dummy_service; } Session::~Session()