Skip to content

Commit e7608a7

Browse files
committed
MDEV-8931: (server part of) session state tracking
initial commit to test
1 parent 468a6ad commit e7608a7

28 files changed

+928
-46
lines changed

include/mysql.h.pp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,15 @@
8787
MYSQL_OPTION_MULTI_STATEMENTS_ON,
8888
MYSQL_OPTION_MULTI_STATEMENTS_OFF
8989
};
90+
enum enum_session_state_type
91+
{
92+
SESSION_TRACK_SYSTEM_VARIABLES,
93+
SESSION_TRACK_SCHEMA,
94+
SESSION_TRACK_STATE_CHANGE,
95+
SESSION_TRACK_GTIDS,
96+
SESSION_TRACK_TRANSACTION_CHARACTERISTICS,
97+
SESSION_TRACK_TRANSACTION_STATE
98+
};
9099
my_bool my_net_init(NET *net, Vio* vio, void *thd, unsigned int my_flags);
91100
void my_net_local_init(NET *net);
92101
void net_end(NET *net);

include/mysql_com.h

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@
7272
#define INDEX_COMMENT_MAXLEN 1024
7373
#define TABLE_PARTITION_COMMENT_MAXLEN 1024
7474

75+
/*
76+
Maximum length of protocol packet.
77+
OK packet length limit also restricted to this value as any length greater
78+
than this value will have first byte of OK packet to be 254 thus does not
79+
provide a means to identify if this is OK or EOF packet.
80+
*/
81+
#define MAX_PACKET_LENGTH (256L*256L*256L-1)
82+
7583
/*
7684
USER_HOST_BUFF_SIZE -- length of string buffer, that is enough to contain
7785
username and hostname parts of the user identifier with trailing zero in
@@ -221,6 +229,14 @@ enum enum_server_command
221229
/* Don't close the connection for a connection with expired password. */
222230
#define CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS (1UL << 22)
223231

232+
/**
233+
Capable of handling server state change information. Its a hint to the
234+
server to include the state change information in Ok packet.
235+
*/
236+
#define CLIENT_SESSION_TRACK (1UL << 23)
237+
/* Client no longer needs EOF packet */
238+
#define CLIENT_DEPRECATE_EOF (1UL << 24)
239+
224240
#define CLIENT_PROGRESS_OBSOLETE (1UL << 29)
225241
#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30)
226242
/*
@@ -272,10 +288,12 @@ enum enum_server_command
272288
CLIENT_MULTI_RESULTS | \
273289
CLIENT_PS_MULTI_RESULTS | \
274290
CLIENT_SSL_VERIFY_SERVER_CERT | \
275-
CLIENT_REMEMBER_OPTIONS | \
291+
CLIENT_REMEMBER_OPTIONS | \
276292
MARIADB_CLIENT_PROGRESS | \
277293
CLIENT_PLUGIN_AUTH | \
278294
CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | \
295+
CLIENT_SESSION_TRACK |\
296+
CLIENT_DEPRECATE_EOF |\
279297
CLIENT_CONNECT_ATTRS |\
280298
MARIADB_CLIENT_COM_MULTI)
281299

@@ -340,6 +358,11 @@ enum enum_server_command
340358
*/
341359
#define SERVER_STATUS_IN_TRANS_READONLY 8192
342360

361+
/**
362+
This status flag, when on, implies that one of the state information has
363+
changed on the server because of the execution of the last statement.
364+
*/
365+
#define SERVER_SESSION_STATE_CHANGED (1UL << 14)
343366

344367
/**
345368
Server status flags that must be cleared when starting
@@ -356,7 +379,8 @@ enum enum_server_command
356379
SERVER_QUERY_WAS_SLOW |\
357380
SERVER_STATUS_DB_DROPPED |\
358381
SERVER_STATUS_CURSOR_EXISTS|\
359-
SERVER_STATUS_LAST_ROW_SENT)
382+
SERVER_STATUS_LAST_ROW_SENT|\
383+
SERVER_SESSION_STATE_CHANGED)
360384

361385
#define MYSQL_ERRMSG_SIZE 512
362386
#define NET_READ_TIMEOUT 30 /* Timeout on read */
@@ -523,6 +547,30 @@ enum enum_mysql_set_option
523547
MYSQL_OPTION_MULTI_STATEMENTS_OFF
524548
};
525549

550+
/*
551+
Type of state change information that the server can include in the Ok
552+
packet.
553+
Note : 1) session_state_type shouldn't go past 255 (i.e. 1-byte boundary).
554+
2) Modify the definition of SESSION_TRACK_END when a new member is
555+
added.
556+
*/
557+
enum enum_session_state_type
558+
{
559+
SESSION_TRACK_SYSTEM_VARIABLES, /* Session system variables */
560+
SESSION_TRACK_SCHEMA, /* Current schema */
561+
SESSION_TRACK_STATE_CHANGE, /* track session state changes */
562+
SESSION_TRACK_GTIDS,
563+
SESSION_TRACK_TRANSACTION_CHARACTERISTICS, /* Transaction chistics */
564+
SESSION_TRACK_TRANSACTION_STATE /* Transaction state */
565+
};
566+
567+
#define SESSION_TRACK_BEGIN SESSION_TRACK_SYSTEM_VARIABLES
568+
569+
#define SESSION_TRACK_END SESSION_TRACK_TRANSACTION_STATE
570+
571+
#define IS_SESSION_STATE_TYPE(T) \
572+
(((int)(T) >= SESSION_TRACK_BEGIN) && ((T) <= SESSION_TRACK_END))
573+
526574
#define net_new_transaction(net) ((net)->pkt_nr=0)
527575

528576
#ifdef __cplusplus
@@ -641,6 +689,7 @@ my_ulonglong net_field_length_ll(uchar **packet);
641689
my_ulonglong safe_net_field_length_ll(uchar **packet, size_t packet_len);
642690
uchar *net_store_length(uchar *pkg, ulonglong length);
643691
uchar *safe_net_store_length(uchar *pkg, size_t pkg_len, ulonglong length);
692+
unsigned int net_length_size(ulonglong num);
644693
#endif
645694

646695
#ifdef __cplusplus

libmysqld/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
112112
../sql/item_windowfunc.cc ../sql/sql_window.cc
113113
../sql/sql_cte.cc
114114
../sql/temporary_tables.cc
115+
../sql/session_tracker.cc
115116
${GEN_SOURCES}
116117
${MYSYS_LIBWRAP_SOURCE}
117118
)

libmysqld/lib_sql.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1172,7 +1172,8 @@ bool
11721172
net_send_ok(THD *thd,
11731173
uint server_status, uint statement_warn_count,
11741174
ulonglong affected_rows, ulonglong id, const char *message,
1175-
bool unused __attribute__((unused)))
1175+
bool unused1 __attribute__((unused)),
1176+
bool unused2 __attribute__((unused)))
11761177
{
11771178
DBUG_ENTER("emb_net_send_ok");
11781179
MYSQL_DATA *data;

mysql-test/r/mysqld--help.result

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,11 @@ The following options may be given as the first argument:
903903
files within specified directory
904904
--server-id=# Uniquely identifies the server instance in the community
905905
of replication partners
906+
--session-track-schema
907+
Track changes to the 'default schema'.
908+
(Defaults to on; use --skip-session-track-schema to disable.)
909+
--session-track-state-change
910+
Track changes to the 'session state'.
906911
--show-slave-auth-info
907912
Show user and password in SHOW SLAVE HOSTS on this
908913
master.
@@ -1385,6 +1390,8 @@ safe-user-create FALSE
13851390
secure-auth TRUE
13861391
secure-file-priv (No default value)
13871392
server-id 1
1393+
session-track-schema TRUE
1394+
session-track-state-change FALSE
13881395
show-slave-auth-info FALSE
13891396
silent-startup FALSE
13901397
skip-grant-tables TRUE

mysql-test/suite/sys_vars/r/sysvars_server_embedded.result

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3327,6 +3327,34 @@ NUMERIC_BLOCK_SIZE 1
33273327
ENUM_VALUE_LIST NULL
33283328
READ_ONLY NO
33293329
COMMAND_LINE_ARGUMENT REQUIRED
3330+
VARIABLE_NAME SESSION_TRACK_SCHEMA
3331+
SESSION_VALUE ON
3332+
GLOBAL_VALUE ON
3333+
GLOBAL_VALUE_ORIGIN COMPILE-TIME
3334+
DEFAULT_VALUE ON
3335+
VARIABLE_SCOPE SESSION
3336+
VARIABLE_TYPE BOOLEAN
3337+
VARIABLE_COMMENT Track changes to the 'default schema'.
3338+
NUMERIC_MIN_VALUE NULL
3339+
NUMERIC_MAX_VALUE NULL
3340+
NUMERIC_BLOCK_SIZE NULL
3341+
ENUM_VALUE_LIST OFF,ON
3342+
READ_ONLY NO
3343+
COMMAND_LINE_ARGUMENT OPTIONAL
3344+
VARIABLE_NAME SESSION_TRACK_STATE_CHANGE
3345+
SESSION_VALUE OFF
3346+
GLOBAL_VALUE OFF
3347+
GLOBAL_VALUE_ORIGIN COMPILE-TIME
3348+
DEFAULT_VALUE OFF
3349+
VARIABLE_SCOPE SESSION
3350+
VARIABLE_TYPE BOOLEAN
3351+
VARIABLE_COMMENT Track changes to the 'session state'.
3352+
NUMERIC_MIN_VALUE NULL
3353+
NUMERIC_MAX_VALUE NULL
3354+
NUMERIC_BLOCK_SIZE NULL
3355+
ENUM_VALUE_LIST OFF,ON
3356+
READ_ONLY NO
3357+
COMMAND_LINE_ARGUMENT OPTIONAL
33303358
VARIABLE_NAME SKIP_EXTERNAL_LOCKING
33313359
SESSION_VALUE NULL
33323360
GLOBAL_VALUE ON

mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3789,6 +3789,34 @@ NUMERIC_BLOCK_SIZE 1
37893789
ENUM_VALUE_LIST NULL
37903790
READ_ONLY NO
37913791
COMMAND_LINE_ARGUMENT REQUIRED
3792+
VARIABLE_NAME SESSION_TRACK_SCHEMA
3793+
SESSION_VALUE ON
3794+
GLOBAL_VALUE ON
3795+
GLOBAL_VALUE_ORIGIN COMPILE-TIME
3796+
DEFAULT_VALUE ON
3797+
VARIABLE_SCOPE SESSION
3798+
VARIABLE_TYPE BOOLEAN
3799+
VARIABLE_COMMENT Track changes to the 'default schema'.
3800+
NUMERIC_MIN_VALUE NULL
3801+
NUMERIC_MAX_VALUE NULL
3802+
NUMERIC_BLOCK_SIZE NULL
3803+
ENUM_VALUE_LIST OFF,ON
3804+
READ_ONLY NO
3805+
COMMAND_LINE_ARGUMENT OPTIONAL
3806+
VARIABLE_NAME SESSION_TRACK_STATE_CHANGE
3807+
SESSION_VALUE OFF
3808+
GLOBAL_VALUE OFF
3809+
GLOBAL_VALUE_ORIGIN COMPILE-TIME
3810+
DEFAULT_VALUE OFF
3811+
VARIABLE_SCOPE SESSION
3812+
VARIABLE_TYPE BOOLEAN
3813+
VARIABLE_COMMENT Track changes to the 'session state'.
3814+
NUMERIC_MIN_VALUE NULL
3815+
NUMERIC_MAX_VALUE NULL
3816+
NUMERIC_BLOCK_SIZE NULL
3817+
ENUM_VALUE_LIST OFF,ON
3818+
READ_ONLY NO
3819+
COMMAND_LINE_ARGUMENT OPTIONAL
37923820
VARIABLE_NAME SKIP_EXTERNAL_LOCKING
37933821
SESSION_VALUE NULL
37943822
GLOBAL_VALUE ON

sql-common/pack.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,25 @@ uchar *safe_net_store_length(uchar *packet, size_t packet_len, ulonglong length)
186186
return packet+8;
187187
}
188188

189+
190+
/**
191+
The length of space required to store the resulting length-encoded integer
192+
for the given number. This function can be used at places where one needs to
193+
dynamically allocate the buffer for a given number to be stored as length-
194+
encoded integer.
195+
196+
@param num [IN] the input number
197+
198+
@return length of buffer needed to store this number [1, 3, 4, 9].
199+
*/
200+
201+
uint net_length_size(ulonglong num)
202+
{
203+
if (num < (ulonglong) 251LL)
204+
return 1;
205+
if (num < (ulonglong) 65536LL)
206+
return 3;
207+
if (num < (ulonglong) 16777216LL)
208+
return 4;
209+
return 9;
210+
}

sql/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ SET (SQL_SOURCE
9595
../sql-common/client_plugin.c
9696
opt_range.cc opt_range.h opt_sum.cc
9797
../sql-common/pack.c parse_file.cc password.c procedure.cc
98-
protocol.cc records.cc repl_failsafe.cc rpl_filter.cc set_var.cc
98+
protocol.cc records.cc repl_failsafe.cc rpl_filter.cc
99+
session_tracker.cc
100+
set_var.cc
99101
slave.cc sp.cc sp_cache.cc sp_head.cc sp_pcontext.cc
100102
sp_rcontext.cc spatial.cc sql_acl.cc sql_analyse.cc sql_base.cc
101103
sql_cache.cc sql_class.cc sql_client.cc sql_crypt.cc sql_crypt.h

sql/net_serv.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ extern my_bool thd_net_is_killed();
117117
#endif
118118

119119
#define TEST_BLOCKING 8
120-
#define MAX_PACKET_LENGTH (256L*256L*256L-1)
121120

122121
static my_bool net_write_buff(NET *, const uchar *, ulong);
123122

0 commit comments

Comments
 (0)