diff --git a/server/core/session_command.cc b/server/core/session_command.cc index 836a818bb..08e9b1223 100644 --- a/server/core/session_command.cc +++ b/server/core/session_command.cc @@ -71,6 +71,11 @@ std::string SessionCommand::to_string() /** TODO: Create C++ versions of modutil functions */ GWBUF *buf = m_buffer.release(); + if (!GWBUF_IS_CONTIGUOUS(buf)) + { + buf = gwbuf_make_contiguous(buf); + } + if (modutil_extract_SQL(buf, &sql, &sql_len)) { str.append(sql, sql_len); diff --git a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc index 48463ba15..0e6cbf3c7 100644 --- a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc +++ b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc @@ -55,16 +55,20 @@ static std::string extract_error(GWBUF* buffer) * * @return True if the responses were different and connection was discarded */ -static bool discard_if_response_differs(SRWBackend backend, uint8_t master_cmd, uint8_t slave_cmd) +static bool discard_if_response_differs(SRWBackend backend, uint8_t master_response, + uint8_t slave_response, mxs::SSessionCommand sescmd) { bool rval = false; - if (master_cmd != slave_cmd) + if (master_response != slave_response) { + uint8_t cmd = sescmd->get_command(); + std::string query = sescmd->to_string(); MXS_WARNING("Slave server '%s': response (0x%02hhx) differs " - "from master's response(0x%02hhx). Closing slave " - "connection due to inconsistent session state.", - backend->name(), slave_cmd, master_cmd); + "from master's response (0x%02hhx) to %s: `%s`. " + "Closing slave connection due to inconsistent session state.", + backend->name(), slave_response, master_response, STRPACKETTYPE(cmd), + query.empty() ? "" : query.c_str()); backend->close(mxs::Backend::CLOSE_FATAL); rval = true; } @@ -83,6 +87,7 @@ void process_sescmd_response(RWSplitSession* rses, SRWBackend& backend, uint8_t cmd; gwbuf_copy_data(*ppPacket, MYSQL_HEADER_LEN, 1, &cmd); uint8_t command = backend->next_session_command()->get_command(); + mxs::SSessionCommand sescmd = backend->next_session_command(); uint64_t id = backend->complete_session_command(); MXS_PS_RESPONSE resp = {}; bool discard = true; @@ -124,7 +129,7 @@ void process_sescmd_response(RWSplitSession* rses, SRWBackend& backend, for (SlaveResponseList::iterator it = rses->slave_responses.begin(); it != rses->slave_responses.end(); it++) { - if (discard_if_response_differs(it->first, cmd, it->second)) + if (discard_if_response_differs(it->first, cmd, it->second, sescmd)) { *pReconnect = true; } @@ -139,7 +144,7 @@ void process_sescmd_response(RWSplitSession* rses, SRWBackend& backend, rses->slave_responses.push_back(std::make_pair(backend, cmd)); } } - else if (discard_if_response_differs(backend, rses->sescmd_responses[id], cmd)) + else if (discard_if_response_differs(backend, rses->sescmd_responses[id], cmd, sescmd)) { *pReconnect = true; }