From: Marc Alff Date: July 16 2010 2:44pm Subject: bzr push into mysql-trunk-bugfixing branch (marc.alff:3119 to 3124) Bug#53255 List-Archive: http://lists.mysql.com/commits/113761 X-Bug: 53255 Message-Id: <20100716144422.5225D45E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5612478897488806733==" --===============5612478897488806733== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3124 Marc Alff 2010-07-16 Bug#53255 Installed psi headers in wrong directory Backport from mysql-next-mr (5.6) to mysql-trunk (5.5) modified: include/Makefile.am 3123 Marc Alff 2010-07-16 Bug#53392 Tests: perfschema.query_cache fails Backport from mysql-next-mr (5.6) to mysql-trunk (5.5) modified: mysql-test/suite/perfschema/r/query_cache.result mysql-test/suite/perfschema/t/query_cache.test 3122 Marc Alff 2010-07-16 Bug#53394 Tests: perfschema.myisam_file_io fails Backport from mysql-next-mr (5.6) to mysql-trunk (5.5) modified: mysql-test/suite/perfschema/r/myisam_file_io.result mysql-test/suite/perfschema/t/myisam_file_io.test 3121 Marc Alff 2010-07-16 Bug#54467 performance schema complains of wrong structure in bootstrap mode Backport from mysql-next-mr (5.6) to mysql-trunk (5.5) modified: sql/mysqld.cc 3120 Marc Alff 2010-07-16 Bug#54782 Performance schema per thread accounting and thread cache Backport from mysql-next-mr (5.6) to mysql-trunk (5.5) added: mysql-test/suite/perfschema/r/thread_cache.result mysql-test/suite/perfschema/t/thread_cache.test modified: sql/mysqld.cc 3119 Marc Alff 2010-07-15 Bug#52134 performance schema file io, symlink in path Backport from mysql-next-mr (5.6) to mysql-trunk (5.5) modified: storage/perfschema/pfs_instr.cc === modified file 'include/Makefile.am' --- a/include/Makefile.am 2010-07-15 11:13:30 +0000 +++ b/include/Makefile.am 2010-07-16 14:43:04 +0000 @@ -1,4 +1,4 @@ -# Copyright (C) 2000-2006 MySQL AB, 2009 Sun Microsystems, Inc +# Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public @@ -15,6 +15,8 @@ # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, # MA 02111-1307, USA +pkgpsiincludedir = $(pkgincludedir)/psi + BUILT_SOURCES = $(HEADERS_GEN_MAKE) link_sources probes_mysql_nodtrace.h HEADERS_GEN_CONFIGURE = mysql_version.h HEADERS_GEN_MAKE = my_config.h @@ -25,8 +27,6 @@ pkginclude_HEADERS = $(HEADERS_ABI) my_d my_xml.h mysql_embed.h mysql/services.h \ mysql/service_my_snprintf.h mysql/service_thd_alloc.h \ my_pthread.h my_no_pthread.h \ - mysql/psi/psi.h mysql/psi/mysql_thread.h \ - mysql/psi/mysql_file.h \ decimal.h errmsg.h my_global.h my_net.h \ my_getopt.h sslopt-longopts.h my_dir.h \ sslopt-vars.h sslopt-case.h sql_common.h keycache.h \ @@ -47,6 +47,9 @@ noinst_HEADERS = config-win.h lf.h my_bi atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h \ atomic/solaris.h mysql/innodb_priv.h +pkgpsiinclude_HEADERS = mysql/psi/psi.h mysql/psi/mysql_thread.h \ + mysql/psi/mysql_file.h + EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp probes_mysql.d.base \ CMakeLists.txt \ mysql/psi/psi_abi_v1.h.pp \ === modified file 'mysql-test/suite/perfschema/r/myisam_file_io.result' --- a/mysql-test/suite/perfschema/r/myisam_file_io.result 2010-01-12 01:47:27 +0000 +++ b/mysql-test/suite/perfschema/r/myisam_file_io.result 2010-07-16 14:21:07 +0000 @@ -4,6 +4,7 @@ update performance_schema.SETUP_INSTRUME update performance_schema.SETUP_CONSUMERS set enabled='YES'; truncate table performance_schema.EVENTS_WAITS_HISTORY_LONG; +flush status; drop table if exists test.no_index_tab; create table test.no_index_tab ( a varchar(255), b int ) engine=myisam; insert into no_index_tab set a = 'foo', b = 1; === modified file 'mysql-test/suite/perfschema/r/query_cache.result' --- a/mysql-test/suite/perfschema/r/query_cache.result 2010-01-12 01:47:27 +0000 +++ b/mysql-test/suite/perfschema/r/query_cache.result 2010-07-16 14:28:19 +0000 @@ -4,6 +4,7 @@ insert into t1 values (1), (2), (3); SET GLOBAL query_cache_size=1355776; flush query cache; reset query cache; +flush status; select * from t1; a 1 === added file 'mysql-test/suite/perfschema/r/thread_cache.result' --- a/mysql-test/suite/perfschema/r/thread_cache.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/thread_cache.result 2010-07-16 13:50:50 +0000 @@ -0,0 +1,34 @@ +SET @saved_thread_cache_size = @@global.thread_cache_size; +set global thread_cache_size = 0; +show variables like "thread_cache_size"; +Variable_name Value +thread_cache_size 0 +select @id_increment; +@id_increment +1 +select @thread_id_increment; +@thread_id_increment +1 +select @id_increment; +@id_increment +1 +select @thread_id_increment; +@thread_id_increment +1 +set global thread_cache_size = 100; +show variables like "thread_cache_size"; +Variable_name Value +thread_cache_size 100 +select @id_increment; +@id_increment +1 +select @thread_id_increment; +@thread_id_increment +1 +select @id_increment; +@id_increment +1 +select @thread_id_increment; +@thread_id_increment +1 +set global thread_cache_size = @saved_thread_cache_size; === modified file 'mysql-test/suite/perfschema/t/myisam_file_io.test' --- a/mysql-test/suite/perfschema/t/myisam_file_io.test 2010-01-12 01:47:27 +0000 +++ b/mysql-test/suite/perfschema/t/myisam_file_io.test 2010-07-16 14:21:07 +0000 @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Sun Microsystems, Inc +# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -10,8 +10,8 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA # Tests for PERFORMANCE_SCHEMA @@ -29,6 +29,9 @@ update performance_schema.SETUP_CONSUMER truncate table performance_schema.EVENTS_WAITS_HISTORY_LONG; +# Reset lost counters to a known state +flush status; + # Code to test --disable_warnings === modified file 'mysql-test/suite/perfschema/t/query_cache.test' --- a/mysql-test/suite/perfschema/t/query_cache.test 2010-01-12 01:47:27 +0000 +++ b/mysql-test/suite/perfschema/t/query_cache.test 2010-07-16 14:28:19 +0000 @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Sun Microsystems, Inc +# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -10,8 +10,8 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA # Tests for PERFORMANCE_SCHEMA @@ -33,6 +33,8 @@ SET GLOBAL query_cache_size=1355776; flush query cache; reset query cache; +# Reset Qcache_* to a known state +flush status; select * from t1; === added file 'mysql-test/suite/perfschema/t/thread_cache.test' --- a/mysql-test/suite/perfschema/t/thread_cache.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/thread_cache.test 2010-07-16 13:50:50 +0000 @@ -0,0 +1,134 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +# Tests for PERFORMANCE_SCHEMA + +--source include/not_embedded.inc +--source include/have_perfschema.inc + +# Setup + +SET @saved_thread_cache_size = @@global.thread_cache_size; + +set global thread_cache_size = 0; + +show variables like "thread_cache_size"; + +connect (con1, localhost, root, , ); + +let $con1_ID=`select connection_id()`; + +let $con1_THREAD_ID=`select thread_id from performance_schema.PROCESSLIST + where ID = connection_id()`; + +connect (con2, localhost, root, , ); + +let $con2_ID=`select connection_id()`; + +let $con2_THREAD_ID=`select thread_id from performance_schema.PROCESSLIST + where ID = connection_id()`; + +connection default; + +--disable_query_log +eval select ($con2_ID - $con1_ID) into @id_increment; +eval select ($con2_THREAD_ID - $con1_THREAD_ID) into @thread_id_increment; +--enable_query_log + +# Expect 1, connection_id() is incremented for each new connection +select @id_increment; +# Expect 1, THREAD_ID is incremented for each new connection +select @thread_id_increment; + +disconnect con2; + +connect (con3, localhost, root, , ); + +let $con3_ID=`select connection_id()`; + +let $con3_THREAD_ID=`select thread_id from performance_schema.PROCESSLIST + where ID = connection_id()`; + +disconnect con3; +disconnect con1; + +connection default; + +--disable_query_log +eval select ($con3_ID - $con2_ID) into @id_increment; +eval select ($con3_THREAD_ID - $con2_THREAD_ID) into @thread_id_increment; +--enable_query_log + +select @id_increment; +select @thread_id_increment; + +set global thread_cache_size = 100; + +show variables like "thread_cache_size"; + +connect (con1, localhost, root, , ); + +let $con1_ID=`select connection_id()`; + +let $con1_THREAD_ID=`select thread_id from performance_schema.PROCESSLIST + where ID = connection_id()`; + +connect (con2, localhost, root, , ); + +let $con2_ID=`select connection_id()`; + +let $con2_THREAD_ID=`select thread_id from performance_schema.PROCESSLIST + where ID = connection_id()`; + +connection default; + +--disable_query_log +eval select ($con2_ID - $con1_ID) into @id_increment; +eval select ($con2_THREAD_ID - $con1_THREAD_ID) into @thread_id_increment; +--enable_query_log + +select @id_increment; +select @thread_id_increment; + +disconnect con2; + +connect (con3, localhost, root, , ); + +let $con3_ID=`select connection_id()`; + +let $con3_THREAD_ID=`select thread_id from performance_schema.PROCESSLIST + where ID = connection_id()`; + +disconnect con3; +disconnect con1; + +connection default; + +--disable_query_log +eval select ($con3_ID - $con2_ID) into @id_increment; +eval select ($con3_THREAD_ID - $con2_THREAD_ID) into @thread_id_increment; +--enable_query_log + +# When caching threads, the pthread that executed con2 was parked in the +# cache on disconnect, and then picked up con3. + +# Still expect a new connection_id() +select @id_increment; + +# And expect a new instrumentation: the THREAD_ID of old connections should not be reused. +select @thread_id_increment; + +set global thread_cache_size = @saved_thread_cache_size; + === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-07-15 11:13:30 +0000 +++ b/sql/mysqld.cc 2010-07-16 14:01:47 +0000 @@ -1,4 +1,4 @@ -/* Copyright 2000-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. +/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -741,7 +741,15 @@ void Buffered_log::print() sql_print_warning("Buffered warning: %s\n", m_message.c_ptr_safe()); break; case INFORMATION_LEVEL: - sql_print_information("Buffered information: %s\n", m_message.c_ptr_safe()); + /* + Messages printed as "information" still end up in the mysqld *error* log, + but with a [Note] tag instead of an [ERROR] tag. + While this is probably fine for a human reading the log, + it is upsetting existing automated scripts used to parse logs, + because such scripts are likely to not already handle [Note] properly. + INFORMATION_LEVEL messages are simply silenced, on purpose, + to avoid un needed verbosity. + */ break; } } @@ -2068,6 +2076,16 @@ static bool cache_thread() /* Don't kill the thread, just put it in cache for reuse */ DBUG_PRINT("info", ("Adding thread to cache")); cached_thread_count++; + +#ifdef HAVE_PSI_INTERFACE + /* + Delete the instrumentation for the job that just completed, + before parking this pthread in the cache (blocked on COND_thread_cache). + */ + if (likely(PSI_server != NULL)) + PSI_server->delete_current_thread(); +#endif + while (!abort_loop && ! wake_thread && ! kill_cached_threads) mysql_cond_wait(&COND_thread_cache, &LOCK_thread_count); cached_thread_count--; @@ -2080,6 +2098,21 @@ static bool cache_thread() thd= thread_cache.get(); thd->thread_stack= (char*) &thd; // For store_globals (void) thd->store_globals(); + +#ifdef HAVE_PSI_INTERFACE + /* + Create new instrumentation for the new THD job, + and attach it to this running pthread. + */ + if (likely(PSI_server != NULL)) + { + PSI_thread *psi= PSI_server->new_thread(key_thread_one_connection, + thd, thd->thread_id); + if (likely(psi != NULL)) + PSI_server->set_thread(psi); + } +#endif + /* THD::mysys_var::abort is associated with physical thread rather than with THD object. So we need to reset this flag before using @@ -4252,16 +4285,6 @@ int mysqld_main(int argc, char **argv) buffered_logs.buffer(WARNING_LEVEL, "Performance schema disabled (reason: init failed)."); } - else - { - buffered_logs.buffer(INFORMATION_LEVEL, - "Performance schema enabled."); - } - } - else - { - buffered_logs.buffer(INFORMATION_LEVEL, - "Performance schema disabled (reason: start parameters)."); } } #else @@ -4525,7 +4548,14 @@ int mysqld_main(int argc, char **argv) #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE initialize_performance_schema_acl(opt_bootstrap); - check_performance_schema(); + /* + Do not check the structure of the performance schema tables + during bootstrap: + - the tables are not supposed to exist yet, bootstrap will create them + - a check would print spurious error messages + */ + if (! opt_bootstrap) + check_performance_schema(); #endif initialize_information_schema_acl(); --===============5612478897488806733== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/marc.alff@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: marc.alff@stripped # target_branch: file:///home/malff/BZR_TREE/mysql-trunk-bugfixing-\ # cleanup/ # testament_sha1: ef93f9c6acb2e7ac5065d8c4e982eb5bbfa91d62 # timestamp: 2010-07-16 08:44:22 -0600 # base_revision_id: marc.alff@stripped\ # pvjmx5781nvhr3vb # # Begin bundle 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 --===============5612478897488806733==--