diff --git a/server/modules/protocol/mysql_client.c b/server/modules/protocol/mysql_client.c index b0ba57aec..d6f02461c 100644 --- a/server/modules/protocol/mysql_client.c +++ b/server/modules/protocol/mysql_client.c @@ -552,15 +552,17 @@ int gw_read_client_event( */ if (dcb->dcb_readqueue) { - uint8_t* data = (uint8_t *)GWBUF_DATA(read_buffer); + uint8_t* data; - read_buffer = gwbuf_append(dcb->dcb_readqueue, read_buffer); - nbytes_read = gwbuf_length(read_buffer); + dcb->dcb_readqueue = gwbuf_append(dcb->dcb_readqueue, read_buffer); + nbytes_read = gwbuf_length(dcb->dcb_readqueue); + data = (uint8_t *)GWBUF_DATA(dcb->dcb_readqueue); if (nbytes_read < 3 || nbytes_read < MYSQL_GET_PACKET_LEN(data)) { - rc = 0; - goto return_rc; + size_t nread = MYSQL_GET_PACKET_LEN(data); + rc = 0; + goto return_rc; } else { @@ -578,7 +580,8 @@ int gw_read_client_event( if (nbytes_read < 3 || nbytes_read < MYSQL_GET_PACKET_LEN(data)+4) { - dcb->dcb_readqueue = gwbuf_append(dcb->dcb_readqueue, read_buffer); + size_t nread = MYSQL_GET_PACKET_LEN(data); + dcb->dcb_readqueue = gwbuf_append(dcb->dcb_readqueue, read_buffer); rc = 0; goto return_rc; } @@ -789,7 +792,7 @@ int gw_read_client_event( if (read_buffer != NULL) { /** add incomplete mysql packet to read queue */ - gwbuf_append(dcb->dcb_readqueue, read_buffer); + dcb->dcb_readqueue = gwbuf_append(dcb->dcb_readqueue, read_buffer); } } else @@ -1443,7 +1446,11 @@ static int route_by_statement( do { ss_dassert(GWBUF_IS_TYPE_MYSQL((*p_readbuf))); - + + /** + * Collect incoming bytes to a buffer until complete packet has + * arrived and then return the buffer. + */ packetbuf = gw_MySQL_get_next_packet(p_readbuf); if (packetbuf != NULL) diff --git a/server/modules/protocol/mysql_common.c b/server/modules/protocol/mysql_common.c index f9c0ebdea..597add165 100644 --- a/server/modules/protocol/mysql_common.c +++ b/server/modules/protocol/mysql_common.c @@ -1530,9 +1530,7 @@ GWBUF* gw_MySQL_get_next_packet( { packetbuf = NULL; goto return_packetbuf; - } - - buflen = GWBUF_LENGTH((readbuf)); + } totalbuflen = gwbuf_length(readbuf); data = (uint8_t *)GWBUF_DATA((readbuf)); packetlen = MYSQL_GET_PACKET_LEN(data)+4; @@ -1556,6 +1554,7 @@ GWBUF* gw_MySQL_get_next_packet( uint8_t* src = GWBUF_DATA((*p_readbuf)); size_t bytestocopy; + buflen = GWBUF_LENGTH((*p_readbuf)); bytestocopy = MIN(buflen,packetlen-nbytes_copied); memcpy(target+nbytes_copied, src, bytestocopy); @@ -1569,7 +1568,6 @@ return_packetbuf: return packetbuf; } - /** * Move from buffer pointed to by <*p_readbuf>. */ diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index 47e21a029..d7ba011bc 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -1949,7 +1949,7 @@ static int routeQuery( } rses_end_locked_router_action(router_cli_ses); retblock: -#if defined(SS_DEBUG) +#if defined(SS_DEBUG2) { char* canonical_query_str;