List:Commits« Previous MessageNext Message »
From:Marc Alff Date:June 25 2010 7:56am
Subject:bzr commit into mysql-next-mr-bugfixing branch (marc.alff:3271) Bug#54782
View as plain text  
#At file:///Users/malff/BZR_TREE/mysql-next-mr-bugfixing-54782/ based on revid:martin.hansson@stripped

 3271 Marc Alff	2010-06-25
      Bug#54782 Performance schema per thread accounting and thread cache
      
      Before this fix, when using the performance schema with the thread cache,
      a thread executing connection A, then cached, then executing connection B
      would account B actions with the statistics for A.
      
      With this fix:
      - the instrumentation for connection A is cleaned up when A completes,
      - a new instrumentation for connection B is created when B is executed
        from a cached thread.

    added:
      mysql-test/suite/perfschema/r/thread_cache.result
      mysql-test/suite/perfschema/t/thread_cache.test
    modified:
      sql/mysqld.cc
=== 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-06-25 07:56:10 +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;

=== 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-06-25 07:56:10 +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-06-21 07:58:54 +0000
+++ b/sql/mysqld.cc	2010-06-25 07:56:10 +0000
@@ -2143,6 +2143,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--;
@@ -2155,6 +2165,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


Attachment: [text/bzr-bundle] bzr/marc.alff@oracle.com-20100625075610-27xj7tqnalz417o0.bundle
Thread
bzr commit into mysql-next-mr-bugfixing branch (marc.alff:3271) Bug#54782Marc Alff25 Jun
  • Re: bzr commit into mysql-next-mr-bugfixing branch (marc.alff:3271)Bug#54782Christopher Powers25 Jun