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