mirror of
https://github.com/MariaDB/server.git
synced 2025-07-11 15:22:09 +03:00
Cleanup session tracker
- call current_schema::mark_as_changed() directly - call state_change::mark_as_changed() directly - replaced SESSION_TRACKER_CHANGED with dummy tracker - replaced Session_tracker::mark_as_changed() with State_tracker::mark_as_changed() - hide and devirtualize original State_tracker::mark_as_changed(), rename it to set_changed() - all implementations of mark_as_changed() now check is_enabled() for consistency - no argument casts anymore
This commit is contained in:
@ -24,7 +24,7 @@
|
||||
#include "sql_plugin.h"
|
||||
#include "set_var.h"
|
||||
|
||||
void State_tracker::mark_as_changed(THD *thd, LEX_CSTRING *tracked_item_name)
|
||||
void State_tracker::set_changed(THD *thd)
|
||||
{
|
||||
m_changed= true;
|
||||
thd->lex->safe_to_cache_query= 0;
|
||||
@ -506,11 +506,12 @@ bool Session_sysvars_tracker::store(THD *thd, String *buf)
|
||||
@param [IN] pointer on a variable
|
||||
*/
|
||||
|
||||
void Session_sysvars_tracker::mark_as_changed(THD *thd,
|
||||
LEX_CSTRING *var)
|
||||
void Session_sysvars_tracker::mark_as_changed(THD *thd, const sys_var *var)
|
||||
{
|
||||
sysvar_node_st *node;
|
||||
sys_var *svar= (sys_var *)var;
|
||||
|
||||
if (!is_enabled())
|
||||
return;
|
||||
|
||||
if (!m_parsed)
|
||||
{
|
||||
@ -529,10 +530,10 @@ void Session_sysvars_tracker::mark_as_changed(THD *thd,
|
||||
Check if the specified system variable is being tracked, if so
|
||||
mark it as changed and also set the class's m_changed flag.
|
||||
*/
|
||||
if (orig_list.is_enabled() && (node= orig_list.insert_or_search(svar)))
|
||||
if (orig_list.is_enabled() && (node= orig_list.insert_or_search(var)))
|
||||
{
|
||||
node->m_changed= true;
|
||||
State_tracker::mark_as_changed(thd, var);
|
||||
set_changed(thd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -679,7 +680,7 @@ bool Transaction_state_tracker::update(THD *thd, set_var *)
|
||||
}
|
||||
if (thd->variables.session_track_transaction_info == TX_TRACK_CHISTICS)
|
||||
tx_changed |= TX_CHG_CHISTICS;
|
||||
mark_as_changed(thd, NULL);
|
||||
set_changed(thd);
|
||||
}
|
||||
else
|
||||
m_enabled= false;
|
||||
@ -1112,7 +1113,7 @@ void Transaction_state_tracker::set_read_flags(THD *thd,
|
||||
{
|
||||
tx_read_flags = flags;
|
||||
tx_changed |= TX_CHG_CHISTICS;
|
||||
mark_as_changed(thd, NULL);
|
||||
set_changed(thd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1131,7 +1132,7 @@ void Transaction_state_tracker::set_isol_level(THD *thd,
|
||||
{
|
||||
tx_isol_level = level;
|
||||
tx_changed |= TX_CHG_CHISTICS;
|
||||
mark_as_changed(thd, NULL);
|
||||
set_changed(thd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,6 +66,8 @@ protected:
|
||||
*/
|
||||
bool m_enabled;
|
||||
|
||||
void set_changed(THD *thd);
|
||||
|
||||
private:
|
||||
/** Has the session state type changed ? */
|
||||
bool m_changed;
|
||||
@ -102,7 +104,7 @@ public:
|
||||
virtual bool store(THD *thd, String *buf)= 0;
|
||||
|
||||
/** Mark the entity as changed. */
|
||||
virtual void mark_as_changed(THD *thd, LEX_CSTRING *name);
|
||||
void mark_as_changed(THD *thd) { if (is_enabled()) set_changed(thd); }
|
||||
};
|
||||
|
||||
|
||||
@ -207,7 +209,7 @@ public:
|
||||
bool enable(THD *thd);
|
||||
bool update(THD *thd, set_var *var);
|
||||
bool store(THD *thd, String *buf);
|
||||
void mark_as_changed(THD *thd, LEX_CSTRING *tracked_item_name);
|
||||
void mark_as_changed(THD *thd, const sys_var *var);
|
||||
void deinit() { orig_list.deinit(); }
|
||||
/* callback */
|
||||
static uchar *sysvars_get_key(const char *entry, size_t *length,
|
||||
@ -376,15 +378,13 @@ private:
|
||||
tx_changed &= uint(~TX_CHG_STATE);
|
||||
tx_changed |= (tx_curr_state != tx_reported_state) ? TX_CHG_STATE : 0;
|
||||
if (tx_changed != TX_CHG_NONE)
|
||||
mark_as_changed(thd, NULL);
|
||||
set_changed(thd);
|
||||
}
|
||||
};
|
||||
|
||||
#define TRANSACT_TRACKER(X) \
|
||||
do { if (thd->variables.session_track_transaction_info > TX_TRACK_NONE) \
|
||||
thd->session_tracker.transaction_info.X; } while(0)
|
||||
#define SESSION_TRACKER_CHANGED(A,B,C) \
|
||||
thd->session_tracker.mark_as_changed(A,B,C)
|
||||
|
||||
|
||||
/**
|
||||
@ -430,14 +430,6 @@ public:
|
||||
m_trackers[i]->enable(thd);
|
||||
}
|
||||
|
||||
inline void mark_as_changed(THD *thd, enum enum_session_tracker tracker,
|
||||
LEX_CSTRING *data)
|
||||
{
|
||||
if (m_trackers[tracker]->is_enabled())
|
||||
m_trackers[tracker]->mark_as_changed(thd, data);
|
||||
}
|
||||
|
||||
|
||||
void store(THD *thd, String *main_buf);
|
||||
};
|
||||
|
||||
@ -446,7 +438,20 @@ int session_tracker_init();
|
||||
#else
|
||||
|
||||
#define TRANSACT_TRACKER(X) do{}while(0)
|
||||
#define SESSION_TRACKER_CHANGED(A,B,C) do{}while(0)
|
||||
|
||||
class Session_tracker
|
||||
{
|
||||
class Dummy_tracker
|
||||
{
|
||||
public:
|
||||
void mark_as_changed(THD *thd) {}
|
||||
void mark_as_changed(THD *thd, const sys_var *var) {}
|
||||
};
|
||||
public:
|
||||
Dummy_tracker current_schema;
|
||||
Dummy_tracker state_change;
|
||||
Dummy_tracker sysvars;
|
||||
};
|
||||
|
||||
#endif //EMBEDDED_LIBRARY
|
||||
|
||||
|
@ -220,13 +220,12 @@ bool sys_var::update(THD *thd, set_var *var)
|
||||
*/
|
||||
if ((var->type == OPT_SESSION) && (!ret))
|
||||
{
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_SYSVARS_TRACKER,
|
||||
(LEX_CSTRING*)var->var);
|
||||
thd->session_tracker.sysvars.mark_as_changed(thd, var->var);
|
||||
/*
|
||||
Here MySQL sends variable name to avoid reporting change of
|
||||
the tracker itself, but we decided that it is not needed
|
||||
*/
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -907,7 +906,7 @@ int set_var_user::update(THD *thd)
|
||||
return -1;
|
||||
}
|
||||
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -957,8 +956,7 @@ int set_var_role::update(THD *thd)
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
int res= acl_setrole(thd, role.str, access);
|
||||
if (!res)
|
||||
thd->session_tracker.mark_as_changed(thd, SESSION_STATE_CHANGE_TRACKER,
|
||||
NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
return res;
|
||||
#else
|
||||
return 0;
|
||||
@ -1015,18 +1013,13 @@ int set_var_collation_client::update(THD *thd)
|
||||
character_set_results);
|
||||
|
||||
/* Mark client collation variables as changed */
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
if (thd->session_tracker.sysvars.is_enabled())
|
||||
{
|
||||
thd->session_tracker.sysvars.
|
||||
mark_as_changed(thd, (LEX_CSTRING*)Sys_character_set_client_ptr);
|
||||
thd->session_tracker.sysvars.
|
||||
mark_as_changed(thd, (LEX_CSTRING*)Sys_character_set_results_ptr);
|
||||
thd->session_tracker.sysvars.
|
||||
mark_as_changed(thd, (LEX_CSTRING*)Sys_character_set_connection_ptr);
|
||||
}
|
||||
thd->session_tracker.mark_as_changed(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
#endif //EMBEDDED_LIBRARY
|
||||
thd->session_tracker.sysvars.mark_as_changed(thd,
|
||||
Sys_character_set_client_ptr);
|
||||
thd->session_tracker.sysvars.mark_as_changed(thd,
|
||||
Sys_character_set_results_ptr);
|
||||
thd->session_tracker.sysvars.mark_as_changed(thd,
|
||||
Sys_character_set_connection_ptr);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
|
||||
thd->protocol_text.init(thd);
|
||||
thd->protocol_binary.init(thd);
|
||||
|
@ -7216,11 +7216,10 @@ void THD::set_last_commit_gtid(rpl_gtid >id)
|
||||
#endif
|
||||
m_last_commit_gtid= gtid;
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
if (changed_gtid && session_tracker.sysvars.is_enabled())
|
||||
if (changed_gtid)
|
||||
{
|
||||
DBUG_ASSERT(current_thd == this);
|
||||
session_tracker.sysvars.
|
||||
mark_as_changed(this, (LEX_CSTRING*)Sys_last_gtid_ptr);
|
||||
session_tracker.sysvars.mark_as_changed(this, Sys_last_gtid_ptr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -4685,9 +4685,7 @@ private:
|
||||
AUTHID invoker;
|
||||
|
||||
public:
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
Session_tracker session_tracker;
|
||||
#endif //EMBEDDED_LIBRARY
|
||||
/*
|
||||
Flag, mutex and condition for a thread to wait for a signal from another
|
||||
thread.
|
||||
|
@ -1089,7 +1089,7 @@ exit:
|
||||
if (unlikely(thd->db.str && cmp_db_names(&thd->db, db) && !error))
|
||||
{
|
||||
mysql_change_db_impl(thd, NULL, 0, thd->variables.collation_server);
|
||||
SESSION_TRACKER_CHANGED(thd, CURRENT_SCHEMA_TRACKER, NULL);
|
||||
thd->session_tracker.current_schema.mark_as_changed(thd);
|
||||
}
|
||||
my_dirend(dirp);
|
||||
DBUG_RETURN(error);
|
||||
@ -1650,8 +1650,8 @@ uint mysql_change_db(THD *thd, const LEX_CSTRING *new_db_name,
|
||||
mysql_change_db_impl(thd, &new_db_file_name, db_access, db_default_cl);
|
||||
|
||||
done:
|
||||
SESSION_TRACKER_CHANGED(thd, CURRENT_SCHEMA_TRACKER, NULL);
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.current_schema.mark_as_changed(thd);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -4814,7 +4814,7 @@ mysql_execute_command(THD *thd)
|
||||
*/
|
||||
if(!res && (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE))
|
||||
{
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -2874,7 +2874,7 @@ void mysql_sql_stmt_prepare(THD *thd)
|
||||
}
|
||||
else
|
||||
{
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
my_ok(thd, 0L, 0L, "Statement prepared");
|
||||
}
|
||||
change_list_savepoint.rollback(thd);
|
||||
@ -3554,7 +3554,7 @@ void mysql_sql_stmt_close(THD *thd)
|
||||
else
|
||||
{
|
||||
stmt->deallocate();
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
my_ok(thd);
|
||||
}
|
||||
}
|
||||
|
@ -10180,7 +10180,7 @@ do_continue:;
|
||||
if (table->s->tmp_table != NO_TMP_TABLE)
|
||||
{
|
||||
/* in case of alter temp table send the tracker in OK packet */
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -11481,7 +11481,7 @@ bool Sql_cmd_create_table_like::execute(THD *thd)
|
||||
ON then send session state notification in OK packet */
|
||||
if (create_info.options & HA_LEX_CREATE_TMP_TABLE)
|
||||
{
|
||||
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
|
||||
thd->session_tracker.state_change.mark_as_changed(thd);
|
||||
}
|
||||
my_ok(thd);
|
||||
}
|
||||
|
Reference in New Issue
Block a user