From e5d9ca4af89888e7fd6b1949428710a6695f43dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Mon, 8 Jan 2018 10:55:32 +0200 Subject: [PATCH] Check if master reference is disabled If a Backend is closed, the associated DCB is no longer valid. This needs to be taken into account when the stored master reference is used. --- server/modules/routing/readwritesplit/readwritesplit.cc | 3 ++- .../modules/routing/readwritesplit/rwsplit_route_stmt.cc | 8 ++++---- .../modules/routing/readwritesplit/rwsplit_session_cmd.cc | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/server/modules/routing/readwritesplit/readwritesplit.cc b/server/modules/routing/readwritesplit/readwritesplit.cc index 74dedc688..9ba761a2c 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.cc +++ b/server/modules/routing/readwritesplit/readwritesplit.cc @@ -1294,7 +1294,8 @@ static void handleError(MXS_ROUTER *instance, { case ERRACT_NEW_CONNECTION: { - if (rses->current_master && rses->current_master->dcb() == problem_dcb) + if (rses->current_master && rses->current_master->in_use() && + rses->current_master->dcb() == problem_dcb) { /** The connection to the master has failed */ SERVER *srv = rses->current_master->server(); diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index ffab194a2..95dbf8fe0 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -778,7 +778,7 @@ handle_multi_temp_and_load(RWSplitSession *rses, GWBUF *querybuf, (check_for_multi_stmt(querybuf, rses->client_dcb->protocol, packet_type) || check_for_sp_call(querybuf, packet_type))) { - if (rses->current_master) + if (rses->current_master && rses->current_master->in_use()) { rses->target_node = rses->current_master; MXS_INFO("Multi-statement query or stored procedure call, routing " @@ -989,7 +989,7 @@ SRWBackend handle_slave_is_target(RWSplit *inst, RWSplitSession *rses, static void log_master_routing_failure(RWSplitSession *rses, bool found, SRWBackend& old_master, SRWBackend& curr_master) { - ss_dassert(!old_master || old_master->dcb()->dcb_role == DCB_ROLE_BACKEND_HANDLER); + ss_dassert(!old_master || !old_master->in_use() || old_master->dcb()->dcb_role == DCB_ROLE_BACKEND_HANDLER); ss_dassert(!curr_master || curr_master->dcb()->dcb_role == DCB_ROLE_BACKEND_HANDLER); char errmsg[MAX_SERVER_ADDRESS_LEN * 2 + 100]; // Extra space for error message @@ -997,7 +997,7 @@ static void log_master_routing_failure(RWSplitSession *rses, bool found, { sprintf(errmsg, "Could not find a valid master connection"); } - else if (old_master && curr_master) + else if (old_master && curr_master && old_master->in_use()) { /** We found a master but it's not the same connection */ ss_dassert(old_master != curr_master); @@ -1016,7 +1016,7 @@ static void log_master_routing_failure(RWSplitSession *rses, bool found, curr_master->name()); } } - else if (old_master) + else if (old_master && old_master->in_use()) { /** We have an original master connection but we couldn't find it */ sprintf(errmsg, "The connection to master server '%s' is not available", diff --git a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc index 76119b975..5f21895f0 100644 --- a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc +++ b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc @@ -50,7 +50,7 @@ void process_sescmd_response(RWSplitSession* rses, SRWBackend& backend, if (rses->recv_sescmd < rses->sent_sescmd && id == rses->recv_sescmd + 1 && - (!rses->current_master || // Session doesn't have a master + (!rses->current_master || !rses->current_master->in_use() || // Session doesn't have a master rses->current_master == backend)) // This is the master's response { /** First reply to this session command, route it to the client */