Static current schema and state change trackers
Saves 2 new/delete per connection. Part of MDEV-14984 - regression in connect performance
This commit is contained in:
parent
01e8f3c52b
commit
47bd06d55e
@ -173,43 +173,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Current_schema_tracker,
|
|
||||||
|
|
||||||
This is a tracker class that enables & manages the tracking of current
|
|
||||||
schema for a particular connection.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Current_schema_tracker : public State_tracker
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool update(THD *thd, set_var *var);
|
|
||||||
bool store(THD *thd, String *buf);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Session_state_change_tracker
|
|
||||||
|
|
||||||
This is a boolean tracker class that will monitor any change that contributes
|
|
||||||
to a session state change.
|
|
||||||
Attributes that contribute to session state change include:
|
|
||||||
- Successful change to System variables
|
|
||||||
- User defined variables assignments
|
|
||||||
- temporary tables created, altered or deleted
|
|
||||||
- prepared statements added or removed
|
|
||||||
- change in current database
|
|
||||||
- change of current role
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Session_state_change_tracker : public State_tracker
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
bool update(THD *thd, set_var *var);
|
|
||||||
bool store(THD *thd, String *buf);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* To be used in expanding the buffer. */
|
/* To be used in expanding the buffer. */
|
||||||
static const unsigned int EXTRA_ALLOC= 1024;
|
static const unsigned int EXTRA_ALLOC= 1024;
|
||||||
|
|
||||||
@ -1379,8 +1342,10 @@ Session_tracker::Session_tracker()
|
|||||||
compile_time_assert((uint)SESSION_TRACK_always_at_the_end >=
|
compile_time_assert((uint)SESSION_TRACK_always_at_the_end >=
|
||||||
(uint)SESSION_TRACKER_END);
|
(uint)SESSION_TRACKER_END);
|
||||||
|
|
||||||
for (int i= 0; i < SESSION_TRACKER_END; i++)
|
m_trackers[SESSION_SYSVARS_TRACKER]= 0;
|
||||||
m_trackers[i]= NULL;
|
m_trackers[CURRENT_SCHEMA_TRACKER]= ¤t_schema;
|
||||||
|
m_trackers[SESSION_STATE_CHANGE_TRACKER]= &state_change;
|
||||||
|
m_trackers[TRANSACTION_INFO_TRACKER]= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1402,10 +1367,6 @@ void Session_tracker::enable(THD *thd)
|
|||||||
deinit();
|
deinit();
|
||||||
m_trackers[SESSION_SYSVARS_TRACKER]=
|
m_trackers[SESSION_SYSVARS_TRACKER]=
|
||||||
new (std::nothrow) Session_sysvars_tracker();
|
new (std::nothrow) Session_sysvars_tracker();
|
||||||
m_trackers[CURRENT_SCHEMA_TRACKER]=
|
|
||||||
new (std::nothrow) Current_schema_tracker;
|
|
||||||
m_trackers[SESSION_STATE_CHANGE_TRACKER]=
|
|
||||||
new (std::nothrow) Session_state_change_tracker;
|
|
||||||
m_trackers[TRANSACTION_INFO_TRACKER]=
|
m_trackers[TRANSACTION_INFO_TRACKER]=
|
||||||
new (std::nothrow) Transaction_state_tracker;
|
new (std::nothrow) Transaction_state_tracker;
|
||||||
|
|
||||||
|
@ -88,8 +88,18 @@ public:
|
|||||||
|
|
||||||
void reset_changed() { m_changed= false; }
|
void reset_changed() { m_changed= false; }
|
||||||
|
|
||||||
/** Called in the constructor of THD*/
|
/**
|
||||||
virtual bool enable(THD *thd) { return update(thd, 0); }
|
Called by THD::init() when new connection is being created
|
||||||
|
|
||||||
|
We may inherit m_changed from previous connection served by this THD if
|
||||||
|
connection was broken or client didn't have session tracking capability.
|
||||||
|
Thus we have to reset it here.
|
||||||
|
*/
|
||||||
|
virtual bool enable(THD *thd)
|
||||||
|
{
|
||||||
|
reset_changed();
|
||||||
|
return update(thd, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/** To be invoked when the tracker's system variable is updated (ON_UPDATE).*/
|
/** To be invoked when the tracker's system variable is updated (ON_UPDATE).*/
|
||||||
virtual bool update(THD *thd, set_var *var)= 0;
|
virtual bool update(THD *thd, set_var *var)= 0;
|
||||||
@ -101,11 +111,49 @@ public:
|
|||||||
virtual void mark_as_changed(THD *thd, LEX_CSTRING *name);
|
virtual void mark_as_changed(THD *thd, LEX_CSTRING *name);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
bool sysvartrack_validate_value(THD *thd, const char *str, size_t len);
|
bool sysvartrack_validate_value(THD *thd, const char *str, size_t len);
|
||||||
bool sysvartrack_global_update(THD *thd, char *str, size_t len);
|
bool sysvartrack_global_update(THD *thd, char *str, size_t len);
|
||||||
uchar *sysvartrack_session_value_ptr(THD *thd, const LEX_CSTRING *base);
|
uchar *sysvartrack_session_value_ptr(THD *thd, const LEX_CSTRING *base);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Current_schema_tracker,
|
||||||
|
|
||||||
|
This is a tracker class that enables & manages the tracking of current
|
||||||
|
schema for a particular connection.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Current_schema_tracker: public State_tracker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool update(THD *thd, set_var *var);
|
||||||
|
bool store(THD *thd, String *buf);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Session_state_change_tracker
|
||||||
|
|
||||||
|
This is a boolean tracker class that will monitor any change that contributes
|
||||||
|
to a session state change.
|
||||||
|
Attributes that contribute to session state change include:
|
||||||
|
- Successful change to System variables
|
||||||
|
- User defined variables assignments
|
||||||
|
- temporary tables created, altered or deleted
|
||||||
|
- prepared statements added or removed
|
||||||
|
- change in current database
|
||||||
|
- change of current role
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Session_state_change_tracker: public State_tracker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool update(THD *thd, set_var *var);
|
||||||
|
bool store(THD *thd, String *buf);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Session_tracker
|
Session_tracker
|
||||||
|
|
||||||
@ -130,22 +178,19 @@ class Session_tracker
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Current_schema_tracker current_schema;
|
||||||
|
Session_state_change_tracker state_change;
|
||||||
|
|
||||||
Session_tracker();
|
Session_tracker();
|
||||||
~Session_tracker()
|
~Session_tracker() { deinit(); }
|
||||||
{
|
|
||||||
deinit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* trick to make happy memory accounting system */
|
/* trick to make happy memory accounting system */
|
||||||
void deinit()
|
void deinit()
|
||||||
{
|
{
|
||||||
for (int i= 0; i < SESSION_TRACKER_END; i++)
|
delete m_trackers[SESSION_SYSVARS_TRACKER];
|
||||||
{
|
m_trackers[SESSION_SYSVARS_TRACKER]= 0;
|
||||||
if (m_trackers[i])
|
delete m_trackers[TRANSACTION_INFO_TRACKER];
|
||||||
delete m_trackers[i];
|
m_trackers[TRANSACTION_INFO_TRACKER]= 0;
|
||||||
m_trackers[i]= NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void enable(THD *thd);
|
void enable(THD *thd);
|
||||||
|
@ -6128,8 +6128,7 @@ static bool update_session_track_schema(sys_var *self, THD *thd,
|
|||||||
enum_var_type type)
|
enum_var_type type)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("update_session_track_schema");
|
DBUG_ENTER("update_session_track_schema");
|
||||||
DBUG_RETURN(thd->session_tracker.get_tracker(CURRENT_SCHEMA_TRACKER)->
|
DBUG_RETURN(thd->session_tracker.current_schema.update(thd, NULL));
|
||||||
update(thd, NULL));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Sys_var_mybool Sys_session_track_schema(
|
static Sys_var_mybool Sys_session_track_schema(
|
||||||
@ -6172,8 +6171,7 @@ static bool update_session_track_state_change(sys_var *self, THD *thd,
|
|||||||
enum_var_type type)
|
enum_var_type type)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("update_session_track_state_change");
|
DBUG_ENTER("update_session_track_state_change");
|
||||||
DBUG_RETURN(thd->session_tracker.get_tracker(SESSION_STATE_CHANGE_TRACKER)->
|
DBUG_RETURN(thd->session_tracker.state_change.update(thd, NULL));
|
||||||
update(thd, NULL));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Sys_var_mybool Sys_session_track_state_change(
|
static Sys_var_mybool Sys_session_track_state_change(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user