Merge branch '2.1' into develop

This commit is contained in:
Johan Wikman
2017-04-19 18:19:13 +03:00
14 changed files with 121 additions and 81 deletions

View File

@ -386,21 +386,23 @@ int CacheFilterSession::clientReply(GWBUF* pData)
if (m_res.pData)
{
gwbuf_append(m_res.pData, pData);
m_res.length += gwbuf_length(pData); // pData may be a chain, so not GWBUF_LENGTH().
}
else
{
m_res.pData = pData;
m_res.length = gwbuf_length(pData);
}
if (m_state != CACHE_IGNORING_RESPONSE)
{
if (cache_max_resultset_size_exceeded(m_pCache->config(), gwbuf_length(m_res.pData)))
if (cache_max_resultset_size_exceeded(m_pCache->config(), m_res.length))
{
if (log_decisions())
{
MXS_NOTICE("Current size %uB of resultset, at least as much "
MXS_NOTICE("Current size %luB of resultset, at least as much "
"as maximum allowed size %luKiB. Not caching.",
gwbuf_length(m_res.pData),
m_res.length,
m_pCache->config().max_resultset_size / 1024);
}
@ -466,7 +468,8 @@ int CacheFilterSession::handle_expecting_fields()
bool insufficient = false;
size_t buflen = gwbuf_length(m_res.pData);
size_t buflen = m_res.length;
ss_dassert(m_res.length == gwbuf_length(m_res.pData));
while (!insufficient && (buflen - m_res.offset >= MYSQL_HEADER_LEN))
{
@ -528,7 +531,8 @@ int CacheFilterSession::handle_expecting_response()
int rv = 1;
size_t buflen = gwbuf_length(m_res.pData);
size_t buflen = m_res.length;
ss_dassert(m_res.length == gwbuf_length(m_res.pData));
if (buflen >= MYSQL_HEADER_LEN + 1) // We need the command byte.
{
@ -601,7 +605,8 @@ int CacheFilterSession::handle_expecting_rows()
bool insufficient = false;
size_t buflen = gwbuf_length(m_res.pData);
size_t buflen = m_res.length;
ss_dassert(m_res.length == gwbuf_length(m_res.pData));
while (!insufficient && (buflen - m_res.offset >= MYSQL_HEADER_LEN))
{
@ -661,7 +666,8 @@ int CacheFilterSession::handle_expecting_use_response()
int rv = 1;
size_t buflen = gwbuf_length(m_res.pData);
size_t buflen = m_res.length;
ss_dassert(m_res.length == gwbuf_length(m_res.pData));
if (buflen >= MYSQL_HEADER_LEN + 1) // We need the command byte.
{
@ -733,6 +739,7 @@ int CacheFilterSession::send_upstream()
void CacheFilterSession::reset_response_state()
{
m_res.pData = NULL;
m_res.length = 0;
m_res.nTotalFields = 0;
m_res.nFields = 0;
m_res.nRows = 0;

View File

@ -35,6 +35,7 @@ public:
struct CACHE_RESPONSE_STATE
{
GWBUF* pData; /**< Response data, possibly incomplete. */
size_t length; /**< Length of pData. */
size_t nTotalFields; /**< The number of fields a resultset contains. */
size_t nFields; /**< How many fields we have received, <= n_totalfields. */
size_t nRows; /**< How many rows we have received. */

View File

@ -187,6 +187,7 @@ typedef struct maxrows_response_state
size_t n_rows; /**< How many rows we have received. */
size_t offset; /**< Where we are in the response buffer. */
size_t rows_offset; /**< Offset to first row in result set */
size_t length; /**< Buffer size. */
} MAXROWS_RESPONSE_STATE;
static void maxrows_response_state_reset(MAXROWS_RESPONSE_STATE *state);
@ -354,6 +355,8 @@ static int routeQuery(MXS_FILTER *instance,
csdata->state = MAXROWS_IGNORING_RESPONSE;
csdata->large_packet = false;
csdata->discard_resultset = false;
// Set buffer size to 0
csdata->res.length = 0;
switch ((int)MYSQL_GET_COMMAND(data))
{
@ -414,23 +417,25 @@ static int clientReply(MXS_FILTER *instance,
if (csdata->res.data)
{
gwbuf_append(csdata->res.data, data);
csdata->res.length += gwbuf_length(data);
}
else
{
csdata->res.data = data;
csdata->res.length = gwbuf_length(data);
}
if (csdata->state != MAXROWS_IGNORING_RESPONSE)
{
if (!csdata->discard_resultset)
{
if (gwbuf_length(csdata->res.data) > csdata->instance->config.max_resultset_size)
if (csdata->res.length > csdata->instance->config.max_resultset_size)
{
if (csdata->instance->config.debug & MAXROWS_DEBUG_DISCARDING)
{
MXS_NOTICE("Current size %uB of resultset, at least as much "
MXS_NOTICE("Current size %luB of resultset, at least as much "
"as maximum allowed size %uKiB. Not returning data.",
gwbuf_length(csdata->res.data),
csdata->res.length,
csdata->instance->config.max_resultset_size / 1024);
}
@ -573,7 +578,7 @@ static int handle_expecting_fields(MAXROWS_SESSION_DATA *csdata)
bool insufficient = false;
size_t buflen = gwbuf_length(csdata->res.data);
size_t buflen = csdata->res.length;
while (!insufficient && (buflen - csdata->res.offset >= MYSQL_HEADER_LEN))
{
@ -650,7 +655,7 @@ static int handle_expecting_response(MAXROWS_SESSION_DATA *csdata)
ss_dassert(csdata->res.data);
int rv = 1;
size_t buflen = gwbuf_length(csdata->res.data);
size_t buflen = csdata->res.length;
// Reset field counters
csdata->res.n_fields = 0;
@ -770,7 +775,7 @@ static int handle_rows(MAXROWS_SESSION_DATA *csdata)
int rv = 1;
bool insufficient = false;
size_t buflen = gwbuf_length(csdata->res.data);
size_t buflen = csdata->res.length;
while (!insufficient && (buflen - csdata->res.offset >= MYSQL_HEADER_LEN))
{