Dump queue contents on unexpectedly NULL buffer

When the query queue does not contain a complete packet
(i.e. modutil_get_next_MySQL_packet return NULL), an informative dump of
how many bytes and what is stored is logged.
This commit is contained in:
Markus Mäkelä
2018-07-23 13:00:02 +03:00
parent ea5c5f3a07
commit 4b7cd7a281
3 changed files with 14 additions and 5 deletions

View File

@ -403,10 +403,11 @@ extern void dprintAllBuffers(void *pdcb);
#endif #endif
/** /**
* Debug function for dumping buffer contents to INFO log * Debug function for dumping buffer contents to log
* *
* @param buffer Buffer to dump * @param buffer Buffer to dump
* @param log_level Log priority where the message is written
*/ */
void gwbuf_hexdump(GWBUF* buffer); void gwbuf_hexdump(GWBUF* buffer, int log_level);
MXS_END_DECLS MXS_END_DECLS

View File

@ -892,7 +892,7 @@ static std::string dump_one_buffer(GWBUF* buffer)
return rval; return rval;
} }
void gwbuf_hexdump(GWBUF* buffer) void gwbuf_hexdump(GWBUF* buffer, int log_level)
{ {
std::stringstream ss; std::stringstream ss;
@ -910,5 +910,5 @@ void gwbuf_hexdump(GWBUF* buffer)
n = 1024; n = 1024;
} }
MXS_INFO("%.*s", n, ss.str().c_str()); MXS_LOG_MESSAGE(log_level, "%.*s", n, ss.str().c_str());
} }

View File

@ -473,6 +473,14 @@ static bool route_stored_query(RWSplitSession *rses)
query_queue = gwbuf_make_contiguous(query_queue); query_queue = gwbuf_make_contiguous(query_queue);
ss_dassert(query_queue); ss_dassert(query_queue);
if (query_queue == NULL)
{
MXS_ALERT("Queued query unexpectedly empty. Bytes queued: %d Hexdump: ",
gwbuf_length(rses->query_queue));
gwbuf_hexdump(rses->query_queue, LOG_ALERT);
return true;
}
/** Store the query queue locally for the duration of the routeQuery call. /** Store the query queue locally for the duration of the routeQuery call.
* This prevents recursive calls into this function. */ * This prevents recursive calls into this function. */
GWBUF *temp_storage = rses->query_queue; GWBUF *temp_storage = rses->query_queue;