Skip to content

Commit 2be28a9

Browse files
committed
Cleanup session tracker API
- Session_sysvars_tracker::server_init_check() -> sysvartrack_validate_value() - Session_sysvars_tracker::check_var_list() -> sysvartrack_validate_value() - Session_sysvars_tracker::server_init_process() -> sysvartrack_global_update() - sysvartrack_reprint_value() -> sysvartrack_global_update() - sysvartrack_value_len() -> sysvartrack_session_value_ptr() - sysvartrack_value_construct() -> sysvartrack_session_value_ptr() - sysvartrack_update() -> Session_sysvars_tracker::update() - Session_tracker::server_boot_verify() -> session_tracker_init() - sysvar_tracker() -> /dev/null Part of MDEV-14984 - regression in connect performance
1 parent 19d5ddc commit 2be28a9

File tree

4 files changed

+56
-117
lines changed

4 files changed

+56
-117
lines changed

sql/mysqld.cc

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5420,14 +5420,8 @@ static int init_server_components()
54205420
#endif
54215421

54225422
#ifndef EMBEDDED_LIBRARY
5423-
{
5424-
if (Session_tracker::server_boot_verify(system_charset_info))
5425-
{
5426-
sql_print_error("The variable session_track_system_variables has "
5427-
"invalid values.");
5428-
unireg_abort(1);
5429-
}
5430-
}
5423+
if (session_tracker_init())
5424+
return 1;
54315425
#endif //EMBEDDED_LIBRARY
54325426

54335427
/* we do want to exit if there are any other unknown options */

sql/session_tracker.cc

Lines changed: 46 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -190,28 +190,6 @@ class Session_sysvars_tracker : public State_tracker
190190
return orig_list->construct_var_list(buf, buf_len);
191191
}
192192

193-
/**
194-
Method used to check the validity of string provided
195-
for session_track_system_variables during the server
196-
startup.
197-
*/
198-
static bool server_init_check(THD *thd, CHARSET_INFO *char_set,
199-
LEX_STRING var_list)
200-
{
201-
return check_var_list(thd, var_list, false, char_set, false);
202-
}
203-
204-
static bool server_init_process(THD *thd, CHARSET_INFO *char_set,
205-
LEX_STRING var_list)
206-
{
207-
vars_list dummy;
208-
bool result;
209-
result= dummy.parse_var_list(thd, var_list, false, char_set, false);
210-
if (!result)
211-
dummy.construct_var_list(var_list.str, var_list.length + 1);
212-
return result;
213-
}
214-
215193
bool enable(THD *thd);
216194
bool update(THD *thd, set_var *var);
217195
bool store(THD *thd, String *buf);
@@ -220,8 +198,7 @@ class Session_sysvars_tracker : public State_tracker
220198
static uchar *sysvars_get_key(const char *entry, size_t *length,
221199
my_bool not_used __attribute__((unused)));
222200

223-
static bool check_var_list(THD *thd, LEX_STRING var_list, bool throw_error,
224-
CHARSET_INFO *char_set, bool take_mutex);
201+
friend bool sysvartrack_global_update(THD *thd, char *str, size_t len);
225202
};
226203

227204

@@ -442,12 +419,9 @@ bool Session_sysvars_tracker::vars_list::parse_var_list(THD *thd,
442419
}
443420

444421

445-
bool Session_sysvars_tracker::check_var_list(THD *thd,
446-
LEX_STRING var_list,
447-
bool throw_error,
448-
CHARSET_INFO *char_set,
449-
bool take_mutex)
422+
bool sysvartrack_validate_value(THD *thd, const char *str, size_t len)
450423
{
424+
LEX_STRING var_list= { (char *) str, len };
451425
const char separator= ',';
452426
char *token, *lasts= NULL;
453427
size_t rest= var_list.length;
@@ -466,7 +440,7 @@ bool Session_sysvars_tracker::check_var_list(THD *thd,
466440
token value. Hence the mutex is handled here to avoid a performance
467441
overhead.
468442
*/
469-
if (!thd || take_mutex)
443+
if (!thd)
470444
mysql_mutex_lock(&LOCK_plugin);
471445
for (;;)
472446
{
@@ -484,32 +458,22 @@ bool Session_sysvars_tracker::check_var_list(THD *thd,
484458
var.length= rest;
485459

486460
/* Remove leading/trailing whitespace. */
487-
trim_whitespace(char_set, &var);
461+
trim_whitespace(system_charset_info, &var);
488462

489463
if(!strcmp(var.str, "*") &&
490-
!find_sys_var_ex(thd, var.str, var.length, throw_error, true))
464+
!find_sys_var_ex(thd, var.str, var.length, false, true))
491465
{
492-
if (throw_error && take_mutex && thd)
493-
{
494-
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
495-
ER_WRONG_VALUE_FOR_VAR,
496-
"%.*s is not a valid system variable and will"
497-
"be ignored.", (int)var.length, token);
498-
}
499-
else
500-
{
501-
if (!thd || take_mutex)
502-
mysql_mutex_unlock(&LOCK_plugin);
503-
return true;
504-
}
466+
if (!thd)
467+
mysql_mutex_unlock(&LOCK_plugin);
468+
return true;
505469
}
506470

507471
if (lasts)
508472
token= lasts + 1;
509473
else
510474
break;
511475
}
512-
if (!thd || take_mutex)
476+
if (!thd)
513477
mysql_mutex_unlock(&LOCK_plugin);
514478

515479
return false;
@@ -804,38 +768,50 @@ void Session_sysvars_tracker::vars_list::reset()
804768
at(i)->m_changed= false;
805769
}
806770

807-
static Session_sysvars_tracker* sysvar_tracker(THD *thd)
808-
{
809-
return (Session_sysvars_tracker*)
810-
thd->session_tracker.get_tracker(SESSION_SYSVARS_TRACKER);
811-
}
812771

813-
bool sysvartrack_validate_value(THD *thd, const char *str, size_t len)
814-
{
815-
LEX_STRING tmp= {(char *)str, len};
816-
return Session_sysvars_tracker::server_init_check(thd, system_charset_info,
817-
tmp);
818-
}
819-
bool sysvartrack_reprint_value(THD *thd, char *str, size_t len)
772+
bool sysvartrack_global_update(THD *thd, char *str, size_t len)
820773
{
821-
LEX_STRING tmp= {str, len};
822-
return Session_sysvars_tracker::server_init_process(thd,
823-
system_charset_info,
824-
tmp);
825-
}
826-
bool sysvartrack_update(THD *thd, set_var *var)
827-
{
828-
return sysvar_tracker(thd)->update(thd, var);
774+
LEX_STRING tmp= { str, len };
775+
Session_sysvars_tracker::vars_list dummy;
776+
if (!dummy.parse_var_list(thd, tmp, false, system_charset_info, false))
777+
{
778+
dummy.construct_var_list(str, len + 1);
779+
return false;
780+
}
781+
return true;
829782
}
830-
size_t sysvartrack_value_len(THD *thd)
783+
784+
785+
uchar *sysvartrack_session_value_ptr(THD *thd, const LEX_CSTRING *base)
831786
{
832-
return sysvar_tracker(thd)->get_buffer_length();
787+
Session_sysvars_tracker *tracker= static_cast<Session_sysvars_tracker*>
788+
(thd->session_tracker.get_tracker(SESSION_SYSVARS_TRACKER));
789+
size_t len= tracker->get_buffer_length();
790+
char *res= (char*) thd->alloc(len + sizeof(char*));
791+
if (res)
792+
{
793+
char *buf= res + sizeof(char*);
794+
*((char**) res)= buf;
795+
tracker->construct_var_list(buf, len);
796+
}
797+
return (uchar*) res;
833798
}
834-
bool sysvartrack_value_construct(THD *thd, char *val, size_t len)
799+
800+
801+
int session_tracker_init()
835802
{
836-
return sysvar_tracker(thd)->construct_var_list(val, len);
803+
if (sysvartrack_validate_value(0,
804+
global_system_variables.session_track_system_variables,
805+
safe_strlen(global_system_variables.session_track_system_variables)))
806+
{
807+
sql_print_error("The variable session_track_system_variables has "
808+
"invalid values.");
809+
return 1;
810+
}
811+
return 0;
837812
}
838813

814+
839815
///////////////////////////////////////////////////////////////////////////////
840816

841817
/**
@@ -1477,26 +1453,6 @@ void Session_tracker::enable(THD *thd)
14771453
}
14781454

14791455

1480-
/**
1481-
Method called during the server startup to verify the contents
1482-
of @@session_track_system_variables.
1483-
1484-
@retval false Success
1485-
@retval true Failure
1486-
*/
1487-
1488-
bool Session_tracker::server_boot_verify(CHARSET_INFO *char_set)
1489-
{
1490-
bool result;
1491-
LEX_STRING tmp;
1492-
tmp.str= global_system_variables.session_track_system_variables;
1493-
tmp.length= safe_strlen(tmp.str);
1494-
result=
1495-
Session_sysvars_tracker::server_init_check(NULL, char_set, tmp);
1496-
return result;
1497-
}
1498-
1499-
15001456
/**
15011457
@brief Store all change information in the specified buffer.
15021458

sql/session_tracker.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,8 @@ class State_tracker
103103
};
104104

105105
bool sysvartrack_validate_value(THD *thd, const char *str, size_t len);
106-
bool sysvartrack_reprint_value(THD *thd, char *str, size_t len);
107-
bool sysvartrack_update(THD *thd, set_var *var);
108-
size_t sysvartrack_value_len(THD *thd);
109-
bool sysvartrack_value_construct(THD *thd, char *val, size_t len);
106+
bool sysvartrack_global_update(THD *thd, char *str, size_t len);
107+
uchar *sysvartrack_session_value_ptr(THD *thd, const LEX_CSTRING *base);
110108

111109

112110
/**
@@ -152,7 +150,6 @@ class Session_tracker
152150
}
153151

154152
void enable(THD *thd);
155-
static bool server_boot_verify(CHARSET_INFO *char_set);
156153

157154
/** Returns the pointer to the tracker object for the specified tracker. */
158155
inline State_tracker *get_tracker(enum_session_tracker tracker) const
@@ -296,6 +293,8 @@ class Transaction_state_tracker : public State_tracker
296293
->X; } } while(0)
297294
#define SESSION_TRACKER_CHANGED(A,B,C) \
298295
thd->session_tracker.mark_as_changed(A,B,C)
296+
297+
int session_tracker_init();
299298
#else
300299

301300
#define TRANSACT_TRACKER(X) do{}while(0)

sql/sys_vars.ic

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ public:
615615
char *new_val= global_update_prepare(thd, var);
616616
if (new_val)
617617
{
618-
if (sysvartrack_reprint_value(thd, new_val,
618+
if (sysvartrack_global_update(thd, new_val,
619619
var->save_result.string_value.length))
620620
new_val= 0;
621621
}
@@ -624,7 +624,8 @@ public:
624624
}
625625
bool session_update(THD *thd, set_var *var)
626626
{
627-
return sysvartrack_update(thd, var);
627+
return thd->session_tracker.get_tracker(SESSION_SYSVARS_TRACKER)->
628+
update(thd, var);
628629
}
629630
void session_save_default(THD *thd, set_var *var)
630631
{
@@ -644,18 +645,7 @@ public:
644645
}
645646
}
646647
uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base)
647-
{
648-
DBUG_ASSERT(thd != NULL);
649-
size_t len= sysvartrack_value_len(thd);
650-
char *res= (char *)thd->alloc(len + sizeof(char *));
651-
if (res)
652-
{
653-
char *buf= res + sizeof(char *);
654-
*((char**) res)= buf;
655-
sysvartrack_value_construct(thd, buf, len);
656-
}
657-
return (uchar *)res;
658-
}
648+
{ return sysvartrack_session_value_ptr(thd, base); }
659649
};
660650
#endif //EMBEDDED_LIBRARY
661651

0 commit comments

Comments
 (0)