MXS-1780 Make statement retaining session specific

Whether or not a session should retain its statements is now
a property of the session. This in preparation for making the
whole functionality a property that can be enabled and disabled
at runtime, of the service.
This commit is contained in:
Johan Wikman 2018-11-07 10:20:06 +02:00
parent c899f00541
commit dd712a06fa
2 changed files with 38 additions and 23 deletions

View File

@ -100,6 +100,7 @@ public:
using FilterList = std::vector<SessionFilter>;
Session();
~Session();
bool setup_filters(Service* service);
@ -143,9 +144,10 @@ public:
private:
FilterList m_filters;
SessionVarsByName m_variables;
QueryInfos m_last_queries; /*< The N last queries by the client */
int m_current_query = -1; /*< The index of the current query */
DCBSet m_dcb_set; /*< Set of associated backend DCBs */
QueryInfos m_last_queries; /*< The N last queries by the client */
int m_current_query = -1; /*< The index of the current query */
DCBSet m_dcb_set; /*< Set of associated backend DCBs */
bool m_retain_last_statements; /*< Should statement information be stored */
};
}

View File

@ -51,17 +51,24 @@ using std::stringstream;
using maxbase::Worker;
using namespace maxscale;
/** Global session id counter. Must be updated atomically. Value 0 is reserved for
* dummy/unused sessions.
*/
static uint64_t next_session_id = 1;
static uint32_t retain_last_statements = 0;
static session_dump_statements_t dump_statements = SESSION_DUMP_STATEMENTS_NEVER;
namespace
{
struct
{
/* Global session id counter. Must be updated atomically. Value 0 is reserved for
* dummy/unused sessions.
*/
uint64_t next_session_id;
uint32_t retain_last_statements;
session_dump_statements_t dump_statements;
} this_unit =
{
1,
0,
SESSION_DUMP_STATEMENTS_NEVER
};
static struct session dummy_session()
{
struct session session = {};
@ -69,6 +76,7 @@ static struct session dummy_session()
session.refcount = 1;
return session;
}
}
static struct session session_dummy_struct = dummy_session();
@ -380,7 +388,7 @@ static void session_final_free(MXS_SESSION* ses)
session->client_dcb = NULL;
}
if (dump_statements == SESSION_DUMP_STATEMENTS_ON_CLOSE)
if (this_unit.dump_statements == SESSION_DUMP_STATEMENTS_ON_CLOSE)
{
session_dump_statements(session);
}
@ -819,7 +827,7 @@ void session_put_ref(MXS_SESSION* session)
uint64_t session_get_next_id()
{
return mxb::atomic::add(&next_session_id, 1, mxb::atomic::RELAXED);
return mxb::atomic::add(&this_unit.next_session_id, 1, mxb::atomic::RELAXED);
}
json_t* session_json_data(const Session* session, const char* host)
@ -1044,17 +1052,17 @@ static void session_deliver_response(MXS_SESSION* session)
void session_set_retain_last_statements(uint32_t n)
{
retain_last_statements = n;
this_unit.retain_last_statements = n;
}
void session_set_dump_statements(session_dump_statements_t value)
{
dump_statements = value;
this_unit.dump_statements = value;
}
session_dump_statements_t session_get_dump_statements()
{
return dump_statements;
return this_unit.dump_statements;
}
void session_retain_statement(MXS_SESSION* pSession, GWBUF* pBuffer)
@ -1190,6 +1198,11 @@ const char* session_get_close_reason(const MXS_SESSION* session)
}
}
Session::Session()
: m_retain_last_statements(this_unit.retain_last_statements)
{
}
Session::~Session()
{
if (router_session)
@ -1257,7 +1270,7 @@ bool get_cmd_and_stmt(GWBUF* pBuffer, const char** ppCmd, char** ppStmt, int* pL
void Session::dump_statements() const
{
if (retain_last_statements)
if (m_retain_last_statements)
{
int n = m_last_queries.size();
@ -1466,15 +1479,15 @@ bool Session::remove_variable(const char* name, void** context)
void Session::retain_statement(GWBUF* pBuffer)
{
if (retain_last_statements)
if (m_retain_last_statements)
{
mxb_assert(m_last_queries.size() <= retain_last_statements);
mxb_assert(m_last_queries.size() <= m_retain_last_statements);
std::shared_ptr<GWBUF> sBuffer(gwbuf_clone(pBuffer));
m_last_queries.push_front(QueryInfo(sBuffer));
if (m_last_queries.size() > retain_last_statements)
if (m_last_queries.size() > m_retain_last_statements)
{
m_last_queries.pop_back();
}
@ -1497,7 +1510,7 @@ void Session::retain_statement(GWBUF* pBuffer)
void Session::book_server_response(SERVER* pServer, bool final_response)
{
if (retain_last_statements && !m_last_queries.empty())
if (m_retain_last_statements && !m_last_queries.empty())
{
mxb_assert(m_current_query >= 0);
// If enough queries have been sent by the client, without it waiting
@ -1527,7 +1540,7 @@ void Session::book_server_response(SERVER* pServer, bool final_response)
void Session::book_last_as_complete()
{
if (retain_last_statements && !m_last_queries.empty())
if (m_retain_last_statements && !m_last_queries.empty())
{
mxb_assert(m_current_query >= 0);
// See comment in book_server_response().
@ -1543,7 +1556,7 @@ void Session::book_last_as_complete()
void Session::reset_server_bookkeeping()
{
if (retain_last_statements && !m_last_queries.empty())
if (m_retain_last_statements && !m_last_queries.empty())
{
mxb_assert(m_current_query >= 0);
// See comment in book_server_response().