From f97f422379c6b0fe6f5bec130a0ea80b522ed382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Tue, 26 Jun 2018 12:45:08 +0300 Subject: [PATCH] Don't use closed backends Only use backends that are still in use. The COM_STMT_EXECUTE and COM_STMT_FETCH relationship caused unused backends to be used. --- server/core/backend.cc | 3 +++ .../routing/readwritesplit/rwsplit_route_stmt.cc | 12 ++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/server/core/backend.cc b/server/core/backend.cc index 0a6f631d0..967f06130 100644 --- a/server/core/backend.cc +++ b/server/core/backend.cc @@ -196,6 +196,7 @@ bool Backend::connect(MXS_SESSION* session) bool Backend::write(GWBUF* buffer, response_type type) { + ss_dassert(in_use()); bool rval = m_dcb->func.write(m_dcb, buffer) != 0; if (rval && type == EXPECT_RESPONSE) @@ -208,6 +209,7 @@ bool Backend::write(GWBUF* buffer, response_type type) bool Backend::auth(GWBUF* buffer) { + ss_dassert(in_use()); bool rval = false; if (m_dcb->func.auth(m_dcb, NULL, m_dcb->session, buffer) == 1) @@ -232,6 +234,7 @@ void Backend::store_command(GWBUF* buffer) bool Backend::write_stored_command() { + ss_dassert(in_use()); bool rval = false; if (m_pending_cmd.length()) diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index 75e2cdc81..649d76e86 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -999,8 +999,15 @@ SRWBackend handle_slave_is_target(RWSplit *inst, RWSplitSession *rses, if (it != rses->exec_map.end()) { - target = it->second; - MXS_INFO("COM_STMT_FETCH on %s", target->uri()); + if (it->second->in_use()) + { + target = it->second; + MXS_INFO("COM_STMT_FETCH on %s", target->uri()); + } + else + { + MXS_INFO("Old target not in use, cannot proceed"); + } } else { @@ -1016,6 +1023,7 @@ SRWBackend handle_slave_is_target(RWSplit *inst, RWSplitSession *rses, if (target) { atomic_add_uint64(&inst->stats().n_slave, 1); + ss_dassert(target->in_use()); } else {