From 3eac28248dd979abaaa7fae9bd8191e8f0ea16a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Wed, 21 Jun 2017 13:54:30 +0300 Subject: [PATCH] MXS-852: Store prepared statement handles in RWBackend The readwritesplit Backend implementation maps the returned PS handles to session command identifiers. This allows the handles to be retrieven later on when the prepared statements are executed. --- .../routing/readwritesplit/readwritesplit.hh | 26 +++++++++++++++++-- .../readwritesplit/rwsplit_session_cmd.cc | 11 ++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/server/modules/routing/readwritesplit/readwritesplit.hh b/server/modules/routing/readwritesplit/readwritesplit.hh index 0660dd28f..af0e0ae91 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.hh +++ b/server/modules/routing/readwritesplit/readwritesplit.hh @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -117,8 +118,8 @@ enum ld_state (SERVER_IS_SLAVE((b)->backend_server) ? BE_SLAVE : BE_UNDEFINED)); /** Reply state change debug logging */ -#define LOG_RS(a, b) MXS_DEBUG("[%s]:%d %s -> %s", (a)->server()->name, \ - (a)->server()->port, rstostr((a)->get_reply_state()), rstostr(b)); +#define LOG_RS(a, b) MXS_INFO("%s %s -> %s", (a)->uri(), \ + rstostr((a)->get_reply_state()), rstostr(b)); struct ROUTER_INSTANCE; struct ROUTER_CLIENT_SES; @@ -153,6 +154,8 @@ struct rwsplit_config_t * been idle for too long */ }; +typedef std::map HandleMap; + class RWBackend: public mxs::Backend { RWBackend(const RWBackend&); @@ -191,8 +194,27 @@ public: return rval; } + void add_ps_handle(uint64_t id, uint32_t handle) + { + m_ps_handles[id] = handle; + MXS_INFO("PS response for %s: %lu -> %u", name(), id, handle); + } + + uint32_t get_ps_handle(uint64_t id) const + { + HandleMap::const_iterator it = m_ps_handles.find(id); + + if (it != m_ps_handles.end()) + { + return it->second; + } + + return 0; + } + private: reply_state_t m_reply_state; + HandleMap m_ps_handles; }; typedef std::tr1::shared_ptr SRWBackend; diff --git a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc index 9b7a79910..84992e2a5 100644 --- a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc +++ b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc @@ -36,8 +36,19 @@ void process_sescmd_response(ROUTER_CLIENT_SES* rses, SRWBackend& backend, { uint8_t cmd; gwbuf_copy_data(*ppPacket, MYSQL_HEADER_LEN, 1, &cmd); + uint8_t command = backend->next_session_command()->get_command(); uint64_t id = backend->complete_session_command(); + if (command == MYSQL_COM_STMT_PREPARE) + { + MXS_PS_RESPONSE resp; + + if (mxs_mysql_extract_ps_response(*ppPacket, &resp)) + { + backend->add_ps_handle(id, resp.id); + } + } + if (rses->recv_sescmd < rses->sent_sescmd && id == rses->recv_sescmd + 1 && (!rses->current_master || // Session doesn't have a master