add session tracker:SESSION_TRACK_TRANSACTION_CHARACTERISTICS and fix wrong state mapping

This commit is contained in:
Dapeng Huang
2018-01-16 13:44:13 +08:00
parent 6d3c60eb28
commit a52e1ac8d7
4 changed files with 41 additions and 25 deletions

View File

@ -214,6 +214,7 @@ const char *config_service_params[] =
CN_WEIGHTBY, CN_WEIGHTBY,
CN_LOG_AUTH_WARNINGS, CN_LOG_AUTH_WARNINGS,
CN_RETRY_ON_FAILURE, CN_RETRY_ON_FAILURE,
CN_SESSION_TRACK_TRX_STATE,
NULL NULL
}; };

View File

@ -755,9 +755,6 @@ gw_read_and_write(DCB *dcb)
bool result_collected = false; bool result_collected = false;
MySQLProtocol *proto = (MySQLProtocol *)dcb->protocol; MySQLProtocol *proto = (MySQLProtocol *)dcb->protocol;
/** Get sesion track info from ok packet and save it to gwbuf properties */
mxs_mysql_get_session_track_info(read_buffer, proto->server_capabilities);
if (rcap_type_required(capabilities, RCAP_TYPE_PACKET_OUTPUT) || if (rcap_type_required(capabilities, RCAP_TYPE_PACKET_OUTPUT) ||
rcap_type_required(capabilities, RCAP_TYPE_CONTIGUOUS_OUTPUT) || rcap_type_required(capabilities, RCAP_TYPE_CONTIGUOUS_OUTPUT) ||
proto->ignore_replies != 0) proto->ignore_replies != 0)
@ -773,6 +770,9 @@ gw_read_and_write(DCB *dcb)
return 0; return 0;
} }
/** Get sesion track info from ok packet and save it to gwbuf properties */
mxs_mysql_get_session_track_info(tmp, proto->server_capabilities);
read_buffer = tmp; read_buffer = tmp;
if (rcap_type_required(capabilities, RCAP_TYPE_CONTIGUOUS_OUTPUT) || if (rcap_type_required(capabilities, RCAP_TYPE_CONTIGUOUS_OUTPUT) ||

View File

@ -1894,17 +1894,18 @@ static bool parse_kill_query(char *query, uint64_t *thread_id_out, kill_type_t *
} }
/* /*
* Mapping two session tracker's info to mxs_session_trx_state_t * Mapping three session tracker's info to mxs_session_trx_state_t
* SESSION_TRACK_STATE_CHANGE: * SESSION_TRACK_STATE_CHANGE:
* When session variable autocommit is changed, it will give a latest value {0|1} * Get lasted autocommit value;
* https://dev.mysql.com/worklog/task/?id=6885
* SESSION_TRACK_TRANSACTION_TYPE: * SESSION_TRACK_TRANSACTION_TYPE:
* Get transaction boundaries
* TX_EMPTY => SESSION_TRX_INACTIVE * TX_EMPTY => SESSION_TRX_INACTIVE
* TX_WRITE_TRX => SESSION_TRX_READ_WRITE
* TX_READ_TRX => SESSION_TRX_READ_ONLY
* TX_EXPLICIT | TX_IMPLICIT => SESSION_TRX_ACTIVE * TX_EXPLICIT | TX_IMPLICIT => SESSION_TRX_ACTIVE
* refs: * https://dev.mysql.com/worklog/task/?id=6885
* 1. https://dev.mysql.com/worklog/task/?id=6885 * SESSION_TRACK_TRANSACTION_CHARACTERISTICS
* 2. https://dev.mysql.com/worklog/task/?id=6631 * Get trx characteristics such as read only, read write, snapshot ...
*
*/ */
static void parse_and_set_trx_state(MXS_SESSION *ses, GWBUF *data) static void parse_and_set_trx_state(MXS_SESSION *ses, GWBUF *data)
{ {
@ -1912,11 +1913,12 @@ static void parse_and_set_trx_state(MXS_SESSION *ses, GWBUF *data)
if (autocommit) if (autocommit)
{ {
if (strncasecmp(autocommit, "0", 1) == 0) MXS_DEBUG("autocommit:%s", autocommit);
if (strncasecmp(autocommit, "ON", 2) == 0)
{ {
session_set_autocommit(ses, true); session_set_autocommit(ses, true);
} }
if (strncasecmp(autocommit, "1", 1) == 0) if (strncasecmp(autocommit, "OFF", 3) == 0)
{ {
session_set_autocommit(ses, false); session_set_autocommit(ses, false);
} }
@ -1925,23 +1927,29 @@ static void parse_and_set_trx_state(MXS_SESSION *ses, GWBUF *data)
if (trx_state) if (trx_state)
{ {
mysql_tx_state_t s = parse_trx_state(trx_state); mysql_tx_state_t s = parse_trx_state(trx_state);
MXS_DEBUG("parsed tx state:%d", s);
if (s == TX_EMPTY) if (s == TX_EMPTY)
{ {
session_set_trx_state(ses, SESSION_TRX_INACTIVE); session_set_trx_state(ses, SESSION_TRX_INACTIVE);
} }
else if (s & TX_READ_TRX)
{
session_set_trx_state(ses, SESSION_TRX_READ_ONLY);
}
else if (s & TX_WRITE_TRX)
{
session_set_trx_state(ses, SESSION_TRX_READ_WRITE);
}
else if ((s & TX_EXPLICIT) || (s & TX_IMPLICIT)) else if ((s & TX_EXPLICIT) || (s & TX_IMPLICIT))
{ {
session_set_trx_state(ses, SESSION_TRX_ACTIVE); session_set_trx_state(ses, SESSION_TRX_ACTIVE);
} }
} }
char *trx_characteristics = gwbuf_get_property(data, (char *)"trx_characteristics");
if (trx_characteristics)
{
if (strncmp(trx_characteristics, "START TRANSACTION READ ONLY;", 28) == 0)
{
session_set_trx_state(ses, SESSION_TRX_READ_ONLY);
}
if (strncmp(trx_characteristics, "START TRANSACTION READ WRITE;", 29) == 0)
{
session_set_trx_state(ses, SESSION_TRX_READ_WRITE);
}
}
MXS_DEBUG("trx state:%s", session_trx_state_to_string(ses->trx_state));
MXS_DEBUG("autcommit:%s", session_is_autocommit(ses)?"ON":"OFF");
} }

View File

@ -1777,6 +1777,7 @@ void mxs_mysql_execute_kill_user(MXS_SESSION* issuer, const char* user, kill_typ
*/ */
void mxs_mysql_get_session_track_info(GWBUF *buff, uint32_t server_capabilities) void mxs_mysql_get_session_track_info(GWBUF *buff, uint32_t server_capabilities)
{ {
ss_dassert(buff);
char *trx_info, *var_name, *var_value; char *trx_info, *var_name, *var_value;
size_t len = GWBUF_LENGTH(buff); size_t len = GWBUF_LENGTH(buff);
uint8_t local_buf[len]; uint8_t local_buf[len];
@ -1809,18 +1810,24 @@ void mxs_mysql_get_session_track_info(GWBUF *buff, uint32_t server_capabilities)
enum_session_state_type type = (enum enum_session_state_type)mxs_leint_consume(&ptr); enum_session_state_type type = (enum enum_session_state_type)mxs_leint_consume(&ptr);
switch (type) switch (type)
{ {
case SESSION_TRACK_SYSTEM_VARIABLES: case SESSION_TRACK_STATE_CHANGE:
case SESSION_TRACK_SCHEMA: case SESSION_TRACK_SCHEMA:
case SESSION_TRACK_GTIDS: case SESSION_TRACK_GTIDS:
case SESSION_TRACK_TRANSACTION_CHARACTERISTICS:
ptr += mxs_leint_consume(&ptr); ptr += mxs_leint_consume(&ptr);
break; break;
case SESSION_TRACK_STATE_CHANGE: case SESSION_TRACK_TRANSACTION_CHARACTERISTICS:
mxs_leint_consume(&ptr); //length
var_value = mxs_lestr_consume_dup(&ptr);
gwbuf_add_property(buff, (char *)"trx_characteristics", var_value);
MXS_FREE(var_value);
break;
case SESSION_TRACK_SYSTEM_VARIABLES:
mxs_leint_consume(&ptr); //lenth mxs_leint_consume(&ptr); //lenth
// system variables like autocommit, schema, charset ... // system variables like autocommit, schema, charset ...
var_name = mxs_lestr_consume_dup(&ptr); var_name = mxs_lestr_consume_dup(&ptr);
var_value = mxs_lestr_consume_dup(&ptr); var_value = mxs_lestr_consume_dup(&ptr);
gwbuf_add_property(buff, var_name, var_value); gwbuf_add_property(buff, var_name, var_value);
MXS_DEBUG("SESSION_TRACK_SYSTEM_VARIABLES, name:%s, value:%s", var_name, var_value);
MXS_FREE(var_name); MXS_FREE(var_name);
MXS_FREE(var_value); MXS_FREE(var_value);
break; break;