diff --git a/server/core/test/test_session_track.cc b/server/core/test/test_session_track.cc index 2a375eb0b..5d08bc14a 100644 --- a/server/core/test/test_session_track.cc +++ b/server/core/test/test_session_track.cc @@ -116,7 +116,7 @@ static const uint8_t resultset2[] = 0x01, 0x00, 0x00, 0x15, 0x00, 0x01, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x00, 0x17, 0x00, 0x01, 0x00, 0x00, 0x18, 0x00, 0x05, 0x00, 0x00, 0x19, - 0xFE, 0x00, 0x00, 0x21, 0x40 + 0xFE, 0x00, 0x00, 0x21, 0x40 }; /** @@ -127,40 +127,40 @@ static const uint8_t resultset2[] = **/ static const uint8_t resultset3[] = { - 0x28, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, - 0x40, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x0F, 0x0A, - 0x61, 0x75, 0x74, 0x6F, 0x63, 0x6F, 0x6D, 0x6D, - 0x69, 0x74, 0x03, 0x4F, 0x46, 0x46, 0x02, 0x01, + 0x28, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x0F, 0x0A, + 0x61, 0x75, 0x74, 0x6F, 0x63, 0x6F, 0x6D, 0x6D, + 0x69, 0x74, 0x03, 0x4F, 0x46, 0x46, 0x02, 0x01, 0x31, 0x05, 0x09, 0x08, 0x49, 0x5F, 0x52, 0x5F, - 0x5F, 0x5F, 0x53, 0x5F, 0x1D, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x0F, 0x0A, 0x61, 0x75, 0x74, 0x6F, - 0x63, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x03, 0x4F, - 0x46, 0x46, 0x02, 0x01, 0x31, 0x07, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, - 0x40, 0x00, 0x00, 0x00, 0x0B, 0x05, 0x09, 0x08, - 0x49, 0x5F, 0x5F, 0x5F, 0x57, 0x5F, 0x5F, 0x5F, - 0x01, 0x00, 0x00, 0x01, 0x04, 0x20, 0x00, 0x00, - 0x02, 0x03, 0x64, 0x65, 0x66, 0x04, 0x74, 0x65, - 0x73, 0x74, 0x02, 0x74, 0x31, 0x02, 0x74, 0x31, - 0x01, 0x61, 0x01, 0x61, 0x0C, 0x21, 0x00, 0x3C, - 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x03, 0x03, 0x64, 0x65, - 0x66, 0x04, 0x74, 0x65, 0x73, 0x74, 0x02, 0x74, - 0x31, 0x02, 0x74, 0x31, 0x01, 0x62, 0x01, 0x62, - 0x0C, 0x3F, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x04, 0x03, 0x64, 0x65, 0x66, 0x04, 0x74, 0x65, - 0x73, 0x74, 0x02, 0x74, 0x31, 0x02, 0x74, 0x31, - 0x01, 0x63, 0x01, 0x63, 0x0C, 0x3F, 0x00, 0x0B, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x05, 0x03, 0x64, 0x65, - 0x66, 0x04, 0x74, 0x65, 0x73, 0x74, 0x02, 0x74, - 0x31, 0x02, 0x74, 0x31, 0x01, 0x64, 0x01, 0x64, - 0x0C, 0x3F, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x06, 0xFE, 0x00, 0x00, 0x21, 0x00, 0x05, 0x00, + 0x5F, 0x5F, 0x53, 0x5F, 0x1D, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x0F, 0x0A, 0x61, 0x75, 0x74, 0x6F, + 0x63, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x03, 0x4F, + 0x46, 0x46, 0x02, 0x01, 0x31, 0x07, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x0B, 0x05, 0x09, 0x08, + 0x49, 0x5F, 0x5F, 0x5F, 0x57, 0x5F, 0x5F, 0x5F, + 0x01, 0x00, 0x00, 0x01, 0x04, 0x20, 0x00, 0x00, + 0x02, 0x03, 0x64, 0x65, 0x66, 0x04, 0x74, 0x65, + 0x73, 0x74, 0x02, 0x74, 0x31, 0x02, 0x74, 0x31, + 0x01, 0x61, 0x01, 0x61, 0x0C, 0x21, 0x00, 0x3C, + 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x03, 0x03, 0x64, 0x65, + 0x66, 0x04, 0x74, 0x65, 0x73, 0x74, 0x02, 0x74, + 0x31, 0x02, 0x74, 0x31, 0x01, 0x62, 0x01, 0x62, + 0x0C, 0x3F, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x04, 0x03, 0x64, 0x65, 0x66, 0x04, 0x74, 0x65, + 0x73, 0x74, 0x02, 0x74, 0x31, 0x02, 0x74, 0x31, + 0x01, 0x63, 0x01, 0x63, 0x0C, 0x3F, 0x00, 0x0B, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x05, 0x03, 0x64, 0x65, + 0x66, 0x04, 0x74, 0x65, 0x73, 0x74, 0x02, 0x74, + 0x31, 0x02, 0x74, 0x31, 0x01, 0x64, 0x01, 0x64, + 0x0C, 0x3F, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x06, 0xFE, 0x00, 0x00, 0x21, 0x00, 0x05, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x21, 0x00 }; @@ -170,46 +170,46 @@ void test1() GWBUF *buffer; proto.server_capabilities = GW_MYSQL_CAPABILITIES_SESSION_TRACK; proto.num_eof_packets = 0; - ss_dfprintf(stderr,"test_session_track : Functional tests.\n"); + ss_dfprintf(stderr, "test_session_track : Functional tests.\n"); //BEGIN - buffer = gwbuf_alloc_and_load(PACKET_1_LEN, resultset1+PACKET_1_IDX); + buffer = gwbuf_alloc_and_load(PACKET_1_LEN, resultset1 + PACKET_1_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "T_______", 8) == 0); gwbuf_free(buffer); //COMMIT - buffer = gwbuf_alloc_and_load(PACKET_2_LEN, resultset1+PACKET_2_IDX); + buffer = gwbuf_alloc_and_load(PACKET_2_LEN, resultset1 + PACKET_2_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "________", 8) == 0); gwbuf_free(buffer); //START TRANSACTION - buffer = gwbuf_alloc_and_load(PACKET_3_LEN, resultset1+PACKET_3_IDX); + buffer = gwbuf_alloc_and_load(PACKET_3_LEN, resultset1 + PACKET_3_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "T_______", 8) == 0); gwbuf_free(buffer); //START TRANSACTION READ ONLY - buffer = gwbuf_alloc_and_load(PACKET_4_LEN, resultset1+PACKET_4_IDX); + buffer = gwbuf_alloc_and_load(PACKET_4_LEN, resultset1 + PACKET_4_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_characteristics"), - "START TRANSACTION READ ONLY;", 28) == 0); + "START TRANSACTION READ ONLY;", 28) == 0); gwbuf_free(buffer); //COMMIT - buffer = gwbuf_alloc_and_load(PACKET_5_LEN, resultset1+PACKET_5_IDX); + buffer = gwbuf_alloc_and_load(PACKET_5_LEN, resultset1 + PACKET_5_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(gwbuf_get_property(buffer, (char *)"trx_characteristics") == NULL); ss_dassert(gwbuf_get_property(buffer, (char *)"trx_state") == NULL); gwbuf_free(buffer); //SET AUTOCOMMIT=0; - buffer = gwbuf_alloc_and_load(PACKET_6_LEN, resultset1+PACKET_6_IDX); + buffer = gwbuf_alloc_and_load(PACKET_6_LEN, resultset1 + PACKET_6_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"autocommit"), "OFF", 3) == 0); gwbuf_free(buffer); //INSERT INTO t1 VALUES(1); - buffer = gwbuf_alloc_and_load(PACKET_7_LEN, resultset1+PACKET_7_IDX); + buffer = gwbuf_alloc_and_load(PACKET_7_LEN, resultset1 + PACKET_7_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "I___W___", 8) == 0); gwbuf_free(buffer); //COMMIT - buffer = gwbuf_alloc_and_load(PACKET_8_LEN, resultset1+PACKET_8_IDX); + buffer = gwbuf_alloc_and_load(PACKET_8_LEN, resultset1 + PACKET_8_IDX); mxs_mysql_get_session_track_info(buffer, &proto); ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "________", 8) == 0); gwbuf_free(buffer); diff --git a/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc b/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc index 72b3726be..af540bb32 100644 --- a/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc +++ b/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc @@ -410,8 +410,8 @@ int MySQLSendHandshake(DCB* dcb) * @param queue Queue of buffers to write */ int gw_MySQLWrite_client(DCB *dcb, GWBUF *queue) -{ - if (GWBUF_IS_REPLY_OK(queue) && dcb->service->session_track_trx_state) +{ + if (GWBUF_IS_REPLY_OK(queue) && dcb->service->session_track_trx_state) { parse_and_set_trx_state(dcb->session, queue); } @@ -1899,18 +1899,18 @@ static bool parse_kill_query(char *query, uint64_t *thread_id_out, kill_type_t * * Get lasted autocommit value; * https://dev.mysql.com/worklog/task/?id=6885 * SESSION_TRACK_TRANSACTION_TYPE: -* Get transaction boundaries +* Get transaction boundaries * TX_EMPTY => SESSION_TRX_INACTIVE * TX_EXPLICIT | TX_IMPLICIT => SESSION_TRX_ACTIVE * https://dev.mysql.com/worklog/task/?id=6885 * SESSION_TRACK_TRANSACTION_CHARACTERISTICS * Get trx characteristics such as read only, read write, snapshot ... -* -*/ +* +*/ static void parse_and_set_trx_state(MXS_SESSION *ses, GWBUF *data) { char *autocommit = gwbuf_get_property(data, (char *)"autocommit"); - + if (autocommit) { MXS_DEBUG("autocommit:%s", autocommit); @@ -1921,14 +1921,14 @@ static void parse_and_set_trx_state(MXS_SESSION *ses, GWBUF *data) if (strncasecmp(autocommit, "OFF", 3) == 0) { session_set_autocommit(ses, false); - } - } + } + } char *trx_state = gwbuf_get_property(data, (char *)"trx_state"); - if (trx_state) + if (trx_state) { mysql_tx_state_t s = parse_trx_state(trx_state); - if (s == TX_EMPTY) + if (s == TX_EMPTY) { session_set_trx_state(ses, SESSION_TRX_INACTIVE); } @@ -1951,5 +1951,5 @@ static void parse_and_set_trx_state(MXS_SESSION *ses, GWBUF *data) } } MXS_DEBUG("trx state:%s", session_trx_state_to_string(ses->trx_state)); - MXS_DEBUG("autcommit:%s", session_is_autocommit(ses)?"ON":"OFF"); + MXS_DEBUG("autcommit:%s", session_is_autocommit(ses) ? "ON" : "OFF"); } diff --git a/server/modules/protocol/MySQL/mysql_common.cc b/server/modules/protocol/MySQL/mysql_common.cc index 3c5ed0c22..480bfccad 100644 --- a/server/modules/protocol/MySQL/mysql_common.cc +++ b/server/modules/protocol/MySQL/mysql_common.cc @@ -1754,7 +1754,7 @@ void mxs_mysql_execute_kill_user(MXS_SESSION* issuer, const char* user, kill_typ { LocalClient* client = LocalClient::create(issuer, *it); const char* hard = (type & KT_HARD) ? "HARD " : - (type & KT_SOFT) ? "SOFT " : ""; + (type & KT_SOFT) ? "SOFT " : ""; const char* query = (type & KT_QUERY) ? "QUERY " : ""; std::stringstream ss; ss << "KILL " << hard << query << "USER " << user; @@ -1804,38 +1804,38 @@ void mxs_mysql_parse_ok_packet(GWBUF *buff, size_t packet_offset, size_t packet_ #endif switch (type) { - case SESSION_TRACK_STATE_CHANGE: - case SESSION_TRACK_SCHEMA: - case SESSION_TRACK_GTIDS: - ptr += mxs_leint_consume(&ptr); - break; - 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 - // system variables like autocommit, schema, charset ... - var_name = mxs_lestr_consume_dup(&ptr); - var_value = mxs_lestr_consume_dup(&ptr); - 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_value); - break; - case SESSION_TRACK_TRANSACTION_TYPE: - mxs_leint_consume(&ptr); // length - trx_info = mxs_lestr_consume_dup(&ptr); - MXS_DEBUG("get trx_info:%s", trx_info); - gwbuf_add_property(buff, (char *)"trx_state", trx_info); - MXS_FREE(trx_info); - break; - default: - ptr += mxs_leint_consume(&ptr); - MXS_WARNING("recieved unexpecting session track type:%d", type); - break; + case SESSION_TRACK_STATE_CHANGE: + case SESSION_TRACK_SCHEMA: + case SESSION_TRACK_GTIDS: + ptr += mxs_leint_consume(&ptr); + break; + 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 + // system variables like autocommit, schema, charset ... + var_name = mxs_lestr_consume_dup(&ptr); + var_value = mxs_lestr_consume_dup(&ptr); + 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_value); + break; + case SESSION_TRACK_TRANSACTION_TYPE: + mxs_leint_consume(&ptr); // length + trx_info = mxs_lestr_consume_dup(&ptr); + MXS_DEBUG("get trx_info:%s", trx_info); + gwbuf_add_property(buff, (char *)"trx_state", trx_info); + MXS_FREE(trx_info); + break; + default: + ptr += mxs_leint_consume(&ptr); + MXS_WARNING("recieved unexpecting session track type:%d", type); + break; } } } @@ -1850,10 +1850,10 @@ void mxs_mysql_parse_ok_packet(GWBUF *buff, size_t packet_offset, size_t packet_ void mxs_mysql_get_session_track_info(GWBUF *buff, MySQLProtocol *proto) { size_t offset = 0; - uint8_t header_and_command[MYSQL_HEADER_LEN+1]; - if (proto->server_capabilities&GW_MYSQL_CAPABILITIES_SESSION_TRACK) + uint8_t header_and_command[MYSQL_HEADER_LEN + 1]; + if (proto->server_capabilities & GW_MYSQL_CAPABILITIES_SESSION_TRACK) { - while (gwbuf_copy_data(buff, offset, MYSQL_HEADER_LEN+1, header_and_command) == (MYSQL_HEADER_LEN+1)) + while (gwbuf_copy_data(buff, offset, MYSQL_HEADER_LEN + 1, header_and_command) == (MYSQL_HEADER_LEN + 1)) { size_t packet_len = gw_mysql_get_byte3(header_and_command); uint8_t cmd = header_and_command[MYSQL_COM_OFFSET]; @@ -1867,8 +1867,8 @@ void mxs_mysql_get_session_track_info(GWBUF *buff, MySQLProtocol *proto) } if ((proto->current_command == MXS_COM_QUERY || - proto->current_command == MXS_COM_STMT_FETCH || - proto->current_command == MXS_COM_STMT_EXECUTE) && + proto->current_command == MXS_COM_STMT_FETCH || + proto->current_command == MXS_COM_STMT_EXECUTE) && cmd == MYSQL_REPLY_EOF) { proto->num_eof_packets++; @@ -1893,7 +1893,7 @@ void mxs_mysql_get_session_track_info(GWBUF *buff, MySQLProtocol *proto) * in the context of the current transaction * _ no non-transactional tables were read within * the current transaction so far - * + * * Place 3: transactional read * R one/several transactional tables were read * _ no transactional tables were read yet @@ -1905,7 +1905,7 @@ void mxs_mysql_get_session_track_info(GWBUF *buff, MySQLProtocol *proto) * Place 5: transactional write * W one/several transactional tables were written to * _ no transactional tables were written to yet - * + * * Place 6: unsafe statements * s one/several unsafe statements (such as UUID()) * were used. @@ -1914,7 +1914,7 @@ void mxs_mysql_get_session_track_info(GWBUF *buff, MySQLProtocol *proto) * Place 7: result-set * S a result set was sent to the client * _ statement had no result-set - * + * * Place 8: LOCKed TABLES * L tables were explicitly locked using LOCK TABLES * _ LOCK TABLES is not active in this session @@ -1927,38 +1927,39 @@ mysql_tx_state_t parse_trx_state(const char *str) { switch (*str) { - case 'T': - s |= TX_EXPLICIT; - break; - case 'I': - s |= TX_IMPLICIT; - break; - case 'r': - s |= TX_READ_UNSAFE; - break; - case 'R': - s |= TX_READ_TRX; - break; - case 'w': - s |= TX_WRITE_UNSAFE; - break; - case 'W': - s |= TX_WRITE_TRX; - break; - case 's': - s |= TX_STMT_UNSAFE; - break; - case 'S': - s |= TX_RESULT_SET; - break; - case 'L': - s |= TX_LOCKED_TABLES; - break; - default: - break; + case 'T': + s |= TX_EXPLICIT; + break; + case 'I': + s |= TX_IMPLICIT; + break; + case 'r': + s |= TX_READ_UNSAFE; + break; + case 'R': + s |= TX_READ_TRX; + break; + case 'w': + s |= TX_WRITE_UNSAFE; + break; + case 'W': + s |= TX_WRITE_TRX; + break; + case 's': + s |= TX_STMT_UNSAFE; + break; + case 'S': + s |= TX_RESULT_SET; + break; + case 'L': + s |= TX_LOCKED_TABLES; + break; + default: + break; } - } while(*(str++) != 0); + } + while (*(str++) != 0); return (mysql_tx_state_t)s; }