Commit 517d7182 authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

MDEV-15477: SESSION_SYSVARS_TRACKER does not track last_gtid

register changes of last_gtid
parent 73de63e8
SELECT @@session.character_set_client, @@session.character_set_results, @@session.character_set_connection; SELECT @@session.character_set_connection;
@@session.character_set_client @@session.character_set_results @@session.character_set_connection @@session.character_set_connection
latin1 latin1 latin1 latin1
SET @@session.session_track_system_variables='character_set_client,character_set_results,character_set_connection'; SET @@session.session_track_system_variables='character_set_connection';
# tracking info on # tracking info on
SET NAMES 'utf8'; SET NAMES 'utf8';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_client
-- utf8
-- character_set_connection -- character_set_connection
-- utf8 -- utf8
-- character_set_results
-- utf8
SET NAMES 'big5'; SET NAMES 'big5';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_client
-- big5
-- character_set_connection -- character_set_connection
-- big5 -- big5
-- character_set_results
-- big5
# tracking info on once # tracking info on once
SET NAMES 'utf8'; SET NAMES 'utf8';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_client
-- utf8
-- character_set_connection -- character_set_connection
-- utf8 -- utf8
-- character_set_results
-- utf8
SET NAMES 'big5'; SET NAMES 'big5';
# tracking info on # tracking info on
SET NAMES 'utf8'; SET NAMES 'utf8';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_client
-- utf8
-- character_set_connection -- character_set_connection
-- utf8 -- utf8
-- character_set_results
-- utf8
# tracking info off once # tracking info off once
SET NAMES 'big5'; SET NAMES 'big5';
......
#
# 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
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
--source include/no_protocol.inc --source include/no_protocol.inc
--source include/not_embedded.inc --source include/not_embedded.inc
SELECT @@session.character_set_client, @@session.character_set_results, @@session.character_set_connection; SELECT @@session.character_set_connection;
SET @@session.session_track_system_variables='character_set_client,character_set_results,character_set_connection'; SET @@session.session_track_system_variables='character_set_connection';
--echo # tracking info on --echo # tracking info on
--enable_session_track_info --enable_session_track_info
......
--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
...@@ -46,6 +46,8 @@ ...@@ -46,6 +46,8 @@
#include <stdarg.h> #include <stdarg.h>
#include <m_ctype.h> // For test_if_number #include <m_ctype.h> // For test_if_number
#include <set_var.h> // for Sys_last_gtid_ptr
#ifdef _WIN32 #ifdef _WIN32
#include "message.h" #include "message.h"
#endif #endif
...@@ -5945,7 +5947,8 @@ MYSQL_BIN_LOG::write_gtid_event(THD *thd, bool standalone, ...@@ -5945,7 +5947,8 @@ MYSQL_BIN_LOG::write_gtid_event(THD *thd, bool standalone,
} }
if (err) if (err)
DBUG_RETURN(true); 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, Gtid_log_event gtid_event(thd, seq_no, domain_id, standalone,
LOG_EVENT_SUPPRESS_USE_F, is_transactional, LOG_EVENT_SUPPRESS_USE_F, is_transactional,
......
...@@ -430,7 +430,7 @@ sql_mode_t expand_sql_mode(sql_mode_t sql_mode); ...@@ -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); bool sql_mode_string_representation(THD *thd, sql_mode_t sql_mode, LEX_STRING *ls);
int default_regex_flags_pcre(const THD *thd); 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); CHARSET_INFO *get_old_charset_by_name(const char *old_name);
......
...@@ -1190,7 +1190,7 @@ void THD::init(void) ...@@ -1190,7 +1190,7 @@ void THD::init(void)
bzero((char *) &org_status_var, sizeof(org_status_var)); bzero((char *) &org_status_var, sizeof(org_status_var));
status_in_global= 0; status_in_global= 0;
start_bytes_received= 0; start_bytes_received= 0;
last_commit_gtid.seq_no= 0; m_last_commit_gtid.seq_no= 0;
last_stmt= NULL; last_stmt= NULL;
/* Reset status of last insert id */ /* Reset status of last insert id */
arg_of_last_insert_id_function= FALSE; arg_of_last_insert_id_function= FALSE;
...@@ -6972,6 +6972,21 @@ THD::signal_wakeup_ready() ...@@ -6972,6 +6972,21 @@ THD::signal_wakeup_ready()
mysql_cond_signal(&COND_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 void
wait_for_commit::reinit() wait_for_commit::reinit()
......
...@@ -4255,7 +4255,13 @@ class THD :public Statement, ...@@ -4255,7 +4255,13 @@ class THD :public Statement,
The GTID assigned to the last commit. If no GTID was assigned to any commit 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. 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 *tdc_hash_pins;
LF_PINS *xid_hash_pins; LF_PINS *xid_hash_pins;
......
...@@ -1828,6 +1828,8 @@ static Sys_var_last_gtid Sys_last_gtid( ...@@ -1828,6 +1828,8 @@ static Sys_var_last_gtid Sys_last_gtid(
"or the empty string if none.", "or the empty string if none.",
READ_ONLY sys_var::ONLY_SESSION, NO_CMD_LINE); READ_ONLY sys_var::ONLY_SESSION, NO_CMD_LINE);
export sys_var *Sys_last_gtid_ptr= &Sys_last_gtid; // for check changing
uchar * uchar *
Sys_var_last_gtid::session_value_ptr(THD *thd, const LEX_STRING *base) 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) ...@@ -1838,8 +1840,9 @@ Sys_var_last_gtid::session_value_ptr(THD *thd, const LEX_STRING *base)
bool first= true; bool first= true;
str.length(0); str.length(0);
if ((thd->last_commit_gtid.seq_no > 0 && rpl_gtid gtid= thd->get_last_commit_gtid();
rpl_slave_state_tostring_helper(&str, &thd->last_commit_gtid, &first)) || if ((gtid.seq_no > 0 &&
rpl_slave_state_tostring_helper(&str, &gtid, &first)) ||
!(p= thd->strmake(str.ptr(), str.length()))) !(p= thd->strmake(str.ptr(), str.length())))
{ {
my_error(ER_OUT_OF_RESOURCES, MYF(0)); my_error(ER_OUT_OF_RESOURCES, MYF(0));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment