check protocol state to determine real ok packet

This commit is contained in:
Dapeng Huang
2018-01-22 14:52:12 +08:00
parent 8ce7683a0a
commit 81f303512e
5 changed files with 148 additions and 73 deletions

View File

@ -7,6 +7,8 @@
#include <maxscale/buffer.h>
#include <maxscale/protocol/mysql.h>
MySQLProtocol proto;
static const uint8_t resultset1[] =
{
/* BEGIN;*/
@ -117,52 +119,98 @@ static const uint8_t resultset2[] =
0xFE, 0x00, 0x00, 0x21, 0x40
};
/**
* SET AUTOCOMMIT=0;
* CREATE TABLE t1(a VARCHAR(20), b INT, c INT, d INT);
* INSERT INTO t1 VALUES ('', 100, 200, 300);
* SELECT * FROM t1;
**/
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,
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,
0x00, 0x07, 0xFE, 0x00, 0x00, 0x21, 0x00
};
/* functional test , test packet by packet */
void test1()
{
GWBUF *buffer;
uint32_t server_capabilities = GW_MYSQL_CAPABILITIES_SESSION_TRACK;
proto.server_capabilities = GW_MYSQL_CAPABILITIES_SESSION_TRACK;
proto.num_eof_packets = 0;
ss_dfprintf(stderr,"test_session_track : Functional tests.\n");
//BEGIN
buffer = gwbuf_alloc_and_load(PACKET_1_LEN, resultset1+PACKET_1_IDX);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
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);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
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);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
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);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
mxs_mysql_get_session_track_info(buffer, &proto);
ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_characteristics"),
"START TRANSACTION READ ONLY;", 28) == 0);
gwbuf_free(buffer);
//COMMIT
buffer = gwbuf_alloc_and_load(PACKET_5_LEN, resultset1+PACKET_5_IDX);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
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);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
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);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
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);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
mxs_mysql_get_session_track_info(buffer, &proto);
ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "________", 8) == 0);
gwbuf_free(buffer);
}
@ -171,10 +219,23 @@ void test1()
void test2()
{
GWBUF *buffer;
uint32_t server_capabilities = GW_MYSQL_CAPABILITIES_SESSION_TRACK;
ss_dfprintf(stderr, "test_session_track : multi results test\n");
ss_dfprintf(stderr, "test_session_track: multi results test\n");
proto.server_capabilities = GW_MYSQL_CAPABILITIES_SESSION_TRACK;
proto.num_eof_packets = 0;
buffer = gwbuf_alloc_and_load(sizeof(resultset2), resultset2);
mxs_mysql_get_session_track_info(buffer, server_capabilities);
mxs_mysql_get_session_track_info(buffer, &proto);
ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "I_R_W___", 8) == 0);
gwbuf_free(buffer);
}
void test3()
{
GWBUF *buffer;
proto.server_capabilities = GW_MYSQL_CAPABILITIES_SESSION_TRACK;
proto.num_eof_packets = 0;
ss_dfprintf(stderr, "test_session_track: protocol state test\n");
buffer = gwbuf_alloc_and_load(sizeof(resultset2), resultset2);
mxs_mysql_get_session_track_info(buffer, &proto);
ss_dassert(strncmp(gwbuf_get_property(buffer, (char *)"trx_state"), "I_R_W___", 8) == 0);
gwbuf_free(buffer);
}
@ -183,5 +244,6 @@ int main(int argc, char **argv)
{
test1();
test2();
test3();
return 0;
}