diff options
author | Sergei Golubchik <serg@mariadb.org> | 2020-02-15 18:25:57 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2020-03-10 19:24:23 +0100 |
commit | 7af733a5a2cb7f79ffb5ff0129cad6db6f3cc359 (patch) | |
tree | f8f9cab2cd92e43b5fd20c9ac77f9487ece4e5a7 /storage/perfschema/pfs_variable.cc | |
parent | 81cffda2e68ea5a155b74f24ae4345388afa963c (diff) | |
download | mariadb-git-7af733a5a2cb7f79ffb5ff0129cad6db6f3cc359.tar.gz |
perfschema compilation, test and misc fixes
Diffstat (limited to 'storage/perfschema/pfs_variable.cc')
-rw-r--r-- | storage/perfschema/pfs_variable.cc | 100 |
1 files changed, 23 insertions, 77 deletions
diff --git a/storage/perfschema/pfs_variable.cc b/storage/perfschema/pfs_variable.cc index 933d6ad6ce6..3654dba2936 100644 --- a/storage/perfschema/pfs_variable.cc +++ b/storage/perfschema/pfs_variable.cc @@ -84,7 +84,7 @@ bool PFS_system_variable_cache::init_show_var_array(enum_var_type scope, bool st DBUG_ASSERT(!m_initialized); m_query_scope= scope; - mysql_rwlock_rdlock(&LOCK_system_variables_hash); + mysql_prlock_rdlock(&LOCK_system_variables_hash); DEBUG_SYNC(m_current_thd, "acquired_LOCK_system_variables_hash"); /* Record the system variable hash version to detect subsequent changes. */ @@ -96,7 +96,7 @@ bool PFS_system_variable_cache::init_show_var_array(enum_var_type scope, bool st for (int i=0; vars[i].name; i++) m_show_var_array.set(i, vars[i]); - mysql_rwlock_unlock(&LOCK_system_variables_hash); + mysql_prlock_unlock(&LOCK_system_variables_hash); /* Increase cache size if necessary. */ m_cache.reserve(m_show_var_array.elements()); @@ -152,8 +152,8 @@ bool PFS_system_variable_cache::match_scope(int scope) */ int PFS_system_variable_cache::do_materialize_global(void) { - /* Block plugins from unloading. */ - mysql_mutex_lock(&LOCK_plugin_delete); + /* Block system variable additions or deletions. */ + mysql_mutex_lock(&LOCK_global_system_variables); m_materialized= false; @@ -213,7 +213,7 @@ int PFS_system_variable_cache::do_materialize_global(void) } m_materialized= true; - mysql_mutex_unlock(&LOCK_plugin_delete); + mysql_mutex_unlock(&LOCK_global_system_variables); return 0; } @@ -247,38 +247,11 @@ int PFS_system_variable_cache::do_materialize_all(THD *unsafe_thd) for (SHOW_VAR *show_var= m_show_var_array.front(); show_var->value && (show_var != m_show_var_array.end()); show_var++) { - const char* name= show_var->name; sys_var *value= (sys_var *)show_var->value; DBUG_ASSERT(value); - bool ignore= false; - if (value->scope() == sys_var::SESSION && - (!my_strcasecmp(system_charset_info, name, "gtid_executed"))) - { - /* - GTID_EXECUTED is: - - declared in sys_vars.cc as both GLOBAL and SESSION in 5.7 - - can be read with @@session.gtid_executed - - When show_compatibility_56 = ON, - - SHOW SESSION VARIABLES does expose a row for GTID_EXECUTED - - INFORMATION_SCHEMA.SESSION_VARIABLES also does expose a row, - both are for backward compatibility of existing applications, - so that no application logic change is required. - - Now, with show_compatibility_56 = OFF (aka, in this code) - - SHOW SESSION VARIABLES does -- not -- expose a row for GTID_EXECUTED - - PERFORMANCE_SCHEMA.SESSION_VARIABLES also does -- not -- expose a row - so that a clean interface is exposed to (upgraded and modified) - applications. - - This special case needs be removed once @@SESSION.GTID_EXECUTED is - deprecated. - */ - ignore= true; - } /* Resolve value, convert to text, add to cache. */ - System_variable system_var(m_safe_thd, show_var, m_query_scope, ignore); + System_variable system_var(m_safe_thd, show_var, m_query_scope, false); m_cache.push(system_var); } @@ -303,7 +276,7 @@ void PFS_system_variable_cache::set_mem_root(void) init_sql_alloc(PSI_INSTRUMENT_ME, &m_mem_sysvar, SYSVAR_MEMROOT_BLOCK_SIZE, 0, 0); m_mem_sysvar_ptr= &m_mem_sysvar; } - m_mem_thd= my_thread_get_THR_MALLOC(); /* pointer to current THD mem_root */ + m_mem_thd= ¤t_thd->mem_root; /* pointer to current THD mem_root */ m_mem_thd_save= *m_mem_thd; /* restore later */ *m_mem_thd= &m_mem_sysvar; /* use temporary mem_root */ } @@ -376,18 +349,8 @@ int PFS_system_variable_cache::do_materialize_session(PFS_thread *pfs_thread) /* Match the system variable scope to the target scope. */ if (match_scope(value->scope())) { - const char* name= show_var->name; - bool ignore= false; - - if (value->scope() == sys_var::SESSION && - (!my_strcasecmp(system_charset_info, name, "gtid_executed"))) - { - /* Deprecated. See PFS_system_variable_cache::do_materialize_all. */ -#warning no @@gtid_executed in MariaDB - ignore= true; - } /* Resolve value, convert to text, add to cache. */ - System_variable system_var(m_safe_thd, show_var, m_query_scope, ignore); + System_variable system_var(m_safe_thd, show_var, m_query_scope, false); m_cache.push(system_var); } } @@ -439,18 +402,9 @@ int PFS_system_variable_cache::do_materialize_session(PFS_thread *pfs_thread, ui /* Match the system variable scope to the target scope. */ if (match_scope(value->scope())) { - const char* name= show_var->name; - bool ignore= false; - - if (value->scope() == sys_var::SESSION && - (!my_strcasecmp(system_charset_info, name, "gtid_executed"))) - { - /* Deprecated. See PFS_system_variable_cache::do_materialize_all. */ - ignore= true; - } /* Resolve value, convert to text, add to cache. */ - System_variable system_var(m_safe_thd, show_var, m_query_scope, ignore); - m_cache.push_back(system_var); + System_variable system_var(m_safe_thd, show_var, m_query_scope, false); + m_cache.push(system_var); } } @@ -499,17 +453,8 @@ int PFS_system_variable_cache::do_materialize_session(THD *unsafe_thd) /* Match the system variable scope to the target scope. */ if (match_scope(value->scope())) { - const char* name= show_var->name; - bool ignore= false; - - if (value->scope() == sys_var::SESSION && - (!my_strcasecmp(system_charset_info, name, "gtid_executed"))) - { - /* Deprecated. See PFS_system_variable_cache::do_materialize_all. */ - ignore= true; - } /* Resolve value, convert to text, add to cache. */ - System_variable system_var(m_safe_thd, show_var, m_query_scope, ignore); + System_variable system_var(m_safe_thd, show_var, m_query_scope, false); m_cache.push(system_var); } } @@ -575,13 +520,11 @@ void System_variable::init(THD *target_thd, const SHOW_VAR *show_var, return; } - THD *current_thread= current_thd; - /* Block remote target thread from updating this system variable. */ + /*XXX + THD *current_thread= current_thd; if (target_thd != current_thread) - /*XXX mysql_mutex_lock(&target_thd->LOCK_thd_sysvar)*/; - /* Block system variable additions or deletions. */ - mysql_mutex_lock(&LOCK_global_system_variables); + mysql_mutex_lock(&target_thd->LOCK_thd_sysvar);*/ sys_var *system_var= (sys_var *)show_var->value; DBUG_ASSERT(system_var != NULL); @@ -591,8 +534,9 @@ void System_variable::init(THD *target_thd, const SHOW_VAR *show_var, /* Get the value of the system variable. */ String buf(m_value_str, sizeof(m_value_str) - 1, system_charset_info); - system_var->val_str_nolock(&buf, target_thd, - system_var->value_ptr(target_thd, query_scope, &null_lex_str)); + if (!system_var->val_str_nolock(&buf, target_thd, + system_var->value_ptr(target_thd, query_scope, &null_clex_str))) + buf.length(0); m_value_length= MY_MIN(buf.length(), SHOW_VAR_FUNC_BUFF_SIZE); @@ -601,9 +545,9 @@ void System_variable::init(THD *target_thd, const SHOW_VAR *show_var, memcpy(m_value_str, buf.ptr(), m_value_length); m_value_str[m_value_length]= 0; - mysql_mutex_unlock(&LOCK_global_system_variables); + /*XXX if (target_thd != current_thread) - /*XXX mysql_mutex_unlock(&target_thd->LOCK_thd_sysvar)*/; + mysql_mutex_unlock(&target_thd->LOCK_thd_sysvar);*/ m_initialized= true; } @@ -1283,9 +1227,11 @@ void Status_variable::init(const SHOW_VAR *show_var, STATUS_VAR *status_vars, en m_type= show_var->type; /* Get the value of the status variable. */ - char *value= m_value_str; - m_value_length= get_one_variable(status_vars, m_type, show_var->value, &value); + const char *value; + value= get_one_variable(current_thd, show_var, query_scope, m_type, + status_vars, &m_charset, m_value_str, &m_value_length); m_value_length= MY_MIN(m_value_length, SHOW_VAR_FUNC_BUFF_SIZE); + m_charset= system_charset_info; /* Returned value may reference a string other than m_value_str. */ if (value != m_value_str) |