MXS-1506: Allow immediate query re-routing

Now that the readwritesplit uses the same mechanism for both
retry_failed_reads and delayed query retries, the re-routing function
should accept a delay of 0 seconds. This makes the mechanism more suitable
for other uses e.g. delaying of queries in filters.
This commit is contained in:
Markus Mäkelä
2018-04-05 14:46:08 +03:00
parent 450b31dd8c
commit e1e01c029c
3 changed files with 15 additions and 8 deletions

View File

@ -633,7 +633,7 @@ session_dump_statements_t session_get_dump_statements();
* @param session The current Session * @param session The current Session
* @param down The downstream component, either a filter or a router * @param down The downstream component, either a filter or a router
* @param buffer The buffer to route * @param buffer The buffer to route
* @param seconds Number of seconds to wait before routing the query * @param seconds Number of seconds to wait before routing the query. Use 0 for immediate re-routing.
* *
* @return True if queuing of the query was successful * @return True if queuing of the query was successful
*/ */

View File

@ -1394,16 +1394,23 @@ bool session_delay_routing(MXS_SESSION* session, MXS_DOWNSTREAM down, GWBUF* buf
try try
{ {
std::stringstream name;
name << "Session_" << session->ses_id << "_retry";
Worker* worker = Worker::get_current(); Worker* worker = Worker::get_current();
ss_dassert(worker == Worker::get(session->client_dcb->poll.thread.id)); ss_dassert(worker == Worker::get(session->client_dcb->poll.thread.id));
std::auto_ptr<DelayedRoutingTask> task(new DelayedRoutingTask(session, down, buffer)); std::auto_ptr<DelayedRoutingTask> task(new DelayedRoutingTask(session, down, buffer));
std::auto_ptr<TaskAssignment> job(new TaskAssignment(task, worker));
TaskAssignment* pJob = job.release();
hktask_add(name.str().c_str(), delayed_routing_cb, pJob, seconds); if (seconds == 0)
{
// No actual delay, just re-route query
worker->post(task);
}
else
{
std::stringstream name;
name << "Session_" << session->ses_id << "_retry";
std::auto_ptr<TaskAssignment> job(new TaskAssignment(task, worker));
hktask_add(name.str().c_str(), delayed_routing_cb, job.release(), seconds);
}
success = true; success = true;
} }
catch (std::bad_alloc) catch (std::bad_alloc)

View File

@ -615,7 +615,7 @@ bool RWSplitSession::handle_error_new_connection(DCB *backend_dcb, GWBUF *errmsg
{ {
MXS_INFO("Re-routing failed read after server '%s' failed", backend->name()); MXS_INFO("Re-routing failed read after server '%s' failed", backend->name());
MXS_SESSION* session = m_client->session; MXS_SESSION* session = m_client->session;
session_delay_routing(session, router_as_downstream(session), stored, 1); session_delay_routing(session, router_as_downstream(session), stored, 0);
} }
else else
{ {