From fa13b8036a7e5719b46f26b515c4395c28a1b504 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Mon, 5 Nov 2018 16:12:10 +0200 Subject: [PATCH] MXS-1780 Store last statement as cloned GWBUF The last statements of a session are now stored as a cloned GWBUF instead of as a copy of the SQL. --- server/core/internal/session.hh | 3 ++- server/core/session.cc | 37 +++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/server/core/internal/session.hh b/server/core/internal/session.hh index 6eb806bf7..105ca4ca5 100644 --- a/server/core/internal/session.hh +++ b/server/core/internal/session.hh @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -38,7 +39,7 @@ typedef struct SESSION_VARIABLE } SESSION_VARIABLE; typedef std::unordered_map SessionVarsByName; -typedef std::deque> SessionStmtQueue; +typedef std::deque> SessionStmtQueue; typedef std::unordered_set DCBSet; // Class that holds the session specific filter data diff --git a/server/core/session.cc b/server/core/session.cc index 8b9e37d9f..2c9eee259 100644 --- a/server/core/session.cc +++ b/server/core/session.cc @@ -26,19 +26,20 @@ #include #include -#include #include +#include #include #include #include +#include #include +#include #include #include +#include #include #include -#include #include -#include #include "internal/dcb.h" #include "internal/filter.hh" @@ -1197,15 +1198,29 @@ void Session::dump_statements() const if ((id != 0) && (id != ses_id)) { MXS_WARNING("Current session is %" PRIu64 ", yet statements are dumped for %" PRIu64 ". " - "The session id in the subsequent dumped statements is the wrong one.", + "The session id in the subsequent dumped statements is the wrong one.", id, ses_id); } for (auto i = m_last_statements.rbegin(); i != m_last_statements.rend(); ++i) { - int len = i->size(); - const char* pStmt = (char*)&i->front(); + std::shared_ptr sBuffer = *i; + GWBUF* pBuffer = sBuffer.get(); + + mxb_assert(modutil_is_SQL(pBuffer)); + + char* pStmt; + int len; + + if (GWBUF_IS_CONTIGUOUS(pBuffer)) + { + modutil_extract_SQL(pBuffer, &pStmt, &len); + } + else + { + pStmt = modutil_get_SQL(pBuffer); + } if (id != 0) { @@ -1219,6 +1234,11 @@ void Session::dump_statements() const MXS_NOTICE("(%" PRIu64 ") Stmt %d: %.*s", ses_id, n, len, pStmt); } + if (!GWBUF_IS_CONTIGUOUS(pBuffer)) + { + MXS_FREE(pStmt); + } + --n; } } @@ -1398,10 +1418,9 @@ void Session::retain_statement(GWBUF* pBuffer) m_last_statements.pop_back(); } - std::vector stmt(len - MYSQL_HEADER_LEN - 1); - gwbuf_copy_data(pBuffer, MYSQL_HEADER_LEN + 1, len - (MYSQL_HEADER_LEN + 1), &stmt.front()); + std::shared_ptr sBuffer(gwbuf_clone(pBuffer)); - m_last_statements.push_front(stmt); + m_last_statements.push_front(sBuffer); } } }