diff options
-rw-r--r-- | sql/log.cc | 2 | ||||
-rw-r--r-- | sql/session_tracker.cc | 27 | ||||
-rw-r--r-- | sql/session_tracker.h | 1 | ||||
-rw-r--r-- | sql/sql_class.cc | 1 |
4 files changed, 22 insertions, 9 deletions
diff --git a/sql/log.cc b/sql/log.cc index 92b2061d4bf..ac885746c62 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -7903,6 +7903,7 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader) */ for (current= queue; current != NULL; current= current->next) { + set_current_thd(current->thd); binlog_cache_mngr *cache_mngr= current->cache_mngr; /* @@ -7938,6 +7939,7 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader) cache_mngr->delayed_error= false; } } + set_current_thd(leader->thd); bool synced= 0; if (unlikely(flush_and_sync(&synced))) diff --git a/sql/session_tracker.cc b/sql/session_tracker.cc index 8b0e247767c..db82b7dffe9 100644 --- a/sql/session_tracker.cc +++ b/sql/session_tracker.cc @@ -379,16 +379,10 @@ void Session_sysvars_tracker::deinit(THD *thd) bool Session_sysvars_tracker::enable(THD *thd) { - LEX_STRING tmp= { thd->variables.session_track_system_variables, - safe_strlen(thd->variables.session_track_system_variables) }; orig_list.reinit(); - if (orig_list.parse_var_list(thd, tmp, true, thd->charset()) == true) - { - orig_list.reinit(); - m_enabled= false; - return true; - } - m_enabled= true; + m_parsed= false; + m_enabled= thd->variables.session_track_system_variables && + *thd->variables.session_track_system_variables; return false; } @@ -433,6 +427,7 @@ bool Session_sysvars_tracker::update(THD *thd, set_var *var) my_free(thd->variables.session_track_system_variables); thd->variables.session_track_system_variables= static_cast<char*>(copy); + m_parsed= true; orig_list.copy(&tool_list, thd); orig_list.construct_var_list(thd->variables.session_track_system_variables, var->save_result.string_value.length + 1); @@ -540,6 +535,20 @@ void Session_sysvars_tracker::mark_as_changed(THD *thd, { sysvar_node_st *node; sys_var *svar= (sys_var *)var; + + if (!m_parsed) + { + DBUG_ASSERT(thd->variables.session_track_system_variables); + LEX_STRING tmp= { thd->variables.session_track_system_variables, + strlen(thd->variables.session_track_system_variables) }; + if (orig_list.parse_var_list(thd, tmp, true, thd->charset())) + { + orig_list.reinit(); + return; + } + m_parsed= true; + } + /* Check if the specified system variable is being tracked, if so mark it as changed and also set the class's m_changed flag. diff --git a/sql/session_tracker.h b/sql/session_tracker.h index 55c78a75978..b6694970c38 100644 --- a/sql/session_tracker.h +++ b/sql/session_tracker.h @@ -198,6 +198,7 @@ class Session_sysvars_tracker: public State_tracker various operations. */ vars_list orig_list; + bool m_parsed; public: void init(THD *thd); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 97233895fd5..da04ddad49c 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -7304,6 +7304,7 @@ void THD::set_last_commit_gtid(rpl_gtid >id) #ifndef EMBEDDED_LIBRARY if (changed_gtid && session_tracker.sysvars.is_enabled()) { + DBUG_ASSERT(current_thd == this); session_tracker.sysvars. mark_as_changed(this, (LEX_CSTRING*)Sys_last_gtid_ptr); } |