Skip parsing during LOAD DATA LOCAL INFILE
The code parsed queries even when a LOAD DATA LOCAL INFILE was in progress. This caused the data to be misinterpreted as actual commands.
This commit is contained in:
@ -98,7 +98,7 @@ route_target_t get_target_type(RWSplitSession *rses, GWBUF *buffer,
|
|||||||
route_target_t route_target = TARGET_MASTER;
|
route_target_t route_target = TARGET_MASTER;
|
||||||
bool in_read_only_trx = rses->target_node && session_trx_is_read_only(rses->client_dcb->session);
|
bool in_read_only_trx = rses->target_node && session_trx_is_read_only(rses->client_dcb->session);
|
||||||
|
|
||||||
if (gwbuf_length(buffer) > MYSQL_HEADER_LEN)
|
if (gwbuf_length(buffer) > MYSQL_HEADER_LEN && rses->load_data_state != LOAD_DATA_ACTIVE)
|
||||||
{
|
{
|
||||||
*command = mxs_mysql_get_command(buffer);
|
*command = mxs_mysql_get_command(buffer);
|
||||||
|
|
||||||
@ -168,9 +168,10 @@ route_target_t get_target_type(RWSplitSession *rses, GWBUF *buffer,
|
|||||||
route_target = get_route_target(rses, *command, *type, buffer->hint);
|
route_target = get_route_target(rses, *command, *type, buffer->hint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (rses->load_data_state == LOAD_DATA_ACTIVE)
|
else if (gwbuf_length(buffer) == MYSQL_HEADER_LEN && rses->load_data_state == LOAD_DATA_ACTIVE)
|
||||||
{
|
{
|
||||||
/** Empty packet signals end of LOAD DATA LOCAL INFILE, send it to master*/
|
/** Empty packet signals end of LOAD DATA LOCAL INFILE, send it to master*/
|
||||||
|
ss_dassert(MYSQL_GET_PAYLOAD_LEN(GWBUF_DATA(buffer)) == 0);
|
||||||
rses->load_data_state = LOAD_DATA_END;
|
rses->load_data_state = LOAD_DATA_END;
|
||||||
MXS_INFO("> LOAD DATA LOCAL INFILE finished: %lu bytes sent.",
|
MXS_INFO("> LOAD DATA LOCAL INFILE finished: %lu bytes sent.",
|
||||||
rses->rses_load_data_sent + gwbuf_length(buffer));
|
rses->rses_load_data_sent + gwbuf_length(buffer));
|
||||||
@ -210,6 +211,7 @@ bool route_single_stmt(RWSplit *inst, RWSplitSession *rses, GWBUF *querybuf, con
|
|||||||
|
|
||||||
if (TARGET_IS_ALL(route_target))
|
if (TARGET_IS_ALL(route_target))
|
||||||
{
|
{
|
||||||
|
ss_dassert(rses->load_data_state != LOAD_DATA_ACTIVE);
|
||||||
// TODO: Handle payloads larger than (2^24 - 1) bytes that are routed to all servers
|
// TODO: Handle payloads larger than (2^24 - 1) bytes that are routed to all servers
|
||||||
succp = handle_target_is_all(route_target, inst, rses, querybuf, command, qtype);
|
succp = handle_target_is_all(route_target, inst, rses, querybuf, command, qtype);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user