From 88dae197b07d6f72fbcf76cf4895248b82a80c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Wed, 26 Jun 2019 08:30:17 +0300 Subject: [PATCH] Make packet boundary assertion less costly mxs::Buffer::iterator is not a random-access iterator and hence will have linear cost. This is too costly to do on every packet with even moderately sized resultsets. --- server/modules/protocol/MySQL/rwbackend.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/modules/protocol/MySQL/rwbackend.cc b/server/modules/protocol/MySQL/rwbackend.cc index ed0a6518b..b444fb8df 100644 --- a/server/modules/protocol/MySQL/rwbackend.cc +++ b/server/modules/protocol/MySQL/rwbackend.cc @@ -284,6 +284,8 @@ void RWBackend::process_packets(GWBUF* result) { mxs::Buffer buffer(result); auto it = buffer.begin(); + MXB_AT_DEBUG(size_t total_len = buffer.length()); + MXB_AT_DEBUG(size_t used_len = 0); while (it != buffer.end()) { @@ -293,7 +295,8 @@ void RWBackend::process_packets(GWBUF* result) len |= (*it++) << 16; ++it; // Skip the sequence mxb_assert(it != buffer.end()); - mxb_assert(std::distance(it, buffer.end()) >= len); + mxb_assert(used_len + len < total_len); + MXB_AT_DEBUG(used_len += len); auto end = it; end.advance(len); uint8_t cmd = *it;