Fix routing of stored queries in error handler
When a session command was executed and the last slave that was executing dies, readwritesplit would route any pending queries before closing the slave connection. This could cause a hang if the routing logic decided to pick the failed server as the target of the stored query. This fixes the MXS-1323 related regression in the develop branch.
This commit is contained in:
@ -391,6 +391,7 @@ static bool handle_error_new_connection(RWSplit *inst,
|
|||||||
SRWBackend backend = get_backend_from_dcb(myrses, backend_dcb);
|
SRWBackend backend = get_backend_from_dcb(myrses, backend_dcb);
|
||||||
|
|
||||||
MXS_SESSION* ses = backend_dcb->session;
|
MXS_SESSION* ses = backend_dcb->session;
|
||||||
|
bool route_stored = false;
|
||||||
CHK_SESSION(ses);
|
CHK_SESSION(ses);
|
||||||
|
|
||||||
if (backend->is_waiting_result())
|
if (backend->is_waiting_result())
|
||||||
@ -427,18 +428,24 @@ static bool handle_error_new_connection(RWSplit *inst,
|
|||||||
|
|
||||||
if (myrses->expected_responses == 0)
|
if (myrses->expected_responses == 0)
|
||||||
{
|
{
|
||||||
/**
|
/** The response from this server was the last one, try to
|
||||||
* The response from this server was the last one, try to
|
* route all queued queries */
|
||||||
* route any stored queries
|
route_stored = true;
|
||||||
*/
|
|
||||||
route_stored_query(myrses);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Close the current connection */
|
/** Close the current connection. This needs to be done before routing any
|
||||||
|
* of the stored queries. If we route a stored query before the connection
|
||||||
|
* is closed, it's possible that the routing logic will pick the failed
|
||||||
|
* server as the target. */
|
||||||
backend->close();
|
backend->close();
|
||||||
|
|
||||||
|
if (route_stored)
|
||||||
|
{
|
||||||
|
route_stored_query(myrses);
|
||||||
|
}
|
||||||
|
|
||||||
int max_nslaves = rses_get_max_slavecount(myrses);
|
int max_nslaves = rses_get_max_slavecount(myrses);
|
||||||
bool succp;
|
bool succp;
|
||||||
/**
|
/**
|
||||||
@ -1194,7 +1201,7 @@ static void clientReply(MXS_ROUTER *instance,
|
|||||||
for (SRWBackendList::iterator it = rses->backends.begin();
|
for (SRWBackendList::iterator it = rses->backends.begin();
|
||||||
it != rses->backends.end(); it++)
|
it != rses->backends.end(); it++)
|
||||||
{
|
{
|
||||||
ss_dassert((*it)->get_reply_state() == REPLY_STATE_DONE);
|
ss_dassert((*it)->get_reply_state() == REPLY_STATE_DONE || (*it)->is_closed());
|
||||||
}
|
}
|
||||||
|
|
||||||
queue_routed = rses->query_queue != NULL;
|
queue_routed = rses->query_queue != NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user