From e1e01c029c20500e040e6ac257027db7f1a7a1b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Thu, 5 Apr 2018 14:46:08 +0300 Subject: [PATCH] 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. --- include/maxscale/session.h | 2 +- server/core/session.cc | 19 +++++++++++++------ .../routing/readwritesplit/rwsplitsession.cc | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/include/maxscale/session.h b/include/maxscale/session.h index cc8a8ff30..c401fe9d3 100644 --- a/include/maxscale/session.h +++ b/include/maxscale/session.h @@ -633,7 +633,7 @@ session_dump_statements_t session_get_dump_statements(); * @param session The current Session * @param down The downstream component, either a filter or a router * @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 */ diff --git a/server/core/session.cc b/server/core/session.cc index 6e8038192..4cd016220 100644 --- a/server/core/session.cc +++ b/server/core/session.cc @@ -1394,16 +1394,23 @@ bool session_delay_routing(MXS_SESSION* session, MXS_DOWNSTREAM down, GWBUF* buf try { - std::stringstream name; - name << "Session_" << session->ses_id << "_retry"; - Worker* worker = Worker::get_current(); ss_dassert(worker == Worker::get(session->client_dcb->poll.thread.id)); std::auto_ptr task(new DelayedRoutingTask(session, down, buffer)); - std::auto_ptr 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 job(new TaskAssignment(task, worker)); + hktask_add(name.str().c_str(), delayed_routing_cb, job.release(), seconds); + } + success = true; } catch (std::bad_alloc) diff --git a/server/modules/routing/readwritesplit/rwsplitsession.cc b/server/modules/routing/readwritesplit/rwsplitsession.cc index a6a094c32..cb744c27e 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.cc +++ b/server/modules/routing/readwritesplit/rwsplitsession.cc @@ -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_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 {