List:Commits« Previous MessageNext Message »
From:Christopher Powers Date:June 25 2010 9:03pm
Subject:Re: bzr commit into mysql-next-mr-bugfixing branch (marc.alff:3271)
Bug#54782
View as plain text  
Ok to push.

On 6/25/10 2:56 AM, Marc Alff wrote:
> #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
>
>
>
>
>
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