From b3399dccc4d25d0ff16043a4b06baf201df1255f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Fri, 12 Apr 2019 16:31:43 +0300 Subject: [PATCH 1/3] Remove useless templates from RWBackend functions There's no need for templates as the code is only used with one type. Changed the code to use std::advance as that might avoid a copy of the iterator. --- server/modules/protocol/MySQL/rwbackend.cc | 25 ++++++++++++---------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/server/modules/protocol/MySQL/rwbackend.cc b/server/modules/protocol/MySQL/rwbackend.cc index cf4be4a88..df1ed5f6d 100644 --- a/server/modules/protocol/MySQL/rwbackend.cc +++ b/server/modules/protocol/MySQL/rwbackend.cc @@ -17,6 +17,8 @@ #include #include +using Iter = mxs::Buffer::iterator; + namespace maxscale { @@ -154,7 +156,6 @@ static inline bool have_next_packet(GWBUF* buffer) return gwbuf_length(buffer) > len; } -template uint64_t get_encoded_int(Iter it) { uint64_t len = *it++; @@ -190,27 +191,30 @@ uint64_t get_encoded_int(Iter it) return len; } -template Iter skip_encoded_int(Iter it) { switch (*it) { case 0xfc: - return std::next(it, 3); + std::advance(it, 3); + break; case 0xfd: - return std::next(it, 4); + std::advance(it, 4); + break; case 0xfe: - return std::next(it, 9); + std::advance(it, 9); + break; default: - return std::next(it); + break; } + + return it; } -template -uint64_t is_last_ok(Iter it) +bool is_last_ok(Iter it) { ++it; // Skip the command byte it = skip_encoded_int(it); // Affected rows @@ -220,8 +224,7 @@ uint64_t is_last_ok(Iter it) return (status & SERVER_MORE_RESULTS_EXIST) == 0; } -template -uint64_t is_last_eof(Iter it) +bool is_last_eof(Iter it) { std::advance(it, 3); // Skip the command byte and warning count uint16_t status = *it++; @@ -229,7 +232,7 @@ uint64_t is_last_eof(Iter it) return (status & SERVER_MORE_RESULTS_EXIST) == 0; } -void RWBackend::process_reply_start(mxs::Buffer::iterator it) +void RWBackend::process_reply_start(Iter it) { uint8_t cmd = *it; m_local_infile_requested = false; From f6bd9fefa4b63dad51b2fb858e6058486499e4fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Mon, 15 Apr 2019 12:07:48 +0300 Subject: [PATCH 2/3] Move assertion after error message Logging the internal state before the assertion makes it easier to figure out why the assertion failed in the first place. --- server/modules/protocol/MySQL/rwbackend.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/modules/protocol/MySQL/rwbackend.cc b/server/modules/protocol/MySQL/rwbackend.cc index df1ed5f6d..4514b2e59 100644 --- a/server/modules/protocol/MySQL/rwbackend.cc +++ b/server/modules/protocol/MySQL/rwbackend.cc @@ -303,8 +303,8 @@ void RWBackend::process_packets(GWBUF* result) case REPLY_STATE_DONE: // This should never happen - mxb_assert(!true); MXS_ERROR("Unexpected result state. cmd: 0x%02hhx, len: %u", cmd, len); + mxb_assert(!true); break; case REPLY_STATE_RSET_COLDEF: From bd54efbb3fb792cc14bc951a668ef973dd023c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Mon, 15 Apr 2019 12:18:30 +0300 Subject: [PATCH 3/3] Fix skip_encoded_int A single byte integer wasn't skipped. --- server/modules/protocol/MySQL/rwbackend.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/server/modules/protocol/MySQL/rwbackend.cc b/server/modules/protocol/MySQL/rwbackend.cc index 4514b2e59..66e82cfb2 100644 --- a/server/modules/protocol/MySQL/rwbackend.cc +++ b/server/modules/protocol/MySQL/rwbackend.cc @@ -208,6 +208,7 @@ Iter skip_encoded_int(Iter it) break; default: + std::advance(it, 1); break; }