Move Backend functions inside the class
The functions that handle Backend classes are now methods of the class itself. Prefix all member variables with `m_` to distinct them from other variables.
This commit is contained in:
parent
d1aa2a4b8a
commit
5ba9de6f42
@ -22,10 +22,6 @@
|
||||
|
||||
bool connect_backend_servers(BackendList& backends, MXS_SESSION* session);
|
||||
|
||||
bool execute_sescmd_in_backend(Backend* backend_ref);
|
||||
void bref_clear_state(Backend& bref, enum bref_state state);
|
||||
void bref_set_state(Backend& bref, enum bref_state state);
|
||||
|
||||
enum route_target get_shard_route_target(uint32_t qtype);
|
||||
bool change_current_db(string& dest, Shard& shard, GWBUF* buf);
|
||||
bool extract_database(GWBUF* buf, char* str);
|
||||
@ -33,21 +29,93 @@ bool detect_show_shards(GWBUF* query);
|
||||
void write_error_to_client(DCB* dcb, int errnum, const char* mysqlstate, const char* errmsg);
|
||||
|
||||
Backend::Backend(SERVER_REF *ref):
|
||||
backend(ref),
|
||||
dcb(NULL),
|
||||
map_queue(NULL),
|
||||
mapped(false),
|
||||
n_mapping_eof(0),
|
||||
num_result_wait(0),
|
||||
pending_cmd(NULL),
|
||||
state(0)
|
||||
m_backend(ref),
|
||||
m_dcb(NULL),
|
||||
m_map_queue(NULL),
|
||||
m_mapped(false),
|
||||
m_num_mapping_eof(0),
|
||||
m_num_result_wait(0),
|
||||
m_pending_cmd(NULL),
|
||||
m_state(0)
|
||||
{
|
||||
}
|
||||
|
||||
Backend::~Backend()
|
||||
{
|
||||
gwbuf_free(map_queue);
|
||||
gwbuf_free(pending_cmd);
|
||||
gwbuf_free(m_map_queue);
|
||||
gwbuf_free(m_pending_cmd);
|
||||
}
|
||||
|
||||
|
||||
bool Backend::execute_sescmd()
|
||||
{
|
||||
if (BREF_IS_CLOSED(this))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CHK_DCB(m_dcb);
|
||||
|
||||
int rc = 0;
|
||||
|
||||
/** Return if there are no pending ses commands */
|
||||
if (m_session_commands.size() == 0)
|
||||
{
|
||||
MXS_INFO("Cursor had no pending session commands.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SessionCommandList::iterator iter = m_session_commands.begin();
|
||||
GWBUF *buffer = iter->copy_buffer().release();
|
||||
|
||||
switch (iter->get_command())
|
||||
{
|
||||
case MYSQL_COM_CHANGE_USER:
|
||||
/** This makes it possible to handle replies correctly */
|
||||
gwbuf_set_type(buffer, GWBUF_TYPE_SESCMD);
|
||||
rc = m_dcb->func.auth(m_dcb, NULL, m_dcb->session, buffer);
|
||||
break;
|
||||
|
||||
case MYSQL_COM_QUERY:
|
||||
default:
|
||||
/**
|
||||
* Mark session command buffer, it triggers writing
|
||||
* MySQL command to protocol
|
||||
*/
|
||||
gwbuf_set_type(buffer, GWBUF_TYPE_SESCMD);
|
||||
rc = m_dcb->func.write(m_dcb, buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
return rc == 1;
|
||||
}
|
||||
|
||||
void Backend::clear_state(enum bref_state state)
|
||||
{
|
||||
if (state != BREF_WAITING_RESULT)
|
||||
{
|
||||
m_state &= ~state;
|
||||
}
|
||||
else
|
||||
{
|
||||
/** Decrease global operation count */
|
||||
ss_debug(int prev2 = )atomic_add(&m_backend->server->stats.n_current_ops, -1);
|
||||
ss_dassert(prev2 > 0);
|
||||
}
|
||||
}
|
||||
|
||||
void Backend::set_state(enum bref_state state)
|
||||
{
|
||||
if (state != BREF_WAITING_RESULT)
|
||||
{
|
||||
m_state |= state;
|
||||
}
|
||||
else
|
||||
{
|
||||
/** Increase global operation count */
|
||||
ss_debug(int prev2 = )atomic_add(&m_backend->server->stats.n_current_ops, 1);
|
||||
ss_dassert(prev2 >= 0);
|
||||
}
|
||||
}
|
||||
|
||||
SchemaRouterSession::SchemaRouterSession(MXS_SESSION* session, SchemaRouter* router):
|
||||
@ -131,7 +199,7 @@ void SchemaRouterSession::close()
|
||||
|
||||
for (BackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
|
||||
{
|
||||
DCB* dcb = it->dcb;
|
||||
DCB* dcb = it->m_dcb;
|
||||
/** Close those which had been connected */
|
||||
if (BREF_IS_IN_USE(it))
|
||||
{
|
||||
@ -140,16 +208,16 @@ void SchemaRouterSession::close()
|
||||
/** Clean operation counter in bref and in SERVER */
|
||||
while (BREF_IS_WAITING_RESULT(it))
|
||||
{
|
||||
bref_clear_state(*it, BREF_WAITING_RESULT);
|
||||
it->clear_state(BREF_WAITING_RESULT);
|
||||
}
|
||||
bref_clear_state(*it, BREF_IN_USE);
|
||||
bref_set_state(*it, BREF_CLOSED);
|
||||
it->clear_state(BREF_IN_USE);
|
||||
it->set_state(BREF_CLOSED);
|
||||
/**
|
||||
* closes protocol and dcb
|
||||
*/
|
||||
dcb_close(dcb);
|
||||
/** decrease server current connection counters */
|
||||
atomic_add(&it->backend->connections, -1);
|
||||
atomic_add(&it->m_backend->connections, -1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -281,7 +349,7 @@ SERVER* SchemaRouterSession::resolve_query_target(GWBUF* pPacket,
|
||||
{
|
||||
for (BackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
|
||||
{
|
||||
SERVER *server = it->backend->server;
|
||||
SERVER *server = it->m_backend->server;
|
||||
if (SERVER_IS_RUNNING(server))
|
||||
{
|
||||
route_target = TARGET_NAMED_SERVER;
|
||||
@ -443,14 +511,14 @@ int32_t SchemaRouterSession::routeQuery(GWBUF* pPacket)
|
||||
/** We know where to route this query */
|
||||
Backend *bref = get_bref_from_dcb(target_dcb);
|
||||
|
||||
MXS_INFO("Route query to \t%s:%d <", bref->backend->server->name, bref->backend->server->port);
|
||||
MXS_INFO("Route query to \t%s:%d <", bref->m_backend->server->name, bref->m_backend->server->port);
|
||||
|
||||
if (bref->session_commands.size() > 0)
|
||||
if (bref->m_session_commands.size() > 0)
|
||||
{
|
||||
/** Store current statement if execution of the previous
|
||||
* session command hasn't been completed. */
|
||||
ss_dassert((bref->pending_cmd == NULL || m_closed));
|
||||
bref->pending_cmd = pPacket;
|
||||
ss_dassert((bref->m_pending_cmd == NULL || m_closed));
|
||||
bref->m_pending_cmd = pPacket;
|
||||
ret = 1;
|
||||
}
|
||||
else if ((ret = target_dcb->func.write(target_dcb, gwbuf_clone(pPacket))) == 1)
|
||||
@ -463,8 +531,8 @@ int32_t SchemaRouterSession::routeQuery(GWBUF* pPacket)
|
||||
* Add one query response waiter to backend reference
|
||||
*/
|
||||
bref = get_bref_from_dcb(target_dcb);
|
||||
bref_set_state(*bref, BREF_QUERY_ACTIVE);
|
||||
bref_set_state(*bref, BREF_WAITING_RESULT);
|
||||
bref->set_state(BREF_QUERY_ACTIVE);
|
||||
bref->set_state(BREF_WAITING_RESULT);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -511,13 +579,13 @@ void SchemaRouterSession::handle_mapping_reply(Backend* bref, GWBUF* pPacket)
|
||||
|
||||
void SchemaRouterSession::process_response(Backend* bref, GWBUF** ppPacket)
|
||||
{
|
||||
if (bref->session_commands.size() > 0)
|
||||
if (bref->m_session_commands.size() > 0)
|
||||
{
|
||||
/** We are executing a session command */
|
||||
if (GWBUF_IS_TYPE_SESCMD_RESPONSE((*ppPacket)))
|
||||
{
|
||||
if (m_replied_sescmd < m_sent_sescmd &&
|
||||
bref->session_commands.front().get_position() == m_replied_sescmd + 1)
|
||||
bref->m_session_commands.front().get_position() == m_replied_sescmd + 1)
|
||||
{
|
||||
/** First reply to this session command, route it to the client */
|
||||
++m_replied_sescmd;
|
||||
@ -530,19 +598,19 @@ void SchemaRouterSession::process_response(Backend* bref, GWBUF** ppPacket)
|
||||
*ppPacket = NULL;
|
||||
}
|
||||
|
||||
bref->session_commands.pop_front();
|
||||
bref->m_session_commands.pop_front();
|
||||
}
|
||||
|
||||
if (*ppPacket)
|
||||
{
|
||||
bref_clear_state(*bref, BREF_WAITING_RESULT);
|
||||
bref->clear_state(BREF_WAITING_RESULT);
|
||||
}
|
||||
}
|
||||
else if (BREF_IS_QUERY_ACTIVE(bref))
|
||||
{
|
||||
bref_clear_state(*bref, BREF_QUERY_ACTIVE);
|
||||
bref->clear_state(BREF_QUERY_ACTIVE);
|
||||
/** Set response status as replied */
|
||||
bref_clear_state(*bref, BREF_WAITING_RESULT);
|
||||
bref->clear_state(BREF_WAITING_RESULT);
|
||||
}
|
||||
}
|
||||
|
||||
@ -558,7 +626,7 @@ void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
||||
|
||||
MXS_DEBUG("Reply from [%s] session [%p]"
|
||||
" mapping [%s] queries queued [%s]",
|
||||
bref->backend->server->unique_name,
|
||||
bref->m_backend->server->unique_name,
|
||||
m_client->session,
|
||||
m_state & INIT_MAPPING ? "true" : "false",
|
||||
m_queue.size() == 0 ? "none" :
|
||||
@ -597,24 +665,24 @@ void SchemaRouterSession::clientReply(GWBUF* pPacket, DCB* pDcb)
|
||||
pPacket = NULL;
|
||||
}
|
||||
|
||||
if (bref->session_commands.size() > 0)
|
||||
if (bref->m_session_commands.size() > 0)
|
||||
{
|
||||
/** There are pending session commands to be executed. */
|
||||
MXS_INFO("Backend %s:%d processed reply and starts to execute active cursor.",
|
||||
bref->backend->server->name, bref->backend->server->port);
|
||||
execute_sescmd_in_backend(*bref);
|
||||
bref->m_backend->server->name, bref->m_backend->server->port);
|
||||
bref->execute_sescmd();
|
||||
}
|
||||
else if (bref->pending_cmd) /*< non-sescmd is waiting to be routed */
|
||||
else if (bref->m_pending_cmd) /*< non-sescmd is waiting to be routed */
|
||||
{
|
||||
CHK_GWBUF(bref->pending_cmd);
|
||||
int ret = bref->dcb->func.write(bref->dcb, bref->pending_cmd);
|
||||
bref->pending_cmd = NULL;
|
||||
CHK_GWBUF(bref->m_pending_cmd);
|
||||
int ret = bref->m_dcb->func.write(bref->m_dcb, bref->m_pending_cmd);
|
||||
bref->m_pending_cmd = NULL;
|
||||
|
||||
if (ret == 1)
|
||||
{
|
||||
atomic_add(&m_router->m_stats.n_queries, 1);
|
||||
bref_set_state(*bref, BREF_QUERY_ACTIVE);
|
||||
bref_set_state(*bref, BREF_WAITING_RESULT);
|
||||
bref->set_state(BREF_QUERY_ACTIVE);
|
||||
bref->set_state(BREF_WAITING_RESULT);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -731,61 +799,6 @@ retblock:
|
||||
return succp;
|
||||
}
|
||||
|
||||
/**
|
||||
* If session command cursor is passive, sends the command to backend for
|
||||
* execution.
|
||||
*
|
||||
* Returns true if command was sent or added successfully to the queue.
|
||||
* Returns false if command sending failed or if there are no pending session
|
||||
* commands.
|
||||
*
|
||||
* Router session must be locked.
|
||||
*/
|
||||
bool SchemaRouterSession::execute_sescmd_in_backend(Backend& backend_ref)
|
||||
{
|
||||
if (BREF_IS_CLOSED(&backend_ref))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
DCB *dcb = backend_ref.dcb;
|
||||
|
||||
CHK_DCB(dcb);
|
||||
|
||||
int rc = 0;
|
||||
|
||||
/** Return if there are no pending ses commands */
|
||||
if (backend_ref.session_commands.size() == 0)
|
||||
{
|
||||
MXS_INFO("Cursor had no pending session commands.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SessionCommandList::iterator iter = backend_ref.session_commands.begin();
|
||||
GWBUF *buffer = iter->copy_buffer().release();
|
||||
|
||||
switch (iter->get_command())
|
||||
{
|
||||
case MYSQL_COM_CHANGE_USER:
|
||||
/** This makes it possible to handle replies correctly */
|
||||
gwbuf_set_type(buffer, GWBUF_TYPE_SESCMD);
|
||||
rc = dcb->func.auth(dcb, NULL, dcb->session, buffer);
|
||||
break;
|
||||
|
||||
case MYSQL_COM_QUERY:
|
||||
default:
|
||||
/**
|
||||
* Mark session command buffer, it triggers writing
|
||||
* MySQL command to protocol
|
||||
*/
|
||||
gwbuf_set_type(buffer, GWBUF_TYPE_SESCMD);
|
||||
rc = dcb->func.write(dcb, buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
return rc == 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute in backends used by current router session.
|
||||
* Save session variable commands to router session property
|
||||
@ -813,17 +826,17 @@ bool SchemaRouterSession::route_session_write(GWBUF* querybuf, uint8_t command)
|
||||
if (BREF_IS_IN_USE(it))
|
||||
{
|
||||
GWBUF *buffer = gwbuf_clone(querybuf);
|
||||
it->session_commands.push_back(SessionCommand(buffer, m_sent_sescmd));
|
||||
it->m_session_commands.push_back(SessionCommand(buffer, m_sent_sescmd));
|
||||
|
||||
if (MXS_LOG_PRIORITY_IS_ENABLED(LOG_INFO))
|
||||
{
|
||||
MXS_INFO("Route query to %s\t%s:%d",
|
||||
SERVER_IS_MASTER(it->backend->server) ? "master" : "slave",
|
||||
it->backend->server->name,
|
||||
it->backend->server->port);
|
||||
SERVER_IS_MASTER(it->m_backend->server) ? "master" : "slave",
|
||||
it->m_backend->server->name,
|
||||
it->m_backend->server->port);
|
||||
}
|
||||
|
||||
if (it->session_commands.size() == 1)
|
||||
if (it->m_session_commands.size() == 1)
|
||||
{
|
||||
/** Only one command, execute it */
|
||||
switch (command)
|
||||
@ -834,11 +847,11 @@ bool SchemaRouterSession::route_session_write(GWBUF* querybuf, uint8_t command)
|
||||
break;
|
||||
|
||||
default:
|
||||
bref_set_state(*it, BREF_WAITING_RESULT);
|
||||
it->set_state(BREF_WAITING_RESULT);
|
||||
break;
|
||||
}
|
||||
|
||||
if (execute_sescmd_in_backend(*it))
|
||||
if (it->execute_sescmd())
|
||||
{
|
||||
succp = true;
|
||||
}
|
||||
@ -846,17 +859,17 @@ bool SchemaRouterSession::route_session_write(GWBUF* querybuf, uint8_t command)
|
||||
{
|
||||
MXS_ERROR("Failed to execute session "
|
||||
"command in %s:%d",
|
||||
it->backend->server->name,
|
||||
it->backend->server->port);
|
||||
it->m_backend->server->name,
|
||||
it->m_backend->server->port);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ss_dassert(it->session_commands.size() > 1);
|
||||
ss_dassert(it->m_session_commands.size() > 1);
|
||||
/** The server is already executing a session command */
|
||||
MXS_INFO("Backend %s:%d already executing sescmd.",
|
||||
it->backend->server->name,
|
||||
it->backend->server->port);
|
||||
it->m_backend->server->name,
|
||||
it->m_backend->server->port);
|
||||
succp = true;
|
||||
}
|
||||
}
|
||||
@ -872,8 +885,8 @@ void SchemaRouterSession::handle_error_reply_client(DCB* dcb, GWBUF* errmsg)
|
||||
if (bref)
|
||||
{
|
||||
|
||||
bref_clear_state(*bref, BREF_IN_USE);
|
||||
bref_set_state(*bref, BREF_CLOSED);
|
||||
bref->clear_state(BREF_IN_USE);
|
||||
bref->set_state(BREF_CLOSED);
|
||||
}
|
||||
|
||||
if (dcb->session->state == SESSION_STATE_ROUTER_READY)
|
||||
@ -938,10 +951,10 @@ bool SchemaRouterSession::handle_error_new_connection(DCB* backend_dcb, GWBUF* e
|
||||
DCB* client_dcb;
|
||||
client_dcb = ses->client_dcb;
|
||||
client_dcb->func.write(client_dcb, gwbuf_clone(errmsg));
|
||||
bref_clear_state(*bref, BREF_WAITING_RESULT);
|
||||
bref->clear_state(BREF_WAITING_RESULT);
|
||||
}
|
||||
bref_clear_state(*bref, BREF_IN_USE);
|
||||
bref_set_state(*bref, BREF_CLOSED);
|
||||
bref->clear_state(BREF_IN_USE);
|
||||
bref->set_state(BREF_CLOSED);
|
||||
|
||||
return have_servers();
|
||||
}
|
||||
@ -960,7 +973,7 @@ Backend* SchemaRouterSession::get_bref_from_dcb(DCB* dcb)
|
||||
|
||||
for (BackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
|
||||
{
|
||||
if (it->dcb == dcb)
|
||||
if (it->m_dcb == dcb)
|
||||
{
|
||||
return &(*it);
|
||||
}
|
||||
@ -1172,28 +1185,28 @@ int SchemaRouterSession::inspect_backend_mapping_states(Backend *bref,
|
||||
|
||||
for (BackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
|
||||
{
|
||||
if (bref->dcb == it->dcb && !BREF_IS_MAPPED(it))
|
||||
if (bref->m_dcb == it->m_dcb && !BREF_IS_MAPPED(it))
|
||||
{
|
||||
if (bref->map_queue)
|
||||
if (bref->m_map_queue)
|
||||
{
|
||||
writebuf = gwbuf_append(bref->map_queue, writebuf);
|
||||
bref->map_queue = NULL;
|
||||
writebuf = gwbuf_append(bref->m_map_queue, writebuf);
|
||||
bref->m_map_queue = NULL;
|
||||
}
|
||||
enum showdb_response rc = parse_showdb_response(&(*it),
|
||||
&writebuf);
|
||||
if (rc == SHOWDB_FULL_RESPONSE)
|
||||
{
|
||||
it->mapped = true;
|
||||
it->m_mapped = true;
|
||||
MXS_DEBUG("Received SHOW DATABASES reply from %s for session %p",
|
||||
it->backend->server->unique_name,
|
||||
it->m_backend->server->unique_name,
|
||||
m_client->session);
|
||||
}
|
||||
else if (rc == SHOWDB_PARTIAL_RESPONSE)
|
||||
{
|
||||
bref->map_queue = writebuf;
|
||||
bref->m_map_queue = writebuf;
|
||||
writebuf = NULL;
|
||||
MXS_DEBUG("Received partial SHOW DATABASES reply from %s for session %p",
|
||||
it->backend->server->unique_name,
|
||||
it->m_backend->server->unique_name,
|
||||
m_client->session);
|
||||
}
|
||||
else
|
||||
@ -1246,7 +1259,7 @@ int SchemaRouterSession::inspect_backend_mapping_states(Backend *bref,
|
||||
{
|
||||
mapped = false;
|
||||
MXS_DEBUG("Still waiting for reply to SHOW DATABASES from %s for session %p",
|
||||
it->backend->server->unique_name,
|
||||
it->m_backend->server->unique_name,
|
||||
m_client->session);
|
||||
}
|
||||
}
|
||||
@ -1394,7 +1407,7 @@ char* get_lenenc_str(void* data)
|
||||
enum showdb_response SchemaRouterSession::parse_showdb_response(Backend* bref, GWBUF** buffer)
|
||||
{
|
||||
unsigned char* ptr;
|
||||
SERVER* target = bref->backend->server;
|
||||
SERVER* target = bref->m_backend->server;
|
||||
GWBUF* buf;
|
||||
bool duplicate_found = false;
|
||||
enum showdb_response rval = SHOWDB_PARTIAL_RESPONSE;
|
||||
@ -1422,7 +1435,7 @@ enum showdb_response SchemaRouterSession::parse_showdb_response(Backend* bref, G
|
||||
return SHOWDB_FATAL_ERROR;
|
||||
}
|
||||
|
||||
if (bref->n_mapping_eof == 0)
|
||||
if (bref->m_num_mapping_eof == 0)
|
||||
{
|
||||
/** Skip column definitions */
|
||||
while (ptr < (unsigned char*) buf->end && !PTR_IS_EOF(ptr))
|
||||
@ -1437,7 +1450,7 @@ enum showdb_response SchemaRouterSession::parse_showdb_response(Backend* bref, G
|
||||
return SHOWDB_FATAL_ERROR;
|
||||
}
|
||||
|
||||
atomic_add(&bref->n_mapping_eof, 1);
|
||||
atomic_add(&bref->m_num_mapping_eof, 1);
|
||||
/** Skip first EOF packet */
|
||||
ptr += gw_mysql_get_byte3(ptr) + 4;
|
||||
}
|
||||
@ -1476,16 +1489,16 @@ enum showdb_response SchemaRouterSession::parse_showdb_response(Backend* bref, G
|
||||
ptr += packetlen;
|
||||
}
|
||||
|
||||
if (ptr < (unsigned char*) buf->end && PTR_IS_EOF(ptr) && bref->n_mapping_eof == 1)
|
||||
if (ptr < (unsigned char*) buf->end && PTR_IS_EOF(ptr) && bref->m_num_mapping_eof == 1)
|
||||
{
|
||||
atomic_add(&bref->n_mapping_eof, 1);
|
||||
atomic_add(&bref->m_num_mapping_eof, 1);
|
||||
MXS_INFO("SHOW DATABASES fully received from %s.",
|
||||
bref->backend->server->unique_name);
|
||||
bref->m_backend->server->unique_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_INFO("SHOW DATABASES partially received from %s.",
|
||||
bref->backend->server->unique_name);
|
||||
bref->m_backend->server->unique_name);
|
||||
}
|
||||
|
||||
gwbuf_free(buf);
|
||||
@ -1494,7 +1507,7 @@ enum showdb_response SchemaRouterSession::parse_showdb_response(Backend* bref, G
|
||||
{
|
||||
rval = SHOWDB_DUPLICATE_DATABASES;
|
||||
}
|
||||
else if (bref->n_mapping_eof == 2)
|
||||
else if (bref->m_num_mapping_eof == 2)
|
||||
{
|
||||
rval = SHOWDB_FULL_RESPONSE;
|
||||
}
|
||||
@ -1521,8 +1534,8 @@ int SchemaRouterSession::gen_databaselist()
|
||||
|
||||
for (BackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
|
||||
{
|
||||
it->mapped = false;
|
||||
it->n_mapping_eof = 0;
|
||||
it->m_mapped = false;
|
||||
it->m_num_mapping_eof = 0;
|
||||
}
|
||||
|
||||
m_state |= INIT_MAPPING;
|
||||
@ -1541,13 +1554,13 @@ int SchemaRouterSession::gen_databaselist()
|
||||
{
|
||||
if (BREF_IS_IN_USE(it) &&
|
||||
!BREF_IS_CLOSED(it) &
|
||||
SERVER_IS_RUNNING(it->backend->server))
|
||||
SERVER_IS_RUNNING(it->m_backend->server))
|
||||
{
|
||||
clone = gwbuf_clone(buffer);
|
||||
dcb = it->dcb;
|
||||
dcb = it->m_dcb;
|
||||
rval |= !dcb->func.write(dcb, clone);
|
||||
MXS_DEBUG("Wrote SHOW DATABASES to %s for session %p: returned %d",
|
||||
it->backend->server->unique_name,
|
||||
it->m_backend->server->unique_name,
|
||||
m_client->session,
|
||||
rval);
|
||||
}
|
||||
@ -1648,11 +1661,11 @@ SERVER* SchemaRouterSession::get_shard_target(GWBUF* buffer, uint32_t qtype)
|
||||
{
|
||||
for (BackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
|
||||
{
|
||||
char *srvnm = it->backend->server->unique_name;
|
||||
char *srvnm = it->m_backend->server->unique_name;
|
||||
|
||||
if (strcmp(srvnm, (char*)buffer->hint->data) == 0)
|
||||
{
|
||||
rval = it->backend->server;
|
||||
rval = it->m_backend->server;
|
||||
MXS_INFO("Routing hint found (%s)", rval->unique_name);
|
||||
}
|
||||
}
|
||||
@ -1697,7 +1710,7 @@ bool SchemaRouterSession::get_shard_dcb(DCB** p_dcb, char* name)
|
||||
|
||||
for (BackendList::iterator it = m_backends.begin(); it != m_backends.end(); it++)
|
||||
{
|
||||
SERVER_REF* b = it->backend;
|
||||
SERVER_REF* b = it->m_backend;
|
||||
/**
|
||||
* To become chosen:
|
||||
* backend must be in use, name must match, and
|
||||
@ -1707,9 +1720,9 @@ bool SchemaRouterSession::get_shard_dcb(DCB** p_dcb, char* name)
|
||||
(strncasecmp(name, b->server->unique_name, PATH_MAX) == 0) &&
|
||||
SERVER_IS_RUNNING(b->server))
|
||||
{
|
||||
*p_dcb = it->dcb;
|
||||
*p_dcb = it->m_dcb;
|
||||
succp = true;
|
||||
ss_dassert(it->dcb->state != DCB_STATE_ZOMBIE);
|
||||
ss_dassert(it->m_dcb->state != DCB_STATE_ZOMBIE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1812,50 +1825,6 @@ bool SchemaRouterSession::send_database_list()
|
||||
return rval;
|
||||
}
|
||||
|
||||
void bref_clear_state(Backend& bref, enum bref_state state)
|
||||
{
|
||||
if (state != BREF_WAITING_RESULT)
|
||||
{
|
||||
bref.state &= ~state;
|
||||
}
|
||||
else
|
||||
{
|
||||
/** Decrease global operation count */
|
||||
int prev2 = atomic_add(&bref.backend->server->stats.n_current_ops, -1);
|
||||
ss_dassert(prev2 > 0);
|
||||
|
||||
if (prev2 <= 0)
|
||||
{
|
||||
MXS_ERROR("[%s] Error: negative current operation count in backend %s:%u",
|
||||
__FUNCTION__,
|
||||
bref.backend->server->name,
|
||||
bref.backend->server->port);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bref_set_state(Backend& bref, enum bref_state state)
|
||||
{
|
||||
if (state != BREF_WAITING_RESULT)
|
||||
{
|
||||
bref.state |= state;
|
||||
}
|
||||
else
|
||||
{
|
||||
/** Increase global operation count */
|
||||
int prev2 = atomic_add(&bref.backend->server->stats.n_current_ops, 1);
|
||||
ss_dassert(prev2 >= 0);
|
||||
|
||||
if (prev2 < 0)
|
||||
{
|
||||
MXS_ERROR("[%s] Error: negative current operation count in backend %s:%u",
|
||||
__FUNCTION__,
|
||||
bref.backend->server->name,
|
||||
bref.backend->server->port);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @node Search all RUNNING backend servers and connect
|
||||
*
|
||||
@ -1894,7 +1863,7 @@ bool connect_backend_servers(BackendList& backends, MXS_SESSION* session)
|
||||
|
||||
for (BackendList::iterator it = backends.begin(); it != backends.end(); it++)
|
||||
{
|
||||
SERVER_REF* b = it->backend;
|
||||
SERVER_REF* b = it->m_backend;
|
||||
|
||||
MXS_INFO("MaxScale connections : %d (%d) in \t%s:%d %s",
|
||||
b->connections,
|
||||
@ -1910,7 +1879,7 @@ bool connect_backend_servers(BackendList& backends, MXS_SESSION* session)
|
||||
*/
|
||||
for (BackendList::iterator it = backends.begin(); it != backends.end(); it++)
|
||||
{
|
||||
SERVER_REF* b = it->backend;
|
||||
SERVER_REF* b = it->m_backend;
|
||||
|
||||
if (SERVER_IS_RUNNING(b->server))
|
||||
{
|
||||
@ -1924,7 +1893,7 @@ bool connect_backend_servers(BackendList& backends, MXS_SESSION* session)
|
||||
/** New server connection */
|
||||
else
|
||||
{
|
||||
if ((it->dcb = dcb_connect(b->server, session, b->server->protocol)))
|
||||
if ((it->m_dcb = dcb_connect(b->server, session, b->server->protocol)))
|
||||
{
|
||||
servers_connected += 1;
|
||||
/**
|
||||
@ -1935,8 +1904,8 @@ bool connect_backend_servers(BackendList& backends, MXS_SESSION* session)
|
||||
* table.
|
||||
*/
|
||||
|
||||
it->state = 0;
|
||||
bref_set_state(*it, BREF_IN_USE);
|
||||
it->m_state = 0;
|
||||
it->set_state(BREF_IN_USE);
|
||||
/**
|
||||
* Increase backend connection counter.
|
||||
* Server's stats are _increased_ in
|
||||
@ -1968,7 +1937,7 @@ bool connect_backend_servers(BackendList& backends, MXS_SESSION* session)
|
||||
{
|
||||
for (BackendList::iterator it = backends.begin(); it != backends.end(); it++)
|
||||
{
|
||||
SERVER_REF* b = it->backend;
|
||||
SERVER_REF* b = it->m_backend;
|
||||
|
||||
if (BREF_IS_IN_USE(it))
|
||||
{
|
||||
|
@ -93,28 +93,31 @@ class Backend
|
||||
public:
|
||||
Backend(SERVER_REF *ref);
|
||||
~Backend();
|
||||
bool execute_sescmd();
|
||||
void clear_state(enum bref_state state);
|
||||
void set_state(enum bref_state state);
|
||||
|
||||
SERVER_REF* backend; /**< Backend server */
|
||||
DCB* dcb; /**< Backend DCB */
|
||||
GWBUF* map_queue;
|
||||
bool mapped; /**< Whether the backend has been mapped */
|
||||
int n_mapping_eof;
|
||||
int num_result_wait; /**< Number of not yet received results */
|
||||
GWBUF* pending_cmd; /**< Pending commands */
|
||||
int state; /**< State of the backend */
|
||||
SessionCommandList session_commands; /**< List of session commands that are
|
||||
SERVER_REF* m_backend; /**< Backend server */
|
||||
DCB* m_dcb; /**< Backend DCB */
|
||||
GWBUF* m_map_queue;
|
||||
bool m_mapped; /**< Whether the backend has been mapped */
|
||||
int m_num_mapping_eof;
|
||||
int m_num_result_wait; /**< Number of not yet received results */
|
||||
GWBUF* m_pending_cmd; /**< Pending commands */
|
||||
int m_state; /**< State of the backend */
|
||||
SessionCommandList m_session_commands; /**< List of session commands that are
|
||||
* to be executed on this backend server */
|
||||
};
|
||||
|
||||
typedef list<Backend> BackendList;
|
||||
|
||||
// TODO: Move these as member functions, currently they operate on iterators
|
||||
#define BREF_IS_NOT_USED(s) ((s)->state & ~BREF_IN_USE)
|
||||
#define BREF_IS_IN_USE(s) ((s)->state & BREF_IN_USE)
|
||||
#define BREF_IS_WAITING_RESULT(s) ((s)->num_result_wait > 0)
|
||||
#define BREF_IS_QUERY_ACTIVE(s) ((s)->state & BREF_QUERY_ACTIVE)
|
||||
#define BREF_IS_CLOSED(s) ((s)->state & BREF_CLOSED)
|
||||
#define BREF_IS_MAPPED(s) ((s)->mapped)
|
||||
#define BREF_IS_NOT_USED(s) ((s)->m_state & ~BREF_IN_USE)
|
||||
#define BREF_IS_IN_USE(s) ((s)->m_state & BREF_IN_USE)
|
||||
#define BREF_IS_WAITING_RESULT(s) ((s)->m_num_result_wait > 0)
|
||||
#define BREF_IS_QUERY_ACTIVE(s) ((s)->m_state & BREF_QUERY_ACTIVE)
|
||||
#define BREF_IS_CLOSED(s) ((s)->m_state & BREF_CLOSED)
|
||||
#define BREF_IS_MAPPED(s) ((s)->m_mapped)
|
||||
|
||||
class SchemaRouter;
|
||||
|
||||
@ -170,7 +173,6 @@ private:
|
||||
/** Internal functions */
|
||||
SERVER* get_shard_target(GWBUF* buffer, uint32_t qtype);
|
||||
Backend* get_bref_from_dcb(DCB* dcb);
|
||||
bool execute_sescmd_in_backend(Backend& backend_ref);
|
||||
bool get_shard_dcb(DCB** dcb, char* name);
|
||||
bool handle_default_db();
|
||||
bool handle_error_new_connection(DCB* backend_dcb, GWBUF* errmsg);
|
||||
|
Loading…
x
Reference in New Issue
Block a user