diff options
author | Sergei Golubchik <serg@mariadb.org> | 2021-03-07 01:33:51 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2021-03-08 14:54:05 +0100 |
commit | dc6667805dd4567693fcc01666da7d1277050097 (patch) | |
tree | b1a3742e96820467a6921e47d09dfa26c48312e8 | |
parent | 2c0b3141f354be245881d7d112dd57bd6f061ee1 (diff) | |
download | mariadb-git-dc6667805dd4567693fcc01666da7d1277050097.tar.gz |
Correct the value of global memory_used
As a special hack global memory_used isn't SHOW_LONG_STATUS
but still relies on calc_sum_of_all_status() being called.
followup for 63f91927870
-rw-r--r-- | mysql-test/r/status2.result | 10 | ||||
-rw-r--r-- | mysql-test/t/status2.test | 11 | ||||
-rw-r--r-- | sql/mysqld.cc | 3 | ||||
-rw-r--r-- | sql/sql_class.h | 19 | ||||
-rw-r--r-- | sql/sql_show.cc | 11 |
5 files changed, 40 insertions, 14 deletions
diff --git a/mysql-test/r/status2.result b/mysql-test/r/status2.result index fa0fc4e1061..60309e14fe3 100644 --- a/mysql-test/r/status2.result +++ b/mysql-test/r/status2.result @@ -74,4 +74,12 @@ DROP TRIGGER trigg1; DROP FUNCTION testQuestion; DROP EVENT ev1; DROP TABLE t1,t2; -End of 6.0 tests +# +# End of 5.5 tests +# +select variable_value < 1024*1024*1024 from information_schema.global_status where variable_name='memory_used'; +variable_value < 1024*1024*1024 +1 +# +# End of 10.2 tests +# diff --git a/mysql-test/t/status2.test b/mysql-test/t/status2.test index fa3b718efaa..ea674c2ed7c 100644 --- a/mysql-test/t/status2.test +++ b/mysql-test/t/status2.test @@ -64,5 +64,14 @@ DROP TRIGGER trigg1; DROP FUNCTION testQuestion; DROP EVENT ev1; DROP TABLE t1,t2; ---echo End of 6.0 tests + +--echo # +--echo # End of 5.5 tests +--echo # + +select variable_value < 1024*1024*1024 from information_schema.global_status where variable_name='memory_used'; + +--echo # +--echo # End of 10.2 tests +--echo # diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 4bfac5c20d1..48121ce2ea2 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -8441,8 +8441,11 @@ static int show_memory_used(THD *thd, SHOW_VAR *var, char *buff, var->type= SHOW_LONGLONG; var->value= buff; if (scope == OPT_GLOBAL) + { + calc_sum_of_all_status_if_needed(status_var); *(longlong*) buff= (status_var->global_memory_used + status_var->local_memory_used); + } else *(longlong*) buff= status_var->local_memory_used; return 0; diff --git a/sql/sql_class.h b/sql/sql_class.h index fe920270542..c47ea9c9020 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -865,11 +865,24 @@ void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var); void add_diff_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var, STATUS_VAR *dec_var); +uint calc_sum_of_all_status(STATUS_VAR *to); +static inline void calc_sum_of_all_status_if_needed(STATUS_VAR *to) +{ + if (to->local_memory_used == 0) + { + mysql_mutex_lock(&LOCK_status); + *to= global_status_var; + mysql_mutex_unlock(&LOCK_status); + calc_sum_of_all_status(to); + DBUG_ASSERT(to->local_memory_used); + } +} + /* Update global_memory_used. We have to do this with atomic_add as the global value can change outside of LOCK_status. */ -inline void update_global_memory_status(int64 size) +static inline void update_global_memory_status(int64 size) { DBUG_PRINT("info", ("global memory_used: %lld size: %lld", (longlong) global_status_var.global_memory_used, @@ -887,7 +900,7 @@ inline void update_global_memory_status(int64 size) @retval NULL on error @retval Pointter to CHARSET_INFO with the given name on success */ -inline CHARSET_INFO * +static inline CHARSET_INFO * mysqld_collation_get_by_name(const char *name, CHARSET_INFO *name_cs= system_charset_info) { @@ -906,7 +919,7 @@ mysqld_collation_get_by_name(const char *name, return cs; } -inline bool is_supported_parser_charset(CHARSET_INFO *cs) +static inline bool is_supported_parser_charset(CHARSET_INFO *cs) { return MY_TEST(cs->mbminlen == 1); } diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 3e9916816b9..7023e5fe9ea 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3580,15 +3580,8 @@ static bool show_status_array(THD *thd, const char *wild, if (show_type == SHOW_SYS) mysql_mutex_lock(&LOCK_global_system_variables); - else if (show_type >= SHOW_LONG_STATUS && scope == OPT_GLOBAL && - !status_var->local_memory_used) - { - mysql_mutex_lock(&LOCK_status); - *status_var= global_status_var; - mysql_mutex_unlock(&LOCK_status); - calc_sum_of_all_status(status_var); - DBUG_ASSERT(status_var->local_memory_used); - } + else if (show_type >= SHOW_LONG_STATUS && scope == OPT_GLOBAL) + calc_sum_of_all_status_if_needed(status_var); pos= get_one_variable(thd, var, scope, show_type, status_var, &charset, buff, &length); |