From e948c64ff52fda43d2a7cb59bc631e53051adc05 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Oct 2006 13:35:57 +0100 Subject: [PATCH] Improve comments around FLUSH STATUS It's not possible to flush the global status variables in 5.0 Update test case so it works by recording the value of handle_rollback before and compare it to the value after mysql-test/r/innodb_mysql.result: Update result file mysql-test/t/innodb_mysql.test: It's not possible to reset the global status variables in 5.0 so intead its value is recorded and compared to the after value. It should not have changed. sql/mysqld.cc: Improve comments sql/set_var.cc: Improve comments sql/sql_class.cc: Improve comments sql/sql_class.h: Improve comments --- mysql-test/r/innodb_mysql.result | 6 ++---- mysql-test/t/innodb_mysql.test | 9 +++++++-- sql/mysqld.cc | 10 +++++++++- sql/set_var.cc | 2 +- sql/sql_class.cc | 5 ++--- sql/sql_class.h | 9 +++++++-- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/mysql-test/r/innodb_mysql.result b/mysql-test/r/innodb_mysql.result index bce5eff5d75..ef67104378c 100644 --- a/mysql-test/r/innodb_mysql.result +++ b/mysql-test/r/innodb_mysql.result @@ -104,14 +104,12 @@ SELECT `id1` FROM `t1` WHERE `id1` NOT IN (SELECT `id1` FROM `t2` WHERE `id2` = id1 2 DROP TABLE t1, t2; -flush status; create table t1 (c1 int) engine=innodb; handler t1 open; handler t1 read first; c1 -show /*!50002 GLOBAL */ status like 'Handler_rollback'; -Variable_name Value -Handler_rollback 0 +Before and after comparison +0 drop table t1; End of 4.1 tests create table t1m (a int) engine=myisam; diff --git a/mysql-test/t/innodb_mysql.test b/mysql-test/t/innodb_mysql.test index ff3089c98cf..73ae4845c06 100644 --- a/mysql-test/t/innodb_mysql.test +++ b/mysql-test/t/innodb_mysql.test @@ -119,7 +119,8 @@ SELECT `id1` FROM `t1` WHERE `id1` NOT IN (SELECT `id1` FROM `t2` WHERE `id2` = DROP TABLE t1, t2; # Bug #22728 - Handler_rollback value is growing # -flush status; + +let $before= `show /*!50002 GLOBAL */ status like 'Handler_rollback'`; create table t1 (c1 int) engine=innodb; connect (con1,localhost,root,,); connect (con2,localhost,root,,); @@ -128,7 +129,11 @@ handler t1 open; handler t1 read first; disconnect con2; connection con1; -show /*!50002 GLOBAL */ status like 'Handler_rollback'; +let $after= `show /*!50002 GLOBAL */ status like 'Handler_rollback'`; +# Compare the before and after value, it should be equal +--disable_query_log +eval select STRCMP("$before", "$after") as "Before and after comparison"; +--enable_query_log connection default; drop table t1; disconnect con1; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 1dd15398cd1..c84e1f7ee56 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -5997,6 +5997,10 @@ The minimum value for this variable is 4096.", }; +/* + Variables shown by SHOW STATUS in alphabetical order +*/ + struct show_var_st status_vars[]= { {"Aborted_clients", (char*) &aborted_threads, SHOW_LONG}, {"Aborted_connects", (char*) &aborted_connects, SHOW_LONG}, @@ -7466,15 +7470,19 @@ void refresh_status(THD *thd) { pthread_mutex_lock(&LOCK_status); - /* We must update the global status before cleaning up the thread */ + /* Add thread's status variabes to global status */ add_to_status(&global_status_var, &thd->status_var); + + /* Reset thread's status variables */ bzero((char*) &thd->status_var, sizeof(thd->status_var)); + /* Reset some global variables */ for (struct show_var_st *ptr=status_vars; ptr->name; ptr++) { if (ptr->type == SHOW_LONG) *(ulong*) ptr->value= 0; } + /* Reset the counters of all key caches (default and named). */ process_key_caches(reset_key_cache_counters); pthread_mutex_unlock(&LOCK_status); diff --git a/sql/set_var.cc b/sql/set_var.cc index df0c69260e7..55c62a9a5a5 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -804,7 +804,7 @@ sys_var *sys_variables[]= /* - Variables shown by SHOW variables in alphabetical order + Variables shown by SHOW VARIABLES in alphabetical order */ struct show_var_st init_vars[]= { diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f5bab1d17f4..ba2f525a4a4 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -464,14 +464,13 @@ THD::~THD() void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var) { - ulong *end= (ulong*) ((byte*) to_var + offsetof(STATUS_VAR, - last_system_status_var) + + ulong *end= (ulong*) ((byte*) to_var + + offsetof(STATUS_VAR, last_system_status_var) + sizeof(ulong)); ulong *to= (ulong*) to_var, *from= (ulong*) from_var; while (to != end) *(to++)+= *(from++); - /* it doesn't make sense to add last_query_cost values */ } diff --git a/sql/sql_class.h b/sql/sql_class.h index 62cfb0119aa..c7bdfbd7ea7 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -646,12 +646,17 @@ typedef struct system_status_var ulong com_stmt_reset; ulong com_stmt_close; + /* + Status variables which it does not make sense to add to + global status variable counter + */ double last_query_cost; } STATUS_VAR; /* - This is used for 'show status'. It must be updated to the last ulong - variable in system_status_var + This is used for 'SHOW STATUS'. It must be updated to the last ulong + variable in system_status_var which is makes sens to add to the global + counter */ #define last_system_status_var com_stmt_close