Skip parsing when in read-only transaction
As chages to the transaction state are detected by the protocol level mini-parser, there's no need to fully classify queries inside read-only transactions. This should be a good performance boost for loads that heavily use read-only transactions.
This commit is contained in:
@ -96,13 +96,26 @@ route_target_t get_target_type(RWSplitSession *rses, GWBUF *buffer,
|
|||||||
uint8_t* command, uint32_t* type, uint32_t* stmt_id)
|
uint8_t* command, uint32_t* type, uint32_t* stmt_id)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
||||||
if (gwbuf_length(buffer) > MYSQL_HEADER_LEN)
|
if (gwbuf_length(buffer) > MYSQL_HEADER_LEN)
|
||||||
{
|
{
|
||||||
*command = mxs_mysql_get_command(buffer);
|
*command = mxs_mysql_get_command(buffer);
|
||||||
*type = determine_query_type(buffer, *command);
|
|
||||||
|
|
||||||
handle_multi_temp_and_load(rses, buffer, *command, type);
|
/**
|
||||||
|
* If the session is inside a read-only transaction, we trust that the
|
||||||
|
* server acts properly even when non-read-only queries are executed.
|
||||||
|
* For this reason, we can skip the parsing of the statement completely.
|
||||||
|
*/
|
||||||
|
if (in_read_only_trx)
|
||||||
|
{
|
||||||
|
*type = QUERY_TYPE_READ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*type = determine_query_type(buffer, *command);
|
||||||
|
handle_multi_temp_and_load(rses, buffer, *command, type);
|
||||||
|
}
|
||||||
|
|
||||||
if (MXS_LOG_PRIORITY_IS_ENABLED(LOG_INFO))
|
if (MXS_LOG_PRIORITY_IS_ENABLED(LOG_INFO))
|
||||||
{
|
{
|
||||||
@ -139,7 +152,8 @@ route_target_t get_target_type(RWSplitSession *rses, GWBUF *buffer,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (*command == MXS_COM_QUERY &&
|
if (!in_read_only_trx &&
|
||||||
|
*command == MXS_COM_QUERY &&
|
||||||
qc_get_operation(buffer) == QUERY_OP_EXECUTE)
|
qc_get_operation(buffer) == QUERY_OP_EXECUTE)
|
||||||
{
|
{
|
||||||
std::string id = get_text_ps_id(buffer);
|
std::string id = get_text_ps_id(buffer);
|
||||||
|
Reference in New Issue
Block a user