diff --git a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc index a7dfc8131..082e2736a 100644 --- a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc +++ b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc @@ -53,6 +53,7 @@ static bool valid_for_slave(const RWBackend* backend, const RWBackend* master) PRWBackends::iterator best_score(PRWBackends& sBackends, std::function server_score) { + const double max_score = std::nexttoward(std::numeric_limits::max(), 0.0); double min {std::numeric_limits::max()}; auto best = sBackends.end(); for (auto ite = sBackends.begin(); ite != sBackends.end(); ++ite) @@ -65,6 +66,13 @@ PRWBackends::iterator best_score(PRWBackends& sBackends, score = (score + 5.0) * 1.5; } + if (score > max_score) + { + // Cap values to a maximum value. This guarantees that we choose a server from the set of + // available candidates. + score = max_score; + } + if (min > score) { min = score; @@ -72,6 +80,9 @@ PRWBackends::iterator best_score(PRWBackends& sBackends, } } + mxb_assert_message(best != sBackends.end() || sBackends.empty(), + "A candidate must be chosen if we have candidates"); + return best; }