summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2018-03-09 14:39:40 +0100
committerOleksandr Byelkin <sanja@mariadb.com>2018-06-25 19:01:41 +0200
commit517d7182013b212db4680a22da2c91314c41f51b (patch)
tree79e876c6889f7fd69735771fd0c4627564a131f5
parent73de63e898bd67f708c6df8d154a76b7ddd0d5d7 (diff)
downloadmariadb-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.result24
-rw-r--r--mysql-test/r/session_tracker_last_gtid.result34
-rw-r--r--mysql-test/t/mysqltest_tracking_info.test4
-rw-r--r--mysql-test/t/session_tracker_last_gtid.test19
-rw-r--r--sql/log.cc5
-rw-r--r--sql/set_var.h2
-rw-r--r--sql/sql_class.cc17
-rw-r--r--sql/sql_class.h8
-rw-r--r--sql/sys_vars.cc7
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 &gtid)
+{
+#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 &gtid);
+
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, &gtid, &first)) ||
!(p= thd->strmake(str.ptr(), str.length())))
{
my_error(ER_OUT_OF_RESOURCES, MYF(0));