MXS-1625 Move QueryClassifier::Handler to RWSplitSession

This commit is contained in:
Johan Wikman
2018-04-09 11:30:56 +03:00
parent a102ddf5de
commit c8961a3d14
7 changed files with 37 additions and 45 deletions

View File

@ -630,7 +630,6 @@ RouteInfo::RouteInfo(RWSplitSession* rses, GWBUF* buffer)
, command(0xff)
, type(QUERY_TYPE_UNKNOWN)
, stmt_id(0)
, m_rses(rses)
{
ss_dassert(rses);
ss_dassert(rses->m_client);
@ -652,28 +651,5 @@ RouteInfo::RouteInfo(RWSplitSession* rses, GWBUF* buffer)
current_target = QueryClassifier::CURRENT_TARGET_SLAVE;
}
m_rses->qc().set_handler(this);
target = get_target_type(rses->qc(), current_target, buffer, &command, &type, &stmt_id);
m_rses->qc().set_handler(NULL);
m_rses = NULL;
}
bool RouteInfo::lock_to_master()
{
bool rv = false;
if (m_rses->m_current_master && m_rses->m_current_master->in_use())
{
m_rses->m_target_node = m_rses->m_current_master;
rv = true;
}
return rv;
}
bool RouteInfo::is_locked_to_master() const
{
return m_rses->m_target_node && m_rses->m_target_node == m_rses->m_current_master;
}

View File

@ -13,11 +13,10 @@
*/
#include "readwritesplit.hh"
#include <maxscale/queryclassifier.hh>
class RWSplitSession;
struct RouteInfo : private maxscale::QueryClassifier::Handler
struct RouteInfo
{
RouteInfo(RWSplitSession* rses, GWBUF* buffer);
@ -25,11 +24,4 @@ struct RouteInfo : private maxscale::QueryClassifier::Handler
uint8_t command; /**< The command byte, 0xff for unknown commands */
uint32_t type; /**< The query type, QUERY_TYPE_UNKNOWN for unknown types*/
uint32_t stmt_id; /**< Prepared statement ID, 0 for unknown */
private:
bool lock_to_master();
bool is_locked_to_master() const;
private:
RWSplitSession* m_rses;
};

View File

@ -144,7 +144,7 @@ bool RWSplitSession::route_single_stmt(GWBUF *querybuf, const RouteInfo& info)
uint8_t command = info.command;
uint32_t qtype = info.type;
route_target_t route_target = info.target;
bool not_locked_to_master = !locked_to_master();
bool not_locked_to_master = !is_locked_to_master();
if (not_locked_to_master && mxs_mysql_is_ps_command(command))
{
@ -771,7 +771,7 @@ bool RWSplitSession::should_replace_master(SRWBackend& target)
// We are not inside a transaction (also checks for autocommit=1)
!session_trx_is_active(m_client->session) &&
// We are not locked to the old master
!locked_to_master();
!is_locked_to_master();
}
void RWSplitSession::replace_master(SRWBackend& target)

View File

@ -36,7 +36,7 @@ RWSplitSession::RWSplitSession(RWSplit* instance, MXS_SESSION* session,
m_gtid_pos(""),
m_wait_gtid_state(EXPECTING_NOTHING),
m_next_seq(0),
m_qc(session, instance->config().use_sql_variables_in)
m_qc(this, session, instance->config().use_sql_variables_in)
{
if (m_config.rw_max_slave_conn_percent)
{
@ -737,3 +737,21 @@ void RWSplitSession::handle_error_reply_client(DCB *backend_dcb, GWBUF *errmsg)
m_client->func.write(m_client, gwbuf_clone(errmsg));
}
}
bool RWSplitSession::lock_to_master()
{
bool rv = false;
if (m_current_master && m_current_master->in_use())
{
m_target_node = m_current_master;
rv = true;
}
return rv;
}
bool RWSplitSession::is_locked_to_master() const
{
return m_target_node && m_target_node == m_current_master;
}

View File

@ -43,12 +43,16 @@ typedef std::tr1::unordered_map<uint32_t, mxs::SRWBackend> ExecMap;
/**
* The client session of a RWSplit instance
*/
class RWSplitSession: public mxs::RouterSession
class RWSplitSession: public mxs::RouterSession,
private mxs::QueryClassifier::Handler
{
RWSplitSession(const RWSplitSession&) = delete;
RWSplitSession& operator=(const RWSplitSession&) = delete;
public:
virtual ~RWSplitSession()
{
}
/**
* Create a new router session
@ -173,6 +177,11 @@ private:
{
return m_qc.large_query() || (m_current_master && m_target_node == m_current_master);
}
private:
// QueryClassifier::Handler
bool lock_to_master();
bool is_locked_to_master() const;
};
/**