From d3bfe0a7125e1f280d22ec3b06ec35fa4bfb1a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Tue, 16 Apr 2019 23:07:00 +0300 Subject: [PATCH] Fix handling of large result packets The RWBackend didn't know to skip the tail end of large packets. --- include/maxscale/protocol/rwbackend.hh | 1 + server/modules/protocol/MySQL/rwbackend.cc | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/include/maxscale/protocol/rwbackend.hh b/include/maxscale/protocol/rwbackend.hh index a13a3cb03..bbf8f0c2a 100644 --- a/include/maxscale/protocol/rwbackend.hh +++ b/include/maxscale/protocol/rwbackend.hh @@ -156,6 +156,7 @@ private: bool m_local_infile_requested; /**< Whether a LOCAL INFILE was requested */ ResponseStat m_response_stat; uint64_t m_num_coldefs = 0; + bool m_skip_next = false; inline bool is_opening_cursor() const { diff --git a/server/modules/protocol/MySQL/rwbackend.cc b/server/modules/protocol/MySQL/rwbackend.cc index 66e82cfb2..208192e8c 100644 --- a/server/modules/protocol/MySQL/rwbackend.cc +++ b/server/modules/protocol/MySQL/rwbackend.cc @@ -296,6 +296,17 @@ void RWBackend::process_packets(GWBUF* result) auto end = std::next(it, len); uint8_t cmd = *it; + // Ignore the tail end of a large packet large packet. Only resultsets can generate packets this large + // and we don't care what the contents are and thus it is safe to ignore it. + bool skip_next = m_skip_next; + m_skip_next = len == GW_MYSQL_MAX_PACKET_LEN; + + if (skip_next) + { + it = end; + continue; + } + switch (m_reply_state) { case REPLY_STATE_START: