From f124e388fa5deece35bf7e4ab1997c9b98911286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Sun, 8 Apr 2018 08:20:20 +0300 Subject: [PATCH] MXS-1506: Fix handle_causal_read_reply The function did not return the changed buffer to the caller of the function. --- .../routing/readwritesplit/rwsplitsession.cc | 66 ++++++++----------- .../routing/readwritesplit/rwsplitsession.hh | 2 +- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/server/modules/routing/readwritesplit/rwsplitsession.cc b/server/modules/routing/readwritesplit/rwsplitsession.cc index f9fc46e47..058416f50 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.cc +++ b/server/modules/routing/readwritesplit/rwsplitsession.cc @@ -281,19 +281,15 @@ SRWBackend& RWSplitSession::get_backend_from_dcb(DCB *dcb) */ void RWSplitSession::correct_packet_sequence(GWBUF *buffer) { - if (m_wait_gtid_state == EXPECTING_REAL_RESULT) - { - uint8_t header[3]; - uint32_t offset = 0; + uint8_t header[3]; + uint32_t offset = 0; - while (gwbuf_copy_data(buffer, offset, 3, header) == 3) - { - uint32_t packet_len = MYSQL_GET_PAYLOAD_LEN(header) + MYSQL_HEADER_LEN; - uint8_t *seq = gwbuf_byte_pointer(buffer, offset + MYSQL_SEQ_OFFSET); - *seq = m_next_seq; - m_next_seq++; - offset += packet_len; - } + while (gwbuf_copy_data(buffer, offset, 3, header) == 3) + { + uint32_t packet_len = MYSQL_GET_PAYLOAD_LEN(header) + MYSQL_HEADER_LEN; + uint8_t *seq = gwbuf_byte_pointer(buffer, offset + MYSQL_SEQ_OFFSET); + *seq = m_next_seq++; + offset += packet_len; } } @@ -331,36 +327,32 @@ static void log_unexpected_response(DCB* dcb, GWBUF* buffer) } } -bool RWSplitSession::handle_causal_read_reply(GWBUF *writebuf, SRWBackend& backend) +GWBUF* RWSplitSession::handle_causal_read_reply(GWBUF *writebuf, SRWBackend& backend) { - bool rval = true; - - if (m_config.enable_causal_read && - GWBUF_IS_REPLY_OK(writebuf) && - backend == m_current_master) + if (m_config.enable_causal_read) { - /** Save gtid position */ - char *tmp = gwbuf_get_property(writebuf, (char *)"gtid"); - if (tmp) + if (GWBUF_IS_REPLY_OK(writebuf) && backend == m_current_master) { - m_gtid_pos = std::string(tmp); + /** Save gtid position */ + char *tmp = gwbuf_get_property(writebuf, (char *)"gtid"); + if (tmp) + { + m_gtid_pos = std::string(tmp); + } + } + + if (m_wait_gtid_state == EXPECTING_WAIT_GTID_RESULT) + { + writebuf = discard_master_wait_gtid_result(writebuf); + } + + if (writebuf && m_wait_gtid_state == EXPECTING_REAL_RESULT) + { + correct_packet_sequence(writebuf); } } - if (m_wait_gtid_state == EXPECTING_WAIT_GTID_RESULT) - { - if ((writebuf = discard_master_wait_gtid_result(writebuf)) == NULL) - { - rval = false; - } - } - - if (rval && m_wait_gtid_state == EXPECTING_REAL_RESULT) - { - correct_packet_sequence(writebuf); - } - - return rval; + return writebuf; } void RWSplitSession::clientReply(GWBUF *writebuf, DCB *backend_dcb) @@ -369,7 +361,7 @@ void RWSplitSession::clientReply(GWBUF *writebuf, DCB *backend_dcb) SRWBackend& backend = get_backend_from_dcb(backend_dcb); - if (!handle_causal_read_reply(writebuf, backend)) + if ((writebuf = handle_causal_read_reply(writebuf, backend)) == NULL) { return; // Nothing to route, return } diff --git a/server/modules/routing/readwritesplit/rwsplitsession.hh b/server/modules/routing/readwritesplit/rwsplitsession.hh index 579c8fb55..524f87dfe 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.hh +++ b/server/modules/routing/readwritesplit/rwsplitsession.hh @@ -161,7 +161,7 @@ private: void log_master_routing_failure(bool found, mxs::SRWBackend& old_master, mxs::SRWBackend& curr_master); - bool handle_causal_read_reply(GWBUF *writebuf, mxs::SRWBackend& backend); + GWBUF* handle_causal_read_reply(GWBUF *writebuf, mxs::SRWBackend& backend); GWBUF* add_prefix_wait_gtid(SERVER *server, GWBUF *origin); void correct_packet_sequence(GWBUF *buffer); GWBUF* discard_master_wait_gtid_result(GWBUF *buffer);