diff --git a/server/modules/routing/readwritesplit/readwritesplit.cc b/server/modules/routing/readwritesplit/readwritesplit.cc index 9c06a667a..0b806145f 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.cc +++ b/server/modules/routing/readwritesplit/readwritesplit.cc @@ -338,10 +338,12 @@ void RWSplit::diagnostics(DCB *dcb) config().causal_read_timeout.c_str()); dcb_printf(dcb, "\tmaster_reconnection: %s\n", config().master_reconnection ? "true" : "false"); - dcb_printf(dcb, "\tquery_retry_timeout: %lu\n", - config().query_retry_timeout); - dcb_printf(dcb, "\tquery_retry_interval: %lu\n", - config().query_retry_interval); + dcb_printf(dcb, "\tdelayed_retry: %s\n", + config().delayed_retry ? "true" : "false"); + dcb_printf(dcb, "\tdelayed_retry_timeout: %lu\n", + config().delayed_retry_timeout); + dcb_printf(dcb, "\tdelayed_retry_interval: %lu\n", + config().delayed_retry_interval); dcb_printf(dcb, "\n"); @@ -415,10 +417,12 @@ json_t* RWSplit::diagnostics_json() const json_string(config().causal_read_timeout.c_str())); json_object_set_new(rval, "master_reconnection", json_boolean(config().master_reconnection)); - json_object_set_new(rval, "query_retry_timeout", - json_integer(config().query_retry_timeout)); - json_object_set_new(rval, "query_retry_interval", - json_integer(config().query_retry_interval)); + json_object_set_new(rval, "delayed_retry", + json_boolean(config().delayed_retry)); + json_object_set_new(rval, "delayed_retry_timeout", + json_integer(config().delayed_retry_timeout)); + json_object_set_new(rval, "delayed_retry_interval", + json_integer(config().delayed_retry_interval)); json_object_set_new(rval, "connections", json_integer(stats().n_sessions)); json_object_set_new(rval, "current_connections", json_integer(service()->stats.n_current)); @@ -498,8 +502,9 @@ MXS_MODULE *MXS_CREATE_MODULE() {"enable_causal_read", MXS_MODULE_PARAM_BOOL, "false"}, {"causal_read_timeout", MXS_MODULE_PARAM_STRING, "0"}, {"master_reconnection", MXS_MODULE_PARAM_BOOL, "false"}, - {"query_retry_timeout", MXS_MODULE_PARAM_COUNT, "10"}, - {"query_retry_interval", MXS_MODULE_PARAM_COUNT, "0"}, + {"delayed_retry", MXS_MODULE_PARAM_BOOL, "false"}, + {"delayed_retry_timeout", MXS_MODULE_PARAM_COUNT, "10"}, + {"delayed_retry_interval", MXS_MODULE_PARAM_COUNT, "1"}, {MXS_END_MODULE_PARAMS} } }; diff --git a/server/modules/routing/readwritesplit/readwritesplit.hh b/server/modules/routing/readwritesplit/readwritesplit.hh index 08daad02f..37a94358d 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.hh +++ b/server/modules/routing/readwritesplit/readwritesplit.hh @@ -174,8 +174,9 @@ struct Config enable_causal_read(config_get_bool(params, "enable_causal_read")), causal_read_timeout(config_get_string(params, "causal_read_timeout")), master_reconnection(config_get_bool(params, "master_reconnection")), - query_retry_timeout(config_get_integer(params, "query_retry_timeout")), - query_retry_interval(config_get_integer(params, "query_retry_interval")) + delayed_retry(config_get_bool(params, "delayed_retry")), + delayed_retry_timeout(config_get_integer(params, "delayed_retry_timeout")), + delayed_retry_interval(config_get_integer(params, "delayed_retry_interval")) { if (enable_causal_read) { @@ -203,8 +204,9 @@ struct Config bool enable_causal_read; /**< Enable causual read */ std::string causal_read_timeout; /**< Timeout, second parameter of function master_wait_gtid */ bool master_reconnection; /**< Allow changes in master server */ - uint64_t query_retry_timeout; /**< Time window in which a query can be retried */ - uint64_t query_retry_interval; /**< Time window in which a query can be retried */ + bool delayed_retry; /**< Delay routing if no target found */ + uint64_t delayed_retry_timeout; /**< How long to delay until an error is returned */ + uint64_t delayed_retry_interval; /**< How often to attepmt to route the delayed query */ }; /** diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index 9fad13acc..fda6fe619 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -241,13 +241,15 @@ bool RWSplitSession::route_single_stmt(GWBUF *querybuf, const RouteInfo& info) else if (can_retry_query()) { // Try to route the query again later - uint64_t interval = m_config.query_retry_interval; + uint64_t interval = m_config.delayed_retry_interval; MXS_SESSION* session = m_client->session; session_delay_routing(session, router_as_downstream(session), gwbuf_clone(querybuf), interval); - m_retry_duration += interval; succp = true; + // Increment by at least one to prevent infinite delay + m_retry_duration += interval > 0 ? interval : 1; + MXS_INFO("Will try to route query again in %lu seconds", interval); } } diff --git a/server/modules/routing/readwritesplit/rwsplitsession.hh b/server/modules/routing/readwritesplit/rwsplitsession.hh index 8f12798e4..d3a8b99b2 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.hh +++ b/server/modules/routing/readwritesplit/rwsplitsession.hh @@ -188,8 +188,8 @@ private: inline bool can_retry_query() const { - return m_config.query_retry_interval > 0 && - m_retry_duration < m_config.query_retry_timeout && + return m_config.delayed_retry && + m_retry_duration < m_config.delayed_retry_timeout && !session_trx_is_active(m_client->session); }