From 8e59f4efbd8761dcf0f5ace8c3faac470809f4e5 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Mon, 28 Jan 2019 11:09:17 +0200 Subject: [PATCH] MXS-2273 A master is a master even if it is not connectible When looking for a master, if it does exist it should be found even if it is not connectible. The fact that it is not connectible should be dealt with when a connection is created. --- .../routing/readconnroute/readconnroute.cc | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/server/modules/routing/readconnroute/readconnroute.cc b/server/modules/routing/readconnroute/readconnroute.cc index 57cb8bc12..7b4c83422 100644 --- a/server/modules/routing/readconnroute/readconnroute.cc +++ b/server/modules/routing/readconnroute/readconnroute.cc @@ -86,7 +86,7 @@ SERVER_REF* RCR::get_root_master() SERVER_REF* master_host = nullptr; for (SERVER_REF* ref = m_pService->dbref; ref; ref = ref->next) { - if (server_ref_is_active(ref) && ref->server->is_master() && ref->server->is_connectable()) + if (server_ref_is_active(ref) && ref->server->is_master()) { // No master found yet or this one has better weight. if (!master_host || ref->server_weight > master_host->server_weight) @@ -211,6 +211,8 @@ RCRSession* RCR::newSession(MXS_SESSION* session) */ SERVER_REF* master_host = get_root_master(); + bool connectable_master = master_host ? master_host->server->is_connectable() : false; + /** * Find a backend server to connect to. This is the extent of the * load balancing algorithm we need to implement for this simple @@ -242,7 +244,7 @@ RCRSession* RCR::newSession(MXS_SESSION* session) /* Check server status bits against bitvalue from router_options */ if (ref && (ref->server->status & bitmask & bitvalue)) { - if (master_host) + if (master_host && connectable_master) { if (ref == master_host && (bitvalue & (SERVER_SLAVE | SERVER_MASTER)) == SERVER_SLAVE) @@ -299,7 +301,7 @@ RCRSession* RCR::newSession(MXS_SESSION* session) */ if (!candidate) { - if (master_host) + if (master_host && connectable_master) { candidate = master_host; // Even if we had 'router_options=slave' in the configuration file, we @@ -316,11 +318,24 @@ RCRSession* RCR::newSession(MXS_SESSION* session) } else { - MXS_ERROR("Failed to create new routing session. Couldn't find eligible" - " candidate server. Freeing allocated resources."); + if (!master_host) + { + MXS_ERROR("Failed to create new routing session. Couldn't find eligible" + " candidate server. Freeing allocated resources."); + } + else + { + mxb_assert(!connectable_master); + MXS_ERROR("The only possible candidate server (%s) is being drained " + "and thus cannot be used.", master_host->server->address); + } return nullptr; } } + else + { + mxb_assert(candidate->server->is_connectable()); + } /** Open the backend connection */ DCB* backend_dcb = dcb_connect(candidate->server, session, candidate->server->protocol().c_str());