summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2021-03-07 01:33:51 +0100
committerSergei Golubchik <serg@mariadb.org>2021-03-08 14:54:05 +0100
commitdc6667805dd4567693fcc01666da7d1277050097 (patch)
treeb1a3742e96820467a6921e47d09dfa26c48312e8
parent2c0b3141f354be245881d7d112dd57bd6f061ee1 (diff)
downloadmariadb-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.result10
-rw-r--r--mysql-test/t/status2.test11
-rw-r--r--sql/mysqld.cc3
-rw-r--r--sql/sql_class.h19
-rw-r--r--sql/sql_show.cc11
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);