From: Marc Alff Date: November 21 2010 1:49pm Subject: bzr commit into mysql-trunk-bugfixing branch (marc.alff:3378) List-Archive: http://lists.mysql.com/commits/124571 Message-Id: <201011211351.oALDWuIP000944@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///Users/malff/BZR_TREE/mysql-trunk-bugfixing-merge/ based on revid:davi.arnaut@stripped 3378 Marc Alff 2010-11-21 [merge] Merge mysql-5.5-bugteam --> mysql-trunk-bugfixing added: storage/perfschema/unittest/stub_server_misc.h modified: sql/mysqld.cc storage/perfschema/pfs_lock.h storage/perfschema/unittest/pfs-t.cc storage/perfschema/unittest/pfs_instr-oom-t.cc storage/perfschema/unittest/pfs_instr-t.cc storage/perfschema/unittest/pfs_instr_class-oom-t.cc storage/perfschema/unittest/pfs_instr_class-t.cc === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-11-18 16:34:56 +0000 +++ b/sql/mysqld.cc 2010-11-21 13:48:44 +0000 @@ -323,7 +323,8 @@ static PSI_rwlock_key key_rwlock_openssl /* the default log output is log tables */ static bool lower_case_table_names_used= 0; static bool volatile select_thread_in_use, signal_thread_in_use; -static bool volatile ready_to_exit; +/* See Bug#56666 and Bug#56760 */; +volatile bool ready_to_exit; static my_bool opt_debugging= 0, opt_external_locking= 0, opt_console= 0; static my_bool opt_short_log_format= 0; static uint kill_cached_threads, wake_thread; === modified file 'storage/perfschema/pfs_lock.h' --- a/storage/perfschema/pfs_lock.h 2010-07-23 19:03:52 +0000 +++ b/storage/perfschema/pfs_lock.h 2010-11-21 13:48:44 +0000 @@ -146,7 +146,25 @@ struct pfs_lock */ void allocated_to_free(void) { - DBUG_ASSERT(m_state == PFS_LOCK_ALLOCATED); +#ifndef DBUG_OFF + extern volatile bool ready_to_exit; +#endif + + /* + If this record is not in the ALLOCATED state and the caller is trying + to free it, this is a bug: the caller is confused, + and potentially damaging data owned by another thread or object. + The correct assert to use here to guarantee data integrity is simply: + DBUG_ASSERT(m_state == PFS_LOCK_ALLOCATED); + Now, because of Bug#56666 (Race condition between the server main thread + and the kill server thread), this assert actually fails during shutdown, + and the failure is legitimate, on concurrent calls to mysql_*_destroy(), + when destroying the instrumentation of an object ... twice. + During shutdown this has no consequences for the performance schema, + so the assert is relaxed with the "|| ready_to_exit" condition as a work + around until Bug#56666 is fixed. + */ + DBUG_ASSERT((m_state == PFS_LOCK_ALLOCATED) || ready_to_exit); PFS_atomic::store_32(&m_state, PFS_LOCK_FREE); } === modified file 'storage/perfschema/unittest/pfs-t.cc' --- a/storage/perfschema/unittest/pfs-t.cc 2010-07-23 19:03:52 +0000 +++ b/storage/perfschema/unittest/pfs-t.cc 2010-11-21 13:48:44 +0000 @@ -25,6 +25,7 @@ #include #include "stub_print_error.h" +#include "stub_server_misc.h" /* test helpers, to simulate the setup */ === modified file 'storage/perfschema/unittest/pfs_instr-oom-t.cc' --- a/storage/perfschema/unittest/pfs_instr-oom-t.cc 2010-07-23 19:03:52 +0000 +++ b/storage/perfschema/unittest/pfs_instr-oom-t.cc 2010-11-21 13:48:44 +0000 @@ -21,6 +21,7 @@ #include #include "stub_pfs_global.h" +#include "stub_server_misc.h" void test_oom() { === modified file 'storage/perfschema/unittest/pfs_instr-t.cc' --- a/storage/perfschema/unittest/pfs_instr-t.cc 2010-07-30 09:02:32 +0000 +++ b/storage/perfschema/unittest/pfs_instr-t.cc 2010-11-21 13:48:44 +0000 @@ -22,6 +22,8 @@ #include +#include "stub_server_misc.h" + void test_no_instruments() { int rc; === modified file 'storage/perfschema/unittest/pfs_instr_class-oom-t.cc' --- a/storage/perfschema/unittest/pfs_instr_class-oom-t.cc 2010-07-16 01:28:30 +0000 +++ b/storage/perfschema/unittest/pfs_instr_class-oom-t.cc 2010-11-21 13:48:44 +0000 @@ -20,6 +20,7 @@ #include #include "stub_pfs_global.h" +#include "stub_server_misc.h" void test_oom() { === modified file 'storage/perfschema/unittest/pfs_instr_class-t.cc' --- a/storage/perfschema/unittest/pfs_instr_class-t.cc 2010-07-23 17:08:41 +0000 +++ b/storage/perfschema/unittest/pfs_instr_class-t.cc 2010-11-21 13:48:44 +0000 @@ -21,6 +21,8 @@ #include #include +#include "stub_server_misc.h" + void test_no_registration() { int rc; === added file 'storage/perfschema/unittest/stub_server_misc.h' --- a/storage/perfschema/unittest/stub_server_misc.h 1970-01-01 00:00:00 +0000 +++ b/storage/perfschema/unittest/stub_server_misc.h 2010-11-16 08:36:42 +0000 @@ -0,0 +1,21 @@ +/* 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, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Minimal code to be able to link a unit test. +*/ + +volatile bool ready_to_exit= false; + No bundle (reason: revision is a merge).