MXS-2520: Allow master reconnection on reads

If only the master is available and a reconnection must take place, it
must be allowed to happen in all cases.
This commit is contained in:
Markus Mäkelä
2019-05-28 15:44:48 +03:00
parent 442d8bed9a
commit 81254953d1

View File

@ -660,17 +660,19 @@ SRWBackend RWSplitSession::get_slave_backend(int max_rlag)
// then feed that list to compare. // then feed that list to compare.
SRWBackendVector candidates; SRWBackendVector candidates;
auto counts = get_slave_counts(m_backends, m_current_master); auto counts = get_slave_counts(m_backends, m_current_master);
// Slaves can be taken into use if we need more slave connections
bool need_slaves = counts.second < m_router->max_slave_count();
for (auto& backend : m_backends) for (auto& backend : m_backends)
{ {
bool can_take_slave_into_use = backend->is_slave() // We can take the current master back into use even for reads
&& !backend->in_use() bool my_master = backend == m_current_master;
&& can_recover_servers() bool can_take_into_use = !backend->in_use() && can_recover_servers() && backend->can_connect();
&& backend->can_connect()
&& counts.second < m_router->max_slave_count();
bool master_or_slave = backend->is_master() || backend->is_slave(); bool master_or_slave = backend->is_master() || backend->is_slave();
bool is_usable = backend->in_use() || can_take_slave_into_use;
// The server is usable if it's already in use or it can be taken into use and we need either more
// slaves or a master.
bool is_usable = backend->in_use() || (can_take_into_use && (need_slaves || my_master));
bool rlag_ok = rpl_lag_is_ok(backend, max_rlag); bool rlag_ok = rpl_lag_is_ok(backend, max_rlag);
if (master_or_slave && is_usable) if (master_or_slave && is_usable)