MDEV-15477: SESSION_SYSVARS_TRACKER does not track last_gtid

register changes of last_gtid
This commit is contained in:
Oleksandr Byelkin 2018-03-09 14:39:40 +01:00
parent 73de63e898
commit 517d718201
9 changed files with 92 additions and 28 deletions

View File

@ -1,46 +1,30 @@
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';

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,
} }
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,

View File

@ -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);

View File

@ -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()
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()

View File

@ -4255,7 +4255,13 @@ public:
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;

View File

@ -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)
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));