MXS-1506: Add delayed_retry parameter
By adding a boolean parameter, the feature can be enabled with sensible default values. Renamed the query_retry parameters and set the defaults to acceptable values. Added new parameters to diagnostic output. Also did some minor renaming.
This commit is contained in:
@ -338,10 +338,12 @@ void RWSplit::diagnostics(DCB *dcb)
|
|||||||
config().causal_read_timeout.c_str());
|
config().causal_read_timeout.c_str());
|
||||||
dcb_printf(dcb, "\tmaster_reconnection: %s\n",
|
dcb_printf(dcb, "\tmaster_reconnection: %s\n",
|
||||||
config().master_reconnection ? "true" : "false");
|
config().master_reconnection ? "true" : "false");
|
||||||
dcb_printf(dcb, "\tquery_retry_timeout: %lu\n",
|
dcb_printf(dcb, "\tdelayed_retry: %s\n",
|
||||||
config().query_retry_timeout);
|
config().delayed_retry ? "true" : "false");
|
||||||
dcb_printf(dcb, "\tquery_retry_interval: %lu\n",
|
dcb_printf(dcb, "\tdelayed_retry_timeout: %lu\n",
|
||||||
config().query_retry_interval);
|
config().delayed_retry_timeout);
|
||||||
|
dcb_printf(dcb, "\tdelayed_retry_interval: %lu\n",
|
||||||
|
config().delayed_retry_interval);
|
||||||
|
|
||||||
dcb_printf(dcb, "\n");
|
dcb_printf(dcb, "\n");
|
||||||
|
|
||||||
@ -415,10 +417,12 @@ json_t* RWSplit::diagnostics_json() const
|
|||||||
json_string(config().causal_read_timeout.c_str()));
|
json_string(config().causal_read_timeout.c_str()));
|
||||||
json_object_set_new(rval, "master_reconnection",
|
json_object_set_new(rval, "master_reconnection",
|
||||||
json_boolean(config().master_reconnection));
|
json_boolean(config().master_reconnection));
|
||||||
json_object_set_new(rval, "query_retry_timeout",
|
json_object_set_new(rval, "delayed_retry",
|
||||||
json_integer(config().query_retry_timeout));
|
json_boolean(config().delayed_retry));
|
||||||
json_object_set_new(rval, "query_retry_interval",
|
json_object_set_new(rval, "delayed_retry_timeout",
|
||||||
json_integer(config().query_retry_interval));
|
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, "connections", json_integer(stats().n_sessions));
|
||||||
json_object_set_new(rval, "current_connections", json_integer(service()->stats.n_current));
|
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"},
|
{"enable_causal_read", MXS_MODULE_PARAM_BOOL, "false"},
|
||||||
{"causal_read_timeout", MXS_MODULE_PARAM_STRING, "0"},
|
{"causal_read_timeout", MXS_MODULE_PARAM_STRING, "0"},
|
||||||
{"master_reconnection", MXS_MODULE_PARAM_BOOL, "false"},
|
{"master_reconnection", MXS_MODULE_PARAM_BOOL, "false"},
|
||||||
{"query_retry_timeout", MXS_MODULE_PARAM_COUNT, "10"},
|
{"delayed_retry", MXS_MODULE_PARAM_BOOL, "false"},
|
||||||
{"query_retry_interval", MXS_MODULE_PARAM_COUNT, "0"},
|
{"delayed_retry_timeout", MXS_MODULE_PARAM_COUNT, "10"},
|
||||||
|
{"delayed_retry_interval", MXS_MODULE_PARAM_COUNT, "1"},
|
||||||
{MXS_END_MODULE_PARAMS}
|
{MXS_END_MODULE_PARAMS}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -174,8 +174,9 @@ struct Config
|
|||||||
enable_causal_read(config_get_bool(params, "enable_causal_read")),
|
enable_causal_read(config_get_bool(params, "enable_causal_read")),
|
||||||
causal_read_timeout(config_get_string(params, "causal_read_timeout")),
|
causal_read_timeout(config_get_string(params, "causal_read_timeout")),
|
||||||
master_reconnection(config_get_bool(params, "master_reconnection")),
|
master_reconnection(config_get_bool(params, "master_reconnection")),
|
||||||
query_retry_timeout(config_get_integer(params, "query_retry_timeout")),
|
delayed_retry(config_get_bool(params, "delayed_retry")),
|
||||||
query_retry_interval(config_get_integer(params, "query_retry_interval"))
|
delayed_retry_timeout(config_get_integer(params, "delayed_retry_timeout")),
|
||||||
|
delayed_retry_interval(config_get_integer(params, "delayed_retry_interval"))
|
||||||
{
|
{
|
||||||
if (enable_causal_read)
|
if (enable_causal_read)
|
||||||
{
|
{
|
||||||
@ -203,8 +204,9 @@ struct Config
|
|||||||
bool enable_causal_read; /**< Enable causual read */
|
bool enable_causal_read; /**< Enable causual read */
|
||||||
std::string causal_read_timeout; /**< Timeout, second parameter of function master_wait_gtid */
|
std::string causal_read_timeout; /**< Timeout, second parameter of function master_wait_gtid */
|
||||||
bool master_reconnection; /**< Allow changes in master server */
|
bool master_reconnection; /**< Allow changes in master server */
|
||||||
uint64_t query_retry_timeout; /**< Time window in which a query can be retried */
|
bool delayed_retry; /**< Delay routing if no target found */
|
||||||
uint64_t query_retry_interval; /**< Time window in which a query can be retried */
|
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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -241,13 +241,15 @@ bool RWSplitSession::route_single_stmt(GWBUF *querybuf, const RouteInfo& info)
|
|||||||
else if (can_retry_query())
|
else if (can_retry_query())
|
||||||
{
|
{
|
||||||
// Try to route the query again later
|
// 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;
|
MXS_SESSION* session = m_client->session;
|
||||||
session_delay_routing(session, router_as_downstream(session),
|
session_delay_routing(session, router_as_downstream(session),
|
||||||
gwbuf_clone(querybuf), interval);
|
gwbuf_clone(querybuf), interval);
|
||||||
m_retry_duration += interval;
|
|
||||||
succp = true;
|
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);
|
MXS_INFO("Will try to route query again in %lu seconds", interval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,8 +188,8 @@ private:
|
|||||||
|
|
||||||
inline bool can_retry_query() const
|
inline bool can_retry_query() const
|
||||||
{
|
{
|
||||||
return m_config.query_retry_interval > 0 &&
|
return m_config.delayed_retry &&
|
||||||
m_retry_duration < m_config.query_retry_timeout &&
|
m_retry_duration < m_config.delayed_retry_timeout &&
|
||||||
!session_trx_is_active(m_client->session);
|
!session_trx_is_active(m_client->session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user