diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2018-03-09 14:39:40 +0100 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2018-06-25 19:01:41 +0200 |
commit | 517d7182013b212db4680a22da2c91314c41f51b (patch) | |
tree | 79e876c6889f7fd69735771fd0c4627564a131f5 | |
parent | 73de63e898bd67f708c6df8d154a76b7ddd0d5d7 (diff) | |
download | mariadb-git-517d7182013b212db4680a22da2c91314c41f51b.tar.gz |
MDEV-15477: SESSION_SYSVARS_TRACKER does not track last_gtid
register changes of last_gtid
-rw-r--r-- | mysql-test/r/mysqltest_tracking_info.result | 24 | ||||
-rw-r--r-- | mysql-test/r/session_tracker_last_gtid.result | 34 | ||||
-rw-r--r-- | mysql-test/t/mysqltest_tracking_info.test | 4 | ||||
-rw-r--r-- | mysql-test/t/session_tracker_last_gtid.test | 19 | ||||
-rw-r--r-- | sql/log.cc | 5 | ||||
-rw-r--r-- | sql/set_var.h | 2 | ||||
-rw-r--r-- | sql/sql_class.cc | 17 | ||||
-rw-r--r-- | sql/sql_class.h | 8 | ||||
-rw-r--r-- | sql/sys_vars.cc | 7 |
9 files changed, 92 insertions, 28 deletions
diff --git a/mysql-test/r/mysqltest_tracking_info.result b/mysql-test/r/mysqltest_tracking_info.result index b5885a37cde..df966ae1d39 100644 --- a/mysql-test/r/mysqltest_tracking_info.result +++ b/mysql-test/r/mysqltest_tracking_info.result @@ -1,46 +1,30 @@ -SELECT @@session.character_set_client, @@session.character_set_results, @@session.character_set_connection; -@@session.character_set_client @@session.character_set_results @@session.character_set_connection -latin1 latin1 latin1 -SET @@session.session_track_system_variables='character_set_client,character_set_results,character_set_connection'; +SELECT @@session.character_set_connection; +@@session.character_set_connection +latin1 +SET @@session.session_track_system_variables='character_set_connection'; # tracking info on SET NAMES 'utf8'; -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES --- character_set_client --- utf8 -- character_set_connection -- utf8 --- character_set_results --- utf8 SET NAMES 'big5'; -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES --- character_set_client --- big5 -- character_set_connection -- big5 --- character_set_results --- big5 # tracking info on once SET NAMES 'utf8'; -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES --- character_set_client --- utf8 -- character_set_connection -- utf8 --- character_set_results --- utf8 SET NAMES 'big5'; # tracking info on SET NAMES 'utf8'; -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES --- character_set_client --- utf8 -- character_set_connection -- utf8 --- character_set_results --- utf8 # tracking info off once SET NAMES 'big5'; diff --git a/mysql-test/r/session_tracker_last_gtid.result b/mysql-test/r/session_tracker_last_gtid.result new file mode 100644 index 00000000000..795d0aaa2a2 --- /dev/null +++ b/mysql-test/r/session_tracker_last_gtid.result @@ -0,0 +1,34 @@ +# +# MDEV-15477: SESSION_SYSVARS_TRACKER does not track last_gtid +# +SET gtid_seq_no=1000; +SET @@session.session_track_system_variables='last_gtid'; +create table t1 (a int) engine=innodb; +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- last_gtid +-- 0-1-1000 + +select @@last_gtid; +@@last_gtid +0-1-1000 +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- last_gtid +-- 0-1-1000 + +insert into t1 values (1); +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- last_gtid +-- 0-1-1001 + +select @@last_gtid; +@@last_gtid +0-1-1001 +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- last_gtid +-- 0-1-1001 + +drop table t1; +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- last_gtid +-- 0-1-1002 + diff --git a/mysql-test/t/mysqltest_tracking_info.test b/mysql-test/t/mysqltest_tracking_info.test index c32e20703a5..d31f68b3cbd 100644 --- a/mysql-test/t/mysqltest_tracking_info.test +++ b/mysql-test/t/mysqltest_tracking_info.test @@ -2,8 +2,8 @@ --source include/no_protocol.inc --source include/not_embedded.inc -SELECT @@session.character_set_client, @@session.character_set_results, @@session.character_set_connection; -SET @@session.session_track_system_variables='character_set_client,character_set_results,character_set_connection'; +SELECT @@session.character_set_connection; +SET @@session.session_track_system_variables='character_set_connection'; --echo # tracking info on --enable_session_track_info diff --git a/mysql-test/t/session_tracker_last_gtid.test b/mysql-test/t/session_tracker_last_gtid.test new file mode 100644 index 00000000000..24cf2104a0c --- /dev/null +++ b/mysql-test/t/session_tracker_last_gtid.test @@ -0,0 +1,19 @@ +--source include/not_embedded.inc +--source include/have_innodb.inc +--source include/have_binlog_format_statement.inc + +--enable_session_track_info + +--echo # +--echo # MDEV-15477: SESSION_SYSVARS_TRACKER does not track last_gtid +--echo # + +SET gtid_seq_no=1000; +SET @@session.session_track_system_variables='last_gtid'; +create table t1 (a int) engine=innodb; +select @@last_gtid; +insert into t1 values (1); +select @@last_gtid; +drop table t1; + +--disable_session_track_info diff --git a/sql/log.cc b/sql/log.cc index 923810aa945..f74e73f47ba 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -46,6 +46,8 @@ #include <stdarg.h> #include <m_ctype.h> // For test_if_number +#include <set_var.h> // for Sys_last_gtid_ptr + #ifdef _WIN32 #include "message.h" #endif @@ -5945,7 +5947,8 @@ MYSQL_BIN_LOG::write_gtid_event(THD *thd, bool standalone, } if (err) DBUG_RETURN(true); - thd->last_commit_gtid= gtid; + + thd->set_last_commit_gtid(gtid); Gtid_log_event gtid_event(thd, seq_no, domain_id, standalone, LOG_EVENT_SUPPRESS_USE_F, is_transactional, diff --git a/sql/set_var.h b/sql/set_var.h index 5a7f8c2d8a3..c218c40fb38 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -430,7 +430,7 @@ sql_mode_t expand_sql_mode(sql_mode_t sql_mode); bool sql_mode_string_representation(THD *thd, sql_mode_t sql_mode, LEX_STRING *ls); int default_regex_flags_pcre(const THD *thd); -extern sys_var *Sys_autocommit_ptr; +extern sys_var *Sys_autocommit_ptr, *Sys_last_gtid_ptr; CHARSET_INFO *get_old_charset_by_name(const char *old_name); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 8590a0fe179..a1010fb4c35 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1190,7 +1190,7 @@ void THD::init(void) bzero((char *) &org_status_var, sizeof(org_status_var)); status_in_global= 0; start_bytes_received= 0; - last_commit_gtid.seq_no= 0; + m_last_commit_gtid.seq_no= 0; last_stmt= NULL; /* Reset status of last insert id */ arg_of_last_insert_id_function= FALSE; @@ -6972,6 +6972,21 @@ THD::signal_wakeup_ready() mysql_cond_signal(&COND_wakeup_ready); } +void THD::set_last_commit_gtid(rpl_gtid >id) +{ +#ifndef EMBEDDED_LIBRARY + bool changed_gtid= (m_last_commit_gtid.seq_no != gtid.seq_no); +#endif + m_last_commit_gtid= gtid; +#ifndef EMBEDDED_LIBRARY + if (changed_gtid && + session_tracker.get_tracker(SESSION_SYSVARS_TRACKER)->is_enabled()) + { + session_tracker.get_tracker(SESSION_SYSVARS_TRACKER)-> + mark_as_changed(this, (LEX_CSTRING*)Sys_last_gtid_ptr); + } +#endif +} void wait_for_commit::reinit() diff --git a/sql/sql_class.h b/sql/sql_class.h index 72cbd03cd1b..d03852ab9a2 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -4255,7 +4255,13 @@ public: The GTID assigned to the last commit. If no GTID was assigned to any commit so far, this is indicated by last_commit_gtid.seq_no == 0. */ - rpl_gtid last_commit_gtid; +private: + rpl_gtid m_last_commit_gtid; + +public: + rpl_gtid get_last_commit_gtid() { return m_last_commit_gtid; } + void set_last_commit_gtid(rpl_gtid >id); + LF_PINS *tdc_hash_pins; LF_PINS *xid_hash_pins; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index de546175da8..5c893f64a9d 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1828,6 +1828,8 @@ static Sys_var_last_gtid Sys_last_gtid( "or the empty string if none.", READ_ONLY sys_var::ONLY_SESSION, NO_CMD_LINE); +export sys_var *Sys_last_gtid_ptr= &Sys_last_gtid; // for check changing + uchar * Sys_var_last_gtid::session_value_ptr(THD *thd, const LEX_STRING *base) @@ -1838,8 +1840,9 @@ Sys_var_last_gtid::session_value_ptr(THD *thd, const LEX_STRING *base) bool first= true; str.length(0); - if ((thd->last_commit_gtid.seq_no > 0 && - rpl_slave_state_tostring_helper(&str, &thd->last_commit_gtid, &first)) || + rpl_gtid gtid= thd->get_last_commit_gtid(); + if ((gtid.seq_no > 0 && + rpl_slave_state_tostring_helper(&str, >id, &first)) || !(p= thd->strmake(str.ptr(), str.length()))) { my_error(ER_OUT_OF_RESOURCES, MYF(0)); |