MXS-2068: Use RWBackend in schemarouter
The schemarouter now uses the RWBackend to track the response states. This fixes the debug assertions that happened with the mxs1113_schemarouter_ps test.
This commit is contained in:
@ -47,7 +47,7 @@ public:
|
|||||||
static SRWBackendList from_servers(SERVER_REF* servers);
|
static SRWBackendList from_servers(SERVER_REF* servers);
|
||||||
|
|
||||||
RWBackend(SERVER_REF* ref);
|
RWBackend(SERVER_REF* ref);
|
||||||
~RWBackend();
|
virtual ~RWBackend();
|
||||||
|
|
||||||
inline reply_state_t get_reply_state() const
|
inline reply_state_t get_reply_state() const
|
||||||
{
|
{
|
||||||
|
|||||||
@ -30,6 +30,7 @@
|
|||||||
#include <maxscale/pcre2.h>
|
#include <maxscale/pcre2.h>
|
||||||
#include <maxscale/service.h>
|
#include <maxscale/service.h>
|
||||||
#include <maxscale/backend.hh>
|
#include <maxscale/backend.hh>
|
||||||
|
#include <maxscale/protocol/rwbackend.hh>
|
||||||
|
|
||||||
namespace schemarouter
|
namespace schemarouter
|
||||||
{
|
{
|
||||||
@ -96,12 +97,12 @@ struct Stats
|
|||||||
*
|
*
|
||||||
* Owned by router client session.
|
* Owned by router client session.
|
||||||
*/
|
*/
|
||||||
class SRBackend : public mxs::Backend
|
class SRBackend : public mxs::RWBackend
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SRBackend(SERVER_REF* ref)
|
SRBackend(SERVER_REF* ref)
|
||||||
: mxs::Backend(ref)
|
: mxs::RWBackend(ref)
|
||||||
, m_mapped(false)
|
, m_mapped(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@ -440,7 +440,7 @@ int32_t SchemaRouterSession::routeQuery(GWBUF* pPacket)
|
|||||||
m_load_target = bref->backend()->server;
|
m_load_target = bref->backend()->server;
|
||||||
}
|
}
|
||||||
|
|
||||||
MXS_INFO("Route query to \t%s:%d <", bref->backend()->server->address, bref->backend()->server->port);
|
MXS_INFO("Route query to \t%s %s <", bref->name(), bref->uri());
|
||||||
|
|
||||||
if (bref->has_session_commands())
|
if (bref->has_session_commands())
|
||||||
{
|
{
|
||||||
@ -459,7 +459,15 @@ int32_t SchemaRouterSession::routeQuery(GWBUF* pPacket)
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (bref->write(pPacket))
|
else
|
||||||
|
{
|
||||||
|
uint8_t cmd = mxs_mysql_get_command(pPacket);
|
||||||
|
|
||||||
|
auto responds = mxs_mysql_command_will_respond(cmd) ?
|
||||||
|
mxs::Backend::EXPECT_RESPONSE :
|
||||||
|
mxs::Backend::NO_RESPONSE;
|
||||||
|
|
||||||
|
if (bref->write(pPacket, responds))
|
||||||
{
|
{
|
||||||
/** Add one query response waiter to backend reference */
|
/** Add one query response waiter to backend reference */
|
||||||
mxb::atomic::add(&m_router->m_stats.n_queries, 1, mxb::atomic::RELAXED);
|
mxb::atomic::add(&m_router->m_stats.n_queries, 1, mxb::atomic::RELAXED);
|
||||||
@ -468,10 +476,10 @@ int32_t SchemaRouterSession::routeQuery(GWBUF* pPacket)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MXS_ERROR("Routing query failed.");
|
|
||||||
gwbuf_free(pPacket);
|
gwbuf_free(pPacket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -510,8 +518,6 @@ void SchemaRouterSession::handle_mapping_reply(SSRBackend& bref, GWBUF** pPacket
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SchemaRouterSession::process_sescmd_response(SSRBackend& bref, GWBUF** ppPacket)
|
void SchemaRouterSession::process_sescmd_response(SSRBackend& bref, GWBUF** ppPacket)
|
||||||
{
|
|
||||||
if (bref->has_session_commands())
|
|
||||||
{
|
{
|
||||||
mxb_assert(GWBUF_IS_COLLECTED_RESULT(*ppPacket));
|
mxb_assert(GWBUF_IS_COLLECTED_RESULT(*ppPacket));
|
||||||
uint8_t command = bref->next_session_command()->get_command();
|
uint8_t command = bref->next_session_command()->get_command();
|
||||||
@ -541,7 +547,6 @@ void SchemaRouterSession::process_sescmd_response(SSRBackend& bref, GWBUF** ppPa
|
|||||||
*ppPacket = NULL;
|
*ppPacket = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
||||||
{
|
{
|
||||||
@ -553,13 +558,7 @@ void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MXS_DEBUG("Reply from [%s] session [%p]"
|
bref->process_reply(pPacket);
|
||||||
" mapping [%s] queries queued [%s]",
|
|
||||||
bref->backend()->server->name,
|
|
||||||
m_client->session,
|
|
||||||
m_state & INIT_MAPPING ? "true" : "false",
|
|
||||||
m_queue.size() == 0 ? "none" :
|
|
||||||
m_queue.size() > 0 ? "multiple" : "one");
|
|
||||||
|
|
||||||
if (m_state & INIT_MAPPING)
|
if (m_state & INIT_MAPPING)
|
||||||
{
|
{
|
||||||
@ -574,6 +573,9 @@ void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
|||||||
m_current_db = m_connect_db;
|
m_current_db = m_connect_db;
|
||||||
mxb_assert(m_state == INIT_READY);
|
mxb_assert(m_state == INIT_READY);
|
||||||
|
|
||||||
|
gwbuf_free(pPacket);
|
||||||
|
pPacket = NULL;
|
||||||
|
|
||||||
if (m_queue.size())
|
if (m_queue.size())
|
||||||
{
|
{
|
||||||
route_queued_query();
|
route_queued_query();
|
||||||
@ -585,23 +587,14 @@ void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
|||||||
mxb_assert(m_state == INIT_READY);
|
mxb_assert(m_state == INIT_READY);
|
||||||
route_queued_query();
|
route_queued_query();
|
||||||
}
|
}
|
||||||
else
|
else if (bref->reply_is_complete())
|
||||||
|
{
|
||||||
|
if (bref->has_session_commands())
|
||||||
{
|
{
|
||||||
process_sescmd_response(bref, &pPacket);
|
process_sescmd_response(bref, &pPacket);
|
||||||
|
|
||||||
if (bref->is_waiting_result())
|
|
||||||
{
|
|
||||||
/** Set response status as replied */
|
|
||||||
bref->ack_write();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pPacket)
|
if (bref->has_session_commands() && bref->execute_session_command())
|
||||||
{
|
|
||||||
MXS_SESSION_ROUTE_REPLY(pDcb->session, pPacket);
|
|
||||||
pPacket = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bref->execute_session_command())
|
|
||||||
{
|
{
|
||||||
MXS_INFO("Backend %s:%d processed reply and starts to execute active cursor.",
|
MXS_INFO("Backend %s:%d processed reply and starts to execute active cursor.",
|
||||||
bref->backend()->server->address,
|
bref->backend()->server->address,
|
||||||
@ -613,7 +606,10 @@ void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gwbuf_free(pPacket);
|
if (pPacket)
|
||||||
|
{
|
||||||
|
MXS_SESSION_ROUTE_REPLY(pDcb->session, pPacket);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SchemaRouterSession::handleError(GWBUF* pMessage,
|
void SchemaRouterSession::handleError(GWBUF* pMessage,
|
||||||
@ -1035,7 +1031,6 @@ int SchemaRouterSession::inspect_mapping_states(SSRBackend& bref,
|
|||||||
if (rc == SHOWDB_FULL_RESPONSE)
|
if (rc == SHOWDB_FULL_RESPONSE)
|
||||||
{
|
{
|
||||||
(*it)->set_mapped(true);
|
(*it)->set_mapped(true);
|
||||||
(*it)->ack_write();
|
|
||||||
MXS_DEBUG("Received SHOW DATABASES reply from %s for session %p",
|
MXS_DEBUG("Received SHOW DATABASES reply from %s for session %p",
|
||||||
(*it)->backend()->server->name,
|
(*it)->backend()->server->name,
|
||||||
m_client->session);
|
m_client->session);
|
||||||
|
|||||||
Reference in New Issue
Block a user