From: Marc Alff Date: March 7 2010 6:54pm Subject: bzr push into mysql-6.0-codebase-bugfixing branch (marc.alff:3795 to 3796) List-Archive: http://lists.mysql.com/commits/102526 Message-Id: <20100307185503.71FC845E80@linux-su11.site> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5323690596981701434==" --===============5323690596981701434== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3796 Marc Alff 2010-03-07 [merge] Manual merge mysql-next-mr-bugfixing (revno 3124) --> mysql-6.0-codebase-bugfixing added: mysql-test/suite/perfschema/r/pfs_upgrade.result mysql-test/suite/perfschema/t/pfs_upgrade.test modified: include/mysql/psi/mysql_thread.h mysql-test/suite/perfschema/r/binlog_mix.result mysql-test/suite/perfschema/r/binlog_row.result mysql-test/suite/perfschema/r/dml_setup_instruments.result scripts/mysql_system_tables.sql sql/mdl.cc sql/mdl.h storage/perfschema/pfs_instr.cc storage/perfschema/unittest/pfs-t.cc 3795 Bjorn Munch 2010-03-06 [merge] upmerge 51511 modified: mysql-test/lib/v1/mysql-test-run.pl === modified file 'include/mysql/psi/mysql_thread.h' --- a/include/mysql/psi/mysql_thread.h 2009-12-01 01:33:55 +0000 +++ b/include/mysql/psi/mysql_thread.h 2010-03-07 18:54:05 +0000 @@ -107,6 +107,22 @@ struct st_mysql_rwlock }; /** + An instrumented prlock structure. + @sa mysql_prlock_t +*/ +struct st_mysql_prlock +{ + /** The real prlock */ + rw_pr_lock_t m_prlock; + /** + The instrumentation hook. + Note that this hook is not conditionally defined, + for binary compatibility of the @c mysql_rwlock_t interface. + */ + struct PSI_rwlock *m_psi; +}; + +/** Type of an instrumented rwlock. @c mysql_rwlock_t is a drop-in replacement for @c pthread_rwlock_t. @sa mysql_rwlock_init @@ -120,6 +136,20 @@ struct st_mysql_rwlock typedef struct st_mysql_rwlock mysql_rwlock_t; /** + Type of an instrumented prlock. + A prlock is a read write lock that 'prefers readers' (pr). + @c mysql_prlock_t is a drop-in replacement for @c rw_pr_lock_t. + @sa mysql_prlock_init + @sa mysql_prlock_rdlock + @sa mysql_prlock_tryrdlock + @sa mysql_prlock_wrlock + @sa mysql_prlock_trywrlock + @sa mysql_prlock_unlock + @sa mysql_prlock_destroy +*/ +typedef struct st_mysql_prlock mysql_prlock_t; + +/** An instrumented cond structure. @sa mysql_cond_t */ @@ -312,6 +342,19 @@ typedef struct st_mysql_cond mysql_cond_ #endif /** + @def mysql_prlock_init(K, RW) + Instrumented rw_pr_init. + @c mysql_prlock_init is a replacement for @c rw_pr_init. + @param K The PSI_rwlock_key for this instrumented prlock + @param RW The prlock to initialize +*/ +#ifdef HAVE_PSI_INTERFACE + #define mysql_prlock_init(K, RW) inline_mysql_prlock_init(K, RW) +#else + #define mysql_prlock_init(K, RW) inline_mysql_prlock_init(RW) +#endif + +/** @def mysql_rwlock_destroy(RW) Instrumented rwlock_destroy. @c mysql_rwlock_destroy is a drop-in replacement @@ -320,6 +363,14 @@ typedef struct st_mysql_cond mysql_cond_ #define mysql_rwlock_destroy(RW) inline_mysql_rwlock_destroy(RW) /** + @def mysql_prlock_destroy(RW) + Instrumented rw_pr_destroy. + @c mysql_prlock_destroy is a drop-in replacement + for @c rw_pr_destroy. +*/ +#define mysql_prlock_destroy(RW) inline_mysql_prlock_destroy(RW) + +/** @def mysql_rwlock_rdlock(RW) Instrumented rwlock_rdlock. @c mysql_rwlock_rdlock is a drop-in replacement @@ -334,6 +385,20 @@ typedef struct st_mysql_cond mysql_cond_ #endif /** + @def mysql_prlock_rdlock(RW) + Instrumented rw_pr_rdlock. + @c mysql_prlock_rdlock is a drop-in replacement + for @c rw_pr_rdlock. +*/ +#ifdef HAVE_PSI_INTERFACE + #define mysql_prlock_rdlock(RW) \ + inline_mysql_prlock_rdlock(RW, __FILE__, __LINE__) +#else + #define mysql_prlock_rdlock(RW) \ + inline_mysql_prlock_rdlock(RW) +#endif + +/** @def mysql_rwlock_wrlock(RW) Instrumented rwlock_wrlock. @c mysql_rwlock_wrlock is a drop-in replacement @@ -348,6 +413,20 @@ typedef struct st_mysql_cond mysql_cond_ #endif /** + @def mysql_prlock_wrlock(RW) + Instrumented rw_pr_wrlock. + @c mysql_prlock_wrlock is a drop-in replacement + for @c rw_pr_wrlock. +*/ +#ifdef HAVE_PSI_INTERFACE + #define mysql_prlock_wrlock(RW) \ + inline_mysql_prlock_wrlock(RW, __FILE__, __LINE__) +#else + #define mysql_prlock_wrlock(RW) \ + inline_mysql_prlock_wrlock(RW) +#endif + +/** @def mysql_rwlock_tryrdlock(RW) Instrumented rwlock_tryrdlock. @c mysql_rwlock_tryrdlock is a drop-in replacement @@ -362,6 +441,20 @@ typedef struct st_mysql_cond mysql_cond_ #endif /** + @def mysql_prlock_tryrdlock(RW) + Instrumented rw_pr_tryrdlock. + @c mysql_prlock_tryrdlock is a drop-in replacement + for @c rw_pr_tryrdlock. +*/ +#ifdef HAVE_PSI_INTERFACE + #define mysql_prlock_tryrdlock(RW) \ + inline_mysql_prlock_tryrdlock(RW, __FILE__, __LINE__) +#else + #define mysql_prlock_tryrdlock(RW) \ + inline_mysql_prlock_tryrdlock(RW) +#endif + +/** @def mysql_rwlock_trywrlock(RW) Instrumented rwlock_trywrlock. @c mysql_rwlock_trywrlock is a drop-in replacement @@ -376,6 +469,20 @@ typedef struct st_mysql_cond mysql_cond_ #endif /** + @def mysql_prlock_trywrlock(RW) + Instrumented rw_pr_trywrlock. + @c mysql_prlock_trywrlock is a drop-in replacement + for @c rw_pr_trywrlock. +*/ +#ifdef HAVE_PSI_INTERFACE + #define mysql_prlock_trywrlock(RW) \ + inline_mysql_prlock_trywrlock(RW, __FILE__, __LINE__) +#else + #define mysql_prlock_trywrlock(RW) \ + inline_mysql_prlock_trywrlock(RW) +#endif + +/** @def mysql_rwlock_unlock(RW) Instrumented rwlock_unlock. @c mysql_rwlock_unlock is a drop-in replacement @@ -384,8 +491,16 @@ typedef struct st_mysql_cond mysql_cond_ #define mysql_rwlock_unlock(RW) inline_mysql_rwlock_unlock(RW) /** + @def mysql_prlock_unlock(RW) + Instrumented rw_pr_unlock. + @c mysql_prlock_unlock is a drop-in replacement + for @c rw_pr_unlock. +*/ +#define mysql_prlock_unlock(RW) inline_mysql_prlock_unlock(RW) + +/** @def mysql_cond_init(K, C, A) - Instrumented rwlock_init. + Instrumented cond_init. @c mysql_cond_init is a replacement for @c pthread_cond_init. @param C The cond to initialize @param K The PSI_cond_key for this instrumented cond @@ -633,6 +748,21 @@ static inline int inline_mysql_rwlock_in return my_rwlock_init(&that->m_rwlock, NULL); } +static inline int inline_mysql_prlock_init( +#ifdef HAVE_PSI_INTERFACE + PSI_rwlock_key key, +#endif + mysql_prlock_t *that) +{ +#ifdef HAVE_PSI_INTERFACE + that->m_psi= (PSI_server ? PSI_server->init_rwlock(key, &that->m_prlock) + : NULL); +#else + that->m_psi= NULL; +#endif + return rw_pr_init(&that->m_prlock); +} + static inline int inline_mysql_rwlock_destroy( mysql_rwlock_t *that) { @@ -646,6 +776,19 @@ static inline int inline_mysql_rwlock_de return rwlock_destroy(&that->m_rwlock); } +static inline int inline_mysql_prlock_destroy( + mysql_prlock_t *that) +{ +#ifdef HAVE_PSI_INTERFACE + if (likely(PSI_server && that->m_psi)) + { + PSI_server->destroy_rwlock(that->m_psi); + that->m_psi= NULL; + } +#endif + return rw_pr_destroy(&that->m_prlock); +} + static inline int inline_mysql_rwlock_rdlock( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -672,6 +815,32 @@ static inline int inline_mysql_rwlock_rd return result; } +static inline int inline_mysql_prlock_rdlock( + mysql_prlock_t *that +#ifdef HAVE_PSI_INTERFACE + , const char *src_file, uint src_line +#endif + ) +{ + int result; +#ifdef HAVE_PSI_INTERFACE + struct PSI_rwlock_locker *locker= NULL; + if (likely(PSI_server && that->m_psi)) + { + locker= PSI_server->get_thread_rwlock_locker(that->m_psi, + PSI_RWLOCK_READLOCK); + if (likely(locker != NULL)) + PSI_server->start_rwlock_rdwait(locker, src_file, src_line); + } +#endif + result= rw_pr_rdlock(&that->m_prlock); +#ifdef HAVE_PSI_INTERFACE + if (likely(locker != NULL)) + PSI_server->end_rwlock_rdwait(locker, result); +#endif + return result; +} + static inline int inline_mysql_rwlock_wrlock( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -698,6 +867,32 @@ static inline int inline_mysql_rwlock_wr return result; } +static inline int inline_mysql_prlock_wrlock( + mysql_prlock_t *that +#ifdef HAVE_PSI_INTERFACE + , const char *src_file, uint src_line +#endif + ) +{ + int result; +#ifdef HAVE_PSI_INTERFACE + struct PSI_rwlock_locker *locker= NULL; + if (likely(PSI_server && that->m_psi)) + { + locker= PSI_server->get_thread_rwlock_locker(that->m_psi, + PSI_RWLOCK_WRITELOCK); + if (likely(locker != NULL)) + PSI_server->start_rwlock_wrwait(locker, src_file, src_line); + } +#endif + result= rw_pr_wrlock(&that->m_prlock); +#ifdef HAVE_PSI_INTERFACE + if (likely(locker != NULL)) + PSI_server->end_rwlock_wrwait(locker, result); +#endif + return result; +} + static inline int inline_mysql_rwlock_tryrdlock( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -724,6 +919,32 @@ static inline int inline_mysql_rwlock_tr return result; } +static inline int inline_mysql_prlock_tryrdlock( + mysql_prlock_t *that +#ifdef HAVE_PSI_INTERFACE + , const char *src_file, uint src_line +#endif + ) +{ + int result; +#ifdef HAVE_PSI_INTERFACE + struct PSI_rwlock_locker *locker= NULL; + if (likely(PSI_server && that->m_psi)) + { + locker= PSI_server->get_thread_rwlock_locker(that->m_psi, + PSI_RWLOCK_TRYREADLOCK); + if (likely(locker != NULL)) + PSI_server->start_rwlock_rdwait(locker, src_file, src_line); + } +#endif + result= rw_pr_tryrdlock(&that->m_prlock); +#ifdef HAVE_PSI_INTERFACE + if (likely(locker != NULL)) + PSI_server->end_rwlock_rdwait(locker, result); +#endif + return result; +} + static inline int inline_mysql_rwlock_trywrlock( mysql_rwlock_t *that #ifdef HAVE_PSI_INTERFACE @@ -750,6 +971,32 @@ static inline int inline_mysql_rwlock_tr return result; } +static inline int inline_mysql_prlock_trywrlock( + mysql_prlock_t *that +#ifdef HAVE_PSI_INTERFACE + , const char *src_file, uint src_line +#endif + ) +{ + int result; +#ifdef HAVE_PSI_INTERFACE + struct PSI_rwlock_locker *locker= NULL; + if (likely(PSI_server && that->m_psi)) + { + locker= PSI_server->get_thread_rwlock_locker(that->m_psi, + PSI_RWLOCK_TRYWRITELOCK); + if (likely(locker != NULL)) + PSI_server->start_rwlock_wrwait(locker, src_file, src_line); + } +#endif + result= rw_pr_trywrlock(&that->m_prlock); +#ifdef HAVE_PSI_INTERFACE + if (likely(locker != NULL)) + PSI_server->end_rwlock_wrwait(locker, result); +#endif + return result; +} + static inline int inline_mysql_rwlock_unlock( mysql_rwlock_t *that) { @@ -767,6 +1014,23 @@ static inline int inline_mysql_rwlock_un return result; } +static inline int inline_mysql_prlock_unlock( + mysql_prlock_t *that) +{ + int result; +#ifdef HAVE_PSI_INTERFACE + struct PSI_thread *thread; + if (likely(PSI_server && that->m_psi)) + { + thread= PSI_server->get_thread(); + if (likely(thread != NULL)) + PSI_server->unlock_rwlock(thread, that->m_psi); + } +#endif + result= rw_pr_unlock(&that->m_prlock); + return result; +} + static inline int inline_mysql_cond_init( #ifdef HAVE_PSI_INTERFACE PSI_cond_key key, === modified file 'mysql-test/suite/perfschema/r/binlog_mix.result' --- a/mysql-test/suite/perfschema/r/binlog_mix.result 2010-01-12 01:48:52 +0000 +++ b/mysql-test/suite/perfschema/r/binlog_mix.result 2010-03-07 18:54:05 +0000 @@ -35,6 +35,8 @@ master-bin.000001 # Update_rows # # tabl master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; drop table if exists test.t1 @@ -56,6 +58,8 @@ master-bin.000001 # Table_map # # table_ master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # === modified file 'mysql-test/suite/perfschema/r/binlog_row.result' --- a/mysql-test/suite/perfschema/r/binlog_row.result 2010-01-12 01:48:52 +0000 +++ b/mysql-test/suite/perfschema/r/binlog_row.result 2010-03-07 18:54:05 +0000 @@ -35,6 +35,8 @@ master-bin.000001 # Update_rows # # tabl master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; drop table if exists test.t1 @@ -56,6 +58,8 @@ master-bin.000001 # Table_map # # table_ master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # +master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # === modified file 'mysql-test/suite/perfschema/r/dml_setup_instruments.result' --- a/mysql-test/suite/perfschema/r/dml_setup_instruments.result 2010-02-17 21:07:50 +0000 +++ b/mysql-test/suite/perfschema/r/dml_setup_instruments.result 2010-03-07 18:54:05 +0000 @@ -25,9 +25,10 @@ wait/synch/rwlock/sql/LOCK_system_variab wait/synch/rwlock/sql/LOCK_sys_init_connect YES YES wait/synch/rwlock/sql/LOCK_sys_init_slave YES YES wait/synch/rwlock/sql/LOGGER::LOCK_logger YES YES +wait/synch/rwlock/sql/MDL_context::waiting_for_lock YES YES +wait/synch/rwlock/sql/MDL_lock::rwlock YES YES wait/synch/rwlock/sql/Query_cache_query::lock YES YES wait/synch/rwlock/sql/THR_LOCK_servers YES YES -wait/synch/rwlock/sql/THR_LOCK_udf YES YES select * from performance_schema.SETUP_INSTRUMENTS where name like 'Wait/Synch/Cond/sql/%' and name not in ( === added file 'mysql-test/suite/perfschema/r/pfs_upgrade.result' --- a/mysql-test/suite/perfschema/r/pfs_upgrade.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/pfs_upgrade.result 2010-03-07 18:54:05 +0000 @@ -0,0 +1,153 @@ +drop table if exists test.user_table; +drop procedure if exists test.user_proc; +drop function if exists test.user_func; +drop event if exists test.user_event; +"Testing mysql_upgrade with TABLE performance_schema.user_table" +create table test.user_table(a int); +use performance_schema; +show tables like "user_table"; +Tables_in_performance_schema (user_table) +user_table +ERROR 1644 (HY000) at line 180: Unexpected content found in the performance_schema database. +ERROR 1050 (42S01) at line 205: Table 'COND_INSTANCES' already exists +ERROR 1050 (42S01) at line 235: Table 'EVENTS_WAITS_CURRENT' already exists +ERROR 1050 (42S01) at line 249: Table 'EVENTS_WAITS_HISTORY' already exists +ERROR 1050 (42S01) at line 263: Table 'EVENTS_WAITS_HISTORY_LONG' already exists +ERROR 1050 (42S01) at line 283: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 304: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 325: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 342: Table 'FILE_INSTANCES' already exists +ERROR 1050 (42S01) at line 361: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 381: Table 'FILE_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 398: Table 'MUTEX_INSTANCES' already exists +ERROR 1050 (42S01) at line 416: Table 'PERFORMANCE_TIMERS' already exists +ERROR 1050 (42S01) at line 433: Table 'PROCESSLIST' already exists +ERROR 1050 (42S01) at line 451: Table 'RWLOCK_INSTANCES' already exists +ERROR 1050 (42S01) at line 467: Table 'SETUP_CONSUMERS' already exists +ERROR 1050 (42S01) at line 484: Table 'SETUP_INSTRUMENTS' already exists +ERROR 1050 (42S01) at line 504: Table 'SETUP_OBJECTS' already exists +ERROR 1050 (42S01) at line 520: Table 'SETUP_TIMERS' already exists +FATAL ERROR: Upgrade failed +show tables like "user_table"; +Tables_in_performance_schema (user_table) +user_table +use test; +drop table test.user_table; +"Testing mysql_upgrade with VIEW performance_schema.user_view" +create view test.user_view as select "Not supposed to be here"; +use performance_schema; +show tables like "user_view"; +Tables_in_performance_schema (user_view) +user_view +ERROR 1644 (HY000) at line 180: Unexpected content found in the performance_schema database. +ERROR 1050 (42S01) at line 205: Table 'COND_INSTANCES' already exists +ERROR 1050 (42S01) at line 235: Table 'EVENTS_WAITS_CURRENT' already exists +ERROR 1050 (42S01) at line 249: Table 'EVENTS_WAITS_HISTORY' already exists +ERROR 1050 (42S01) at line 263: Table 'EVENTS_WAITS_HISTORY_LONG' already exists +ERROR 1050 (42S01) at line 283: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 304: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 325: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 342: Table 'FILE_INSTANCES' already exists +ERROR 1050 (42S01) at line 361: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 381: Table 'FILE_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 398: Table 'MUTEX_INSTANCES' already exists +ERROR 1050 (42S01) at line 416: Table 'PERFORMANCE_TIMERS' already exists +ERROR 1050 (42S01) at line 433: Table 'PROCESSLIST' already exists +ERROR 1050 (42S01) at line 451: Table 'RWLOCK_INSTANCES' already exists +ERROR 1050 (42S01) at line 467: Table 'SETUP_CONSUMERS' already exists +ERROR 1050 (42S01) at line 484: Table 'SETUP_INSTRUMENTS' already exists +ERROR 1050 (42S01) at line 504: Table 'SETUP_OBJECTS' already exists +ERROR 1050 (42S01) at line 520: Table 'SETUP_TIMERS' already exists +FATAL ERROR: Upgrade failed +show tables like "user_view"; +Tables_in_performance_schema (user_view) +user_view +use test; +drop view test.user_view; +"Testing mysql_upgrade with PROCEDURE performance_schema.user_proc" +create procedure test.user_proc() +select "Not supposed to be here"; +update mysql.proc set db='performance_schema' where name='user_proc'; +ERROR 1644 (HY000) at line 180: Unexpected content found in the performance_schema database. +ERROR 1050 (42S01) at line 205: Table 'COND_INSTANCES' already exists +ERROR 1050 (42S01) at line 235: Table 'EVENTS_WAITS_CURRENT' already exists +ERROR 1050 (42S01) at line 249: Table 'EVENTS_WAITS_HISTORY' already exists +ERROR 1050 (42S01) at line 263: Table 'EVENTS_WAITS_HISTORY_LONG' already exists +ERROR 1050 (42S01) at line 283: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 304: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 325: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 342: Table 'FILE_INSTANCES' already exists +ERROR 1050 (42S01) at line 361: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 381: Table 'FILE_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 398: Table 'MUTEX_INSTANCES' already exists +ERROR 1050 (42S01) at line 416: Table 'PERFORMANCE_TIMERS' already exists +ERROR 1050 (42S01) at line 433: Table 'PROCESSLIST' already exists +ERROR 1050 (42S01) at line 451: Table 'RWLOCK_INSTANCES' already exists +ERROR 1050 (42S01) at line 467: Table 'SETUP_CONSUMERS' already exists +ERROR 1050 (42S01) at line 484: Table 'SETUP_INSTRUMENTS' already exists +ERROR 1050 (42S01) at line 504: Table 'SETUP_OBJECTS' already exists +ERROR 1050 (42S01) at line 520: Table 'SETUP_TIMERS' already exists +FATAL ERROR: Upgrade failed +select name from mysql.proc where db='performance_schema'; +name +user_proc +update mysql.proc set db='test' where name='user_proc'; +drop procedure test.user_proc; +"Testing mysql_upgrade with FUNCTION performance_schema.user_func" +create function test.user_func() returns integer +return 0; +update mysql.proc set db='performance_schema' where name='user_func'; +ERROR 1644 (HY000) at line 180: Unexpected content found in the performance_schema database. +ERROR 1050 (42S01) at line 205: Table 'COND_INSTANCES' already exists +ERROR 1050 (42S01) at line 235: Table 'EVENTS_WAITS_CURRENT' already exists +ERROR 1050 (42S01) at line 249: Table 'EVENTS_WAITS_HISTORY' already exists +ERROR 1050 (42S01) at line 263: Table 'EVENTS_WAITS_HISTORY_LONG' already exists +ERROR 1050 (42S01) at line 283: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 304: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 325: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 342: Table 'FILE_INSTANCES' already exists +ERROR 1050 (42S01) at line 361: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 381: Table 'FILE_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 398: Table 'MUTEX_INSTANCES' already exists +ERROR 1050 (42S01) at line 416: Table 'PERFORMANCE_TIMERS' already exists +ERROR 1050 (42S01) at line 433: Table 'PROCESSLIST' already exists +ERROR 1050 (42S01) at line 451: Table 'RWLOCK_INSTANCES' already exists +ERROR 1050 (42S01) at line 467: Table 'SETUP_CONSUMERS' already exists +ERROR 1050 (42S01) at line 484: Table 'SETUP_INSTRUMENTS' already exists +ERROR 1050 (42S01) at line 504: Table 'SETUP_OBJECTS' already exists +ERROR 1050 (42S01) at line 520: Table 'SETUP_TIMERS' already exists +FATAL ERROR: Upgrade failed +select name from mysql.proc where db='performance_schema'; +name +user_func +update mysql.proc set db='test' where name='user_func'; +drop function test.user_func; +"Testing mysql_upgrade with EVENT performance_schema.user_event" +create event test.user_event on schedule every 1 day do +select "not supposed to be here"; +update mysql.event set db='performance_schema' where name='user_event'; +ERROR 1644 (HY000) at line 180: Unexpected content found in the performance_schema database. +ERROR 1050 (42S01) at line 205: Table 'COND_INSTANCES' already exists +ERROR 1050 (42S01) at line 235: Table 'EVENTS_WAITS_CURRENT' already exists +ERROR 1050 (42S01) at line 249: Table 'EVENTS_WAITS_HISTORY' already exists +ERROR 1050 (42S01) at line 263: Table 'EVENTS_WAITS_HISTORY_LONG' already exists +ERROR 1050 (42S01) at line 283: Table 'EVENTS_WAITS_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 304: Table 'EVENTS_WAITS_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 325: Table 'EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 342: Table 'FILE_INSTANCES' already exists +ERROR 1050 (42S01) at line 361: Table 'FILE_SUMMARY_BY_EVENT_NAME' already exists +ERROR 1050 (42S01) at line 381: Table 'FILE_SUMMARY_BY_INSTANCE' already exists +ERROR 1050 (42S01) at line 398: Table 'MUTEX_INSTANCES' already exists +ERROR 1050 (42S01) at line 416: Table 'PERFORMANCE_TIMERS' already exists +ERROR 1050 (42S01) at line 433: Table 'PROCESSLIST' already exists +ERROR 1050 (42S01) at line 451: Table 'RWLOCK_INSTANCES' already exists +ERROR 1050 (42S01) at line 467: Table 'SETUP_CONSUMERS' already exists +ERROR 1050 (42S01) at line 484: Table 'SETUP_INSTRUMENTS' already exists +ERROR 1050 (42S01) at line 504: Table 'SETUP_OBJECTS' already exists +ERROR 1050 (42S01) at line 520: Table 'SETUP_TIMERS' already exists +FATAL ERROR: Upgrade failed +select name from mysql.event where db='performance_schema'; +name +user_event +update mysql.event set db='test' where name='user_event'; +drop event test.user_event; === added file 'mysql-test/suite/perfschema/t/pfs_upgrade.test' --- a/mysql-test/suite/perfschema/t/pfs_upgrade.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/pfs_upgrade.test 2010-03-07 18:54:05 +0000 @@ -0,0 +1,137 @@ +# 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 + +# Tests for PERFORMANCE_SCHEMA +# Make sure mysql_upgrade does not destroy data in a 'performance_schema' +# database. +# + +--source include/not_embedded.inc +--source include/have_perfschema.inc + +--disable_warnings +drop table if exists test.user_table; +drop procedure if exists test.user_proc; +drop function if exists test.user_func; +drop event if exists test.user_event; +--enable_warnings + +--echo "Testing mysql_upgrade with TABLE performance_schema.user_table" + +create table test.user_table(a int); + +let $MYSQLD_DATADIR= `SELECT @@datadir`; +--copy_file $MYSQLD_DATADIR/test/user_table.frm $MYSQLD_DATADIR/performance_schema/user_table.frm + +# Make sure the table is visible +use performance_schema; +show tables like "user_table"; + +--error 1 +--exec $MYSQL_UPGRADE --skip-verbose > $MYSQLTEST_VARDIR/tmp/pfs_upgrade.out 2> $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +# Verify that mysql_upgrade complained about the performance_schema +--cat_file $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +# Make sure the table is still visible +show tables like "user_table"; + +use test; + +--remove_file $MYSQLD_DATADIR/performance_schema/user_table.frm +drop table test.user_table; + +--echo "Testing mysql_upgrade with VIEW performance_schema.user_view" + +create view test.user_view as select "Not supposed to be here"; + +let $MYSQLD_DATADIR= `SELECT @@datadir`; +--copy_file $MYSQLD_DATADIR/test/user_view.frm $MYSQLD_DATADIR/performance_schema/user_view.frm + +# Make sure the view is visible +use performance_schema; +show tables like "user_view"; + +--error 1 +--exec $MYSQL_UPGRADE --skip-verbose > $MYSQLTEST_VARDIR/tmp/pfs_upgrade.out 2> $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +# Verify that mysql_upgrade complained about the performance_schema +--cat_file $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +# Make sure the view is still visible +show tables like "user_view"; + +use test; + +--remove_file $MYSQLD_DATADIR/performance_schema/user_view.frm +drop view test.user_view; + +--echo "Testing mysql_upgrade with PROCEDURE performance_schema.user_proc" + +create procedure test.user_proc() + select "Not supposed to be here"; + +update mysql.proc set db='performance_schema' where name='user_proc'; + +--error 1 +--exec $MYSQL_UPGRADE --skip-verbose > $MYSQLTEST_VARDIR/tmp/pfs_upgrade.out 2> $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +# Verify that mysql_upgrade complained about the performance_schema +--cat_file $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +select name from mysql.proc where db='performance_schema'; + +update mysql.proc set db='test' where name='user_proc'; +drop procedure test.user_proc; + +--echo "Testing mysql_upgrade with FUNCTION performance_schema.user_func" + +create function test.user_func() returns integer + return 0; + +update mysql.proc set db='performance_schema' where name='user_func'; + +--error 1 +--exec $MYSQL_UPGRADE --skip-verbose > $MYSQLTEST_VARDIR/tmp/pfs_upgrade.out 2> $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +# Verify that mysql_upgrade complained about the performance_schema +--cat_file $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +select name from mysql.proc where db='performance_schema'; + +update mysql.proc set db='test' where name='user_func'; +drop function test.user_func; + +--echo "Testing mysql_upgrade with EVENT performance_schema.user_event" + +create event test.user_event on schedule every 1 day do + select "not supposed to be here"; + +update mysql.event set db='performance_schema' where name='user_event'; + +--error 1 +--exec $MYSQL_UPGRADE --skip-verbose > $MYSQLTEST_VARDIR/tmp/pfs_upgrade.out 2> $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +# Verify that mysql_upgrade complained about the performance_schema +--cat_file $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + +select name from mysql.event where db='performance_schema'; + +update mysql.event set db='test' where name='user_event'; +drop event test.user_event; + +--remove_file $MYSQLTEST_VARDIR/tmp/pfs_upgrade.out +--remove_file $MYSQLTEST_VARDIR/tmp/pfs_upgrade.err + === modified file 'scripts/mysql_system_tables.sql' --- a/scripts/mysql_system_tables.sql 2010-02-02 13:48:37 +0000 +++ b/scripts/mysql_system_tables.sql 2010-03-07 18:54:05 +0000 @@ -1,4 +1,4 @@ --- Copyright (C) 2008-2009 Sun Microsystems, Inc +-- Copyright (C) 2008, 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 @@ -102,18 +102,92 @@ CREATE TABLE IF NOT EXISTS event ( db ch # DROP TABLE IF EXISTS mysql.online_backup; +-- +-- PERFORMANCE SCHEMA INSTALLATION +-- Note that this script is also reused by mysql_upgrade, +-- so we have to be very careful here to not destroy any +-- existing database named 'performance_schema' if it +-- can contain user data. +-- In case of downgrade, it's ok to drop unknown tables +-- from a future version, as long as they belong to the +-- performance schema engine. +-- + +set @have_old_pfs= (select count(*) from information_schema.schemata where schema_name='performance_schema'); + +SET @l1="SET @broken_tables = (select count(*) from information_schema.tables"; +SET @l2=" where engine != \'PERFORMANCE_SCHEMA\' and table_schema=\'performance_schema\')"; +SET @cmd=concat(@l1,@l2); + +-- Work around for bug#49542 +SET @str = IF(@have_old_pfs = 1, @cmd, 'SET @broken_tables = 0'); +PREPARE stmt FROM @str; +EXECUTE stmt; +DROP PREPARE stmt; + +SET @l1="SET @broken_views = (select count(*) from information_schema.views"; +SET @l2=" where table_schema='performance_schema')"; +SET @cmd=concat(@l1,@l2); + +-- Work around for bug#49542 +SET @str = IF(@have_old_pfs = 1, @cmd, 'SET @broken_views = 0'); +PREPARE stmt FROM @str; +EXECUTE stmt; +DROP PREPARE stmt; + +SET @broken_routines = (select count(*) from mysql.proc where db='performance_schema'); + +SET @broken_events = (select count(*) from mysql.event where db='performance_schema'); + +SET @broken_pfs= (select @broken_tables + @broken_views + @broken_routines + @broken_events); -- -- The performance schema database. --- This database is always created, even in --without-perfschema builds, +-- Only drop and create the database if this is safe (no broken_pfs). +-- This database is created, even in --without-perfschema builds, -- so that the database name is always reserved by the MySQL implementation. -- -set @have_pfs= (select count(engine) from information_schema.engines where engine='PERFORMANCE_SCHEMA' and support != 'NO'); +SET @cmd= "DROP DATABASE IF EXISTS performance_schema"; + +SET @str = IF(@broken_pfs = 0, @cmd, 'SET @dummy = 0'); +PREPARE stmt FROM @str; +EXECUTE stmt; +DROP PREPARE stmt; + +SET @cmd= "CREATE DATABASE performance_schema character set utf8"; -DROP DATABASE IF EXISTS performance_schema; +SET @str = IF(@broken_pfs = 0, @cmd, 'SET @dummy = 0'); +PREPARE stmt FROM @str; +EXECUTE stmt; +DROP PREPARE stmt; + +-- +-- Unlike 'performance_schema', the 'mysql' database is reserved already, +-- so no user procedure is supposed to be there +-- +drop procedure if exists mysql.die; +create procedure mysql.die() signal sqlstate 'HY000' set message_text='Unexpected content found in the performance_schema database.'; + +-- +-- For broken upgrades, SIGNAL the error +-- + +SET @cmd="call mysql.die()"; -CREATE DATABASE performance_schema character set utf8; +SET @str = IF(@broken_pfs > 0, @cmd, 'SET @dummy = 0'); +PREPARE stmt FROM @str; +EXECUTE stmt; +DROP PREPARE stmt; + +drop procedure mysql.die; + +-- +-- From this point, only create the performance schema tables +-- if the server is build with performance schema +-- + +set @have_pfs= (select count(engine) from information_schema.engines where engine='PERFORMANCE_SCHEMA' and support != 'NO'); -- -- TABLE COND_INSTANCES === modified file 'sql/mdl.cc' --- a/sql/mdl.cc 2010-03-01 18:08:17 +0000 +++ b/sql/mdl.cc 2010-03-07 18:54:05 +0000 @@ -19,6 +19,54 @@ #include #include +#ifdef HAVE_PSI_INTERFACE +static PSI_mutex_key key_MDL_map_mutex; +static PSI_mutex_key key_MDL_context_signal_mutex; + +static PSI_mutex_info all_mdl_mutexes[]= +{ + { &key_MDL_map_mutex, "MDL_map::mutex", PSI_FLAG_GLOBAL}, + { &key_MDL_context_signal_mutex, "MDL_context::signal", 0} +}; + +static PSI_rwlock_key key_MDL_lock_rwlock; +static PSI_rwlock_key key_MDL_context_waiting_for_rwlock; + +static PSI_rwlock_info all_mdl_rwlocks[]= +{ + { &key_MDL_lock_rwlock, "MDL_lock::rwlock", 0}, + { &key_MDL_context_waiting_for_rwlock, "MDL_context::waiting_for_lock", 0} +}; + +static PSI_cond_key key_MDL_context_signal_cond; + +static PSI_cond_info all_mdl_conds[]= +{ + { &key_MDL_context_signal_cond, "MDL_context::signal", 0} +}; + +/** + Initialise all the performance schema instrumentation points + used by the MDL subsystem. +*/ +static void init_mdl_psi_keys(void) +{ + const char *category= "sql"; + int count; + + if (PSI_server == NULL) + return; + + count= array_elements(all_mdl_mutexes); + PSI_server->register_mutex(category, all_mdl_mutexes, count); + + count= array_elements(all_mdl_rwlocks); + PSI_server->register_rwlock(category, all_mdl_rwlocks, count); + + count= array_elements(all_mdl_conds); + PSI_server->register_cond(category, all_mdl_conds, count); +} +#endif /* HAVE_PSI_INTERFACE */ void notify_shared_lock(THD *thd, MDL_ticket *conflicting_ticket); @@ -178,7 +226,7 @@ public: If m_wrlock prefers readers (actually ignoring pending writers is enough) ctxA and ctxB will continue and no deadlock will occur. */ - rw_pr_lock_t m_rwlock; + mysql_prlock_t m_rwlock; bool is_empty() const { @@ -240,12 +288,12 @@ public: m_ref_release(0), m_is_destroyed(FALSE) { - rw_pr_init(&m_rwlock); + mysql_prlock_init(key_MDL_lock_rwlock, &m_rwlock); } virtual ~MDL_lock() { - rw_pr_destroy(&m_rwlock); + mysql_prlock_destroy(&m_rwlock); } inline static void destroy(MDL_lock *lock); public: @@ -368,6 +416,11 @@ void mdl_init() { DBUG_ASSERT(! mdl_initialized); mdl_initialized= TRUE; + +#ifdef HAVE_PSI_INTERFACE + init_mdl_psi_keys(); +#endif + mdl_locks.init(); } @@ -393,7 +446,7 @@ void mdl_destroy() void MDL_map::init() { - mysql_mutex_init(NULL /* pfs key */,&m_mutex, NULL); + mysql_mutex_init(key_MDL_map_mutex, &m_mutex, NULL); my_hash_init(&m_locks, &my_charset_bin, 16 /* FIXME */, 0, 0, mdl_locks_key, 0, 0); } @@ -507,7 +560,7 @@ bool MDL_map::move_from_hash_to_lock_mut lock->m_ref_usage++; mysql_mutex_unlock(&m_mutex); - rw_pr_wrlock(&lock->m_rwlock); + mysql_prlock_wrlock(&lock->m_rwlock); lock->m_ref_release++; if (unlikely(lock->m_is_destroyed)) { @@ -522,7 +575,7 @@ bool MDL_map::move_from_hash_to_lock_mut */ uint ref_usage= lock->m_ref_usage; uint ref_release= lock->m_ref_release; - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); if (ref_usage == ref_release) MDL_lock::destroy(lock); return TRUE; @@ -565,7 +618,7 @@ void MDL_map::remove(MDL_lock *lock) lock->m_is_destroyed= TRUE; ref_usage= lock->m_ref_usage; ref_release= lock->m_ref_release; - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); mysql_mutex_unlock(&m_mutex); if (ref_usage == ref_release) MDL_lock::destroy(lock); @@ -586,9 +639,9 @@ MDL_context::MDL_context() m_deadlock_weight(0), m_signal(NO_WAKE_UP) { - rw_pr_init(&m_waiting_for_lock); - mysql_mutex_init(NULL /* pfs key */, &m_signal_lock, NULL); - mysql_cond_init(NULL /* pfs key */, &m_signal_cond, NULL); + mysql_prlock_init(key_MDL_context_waiting_for_rwlock, &m_waiting_for_lock); + mysql_mutex_init(key_MDL_context_signal_mutex, &m_signal_lock, NULL); + mysql_cond_init(key_MDL_context_signal_mutex, &m_signal_cond, NULL); } @@ -608,7 +661,7 @@ void MDL_context::destroy() { DBUG_ASSERT(m_tickets.is_empty()); - rw_pr_destroy(&m_waiting_for_lock); + mysql_prlock_destroy(&m_waiting_for_lock); mysql_mutex_destroy(&m_signal_lock); mysql_cond_destroy(&m_signal_cond); } @@ -1103,7 +1156,7 @@ MDL_lock::can_grant_lock(enum_mdl_type t void MDL_lock::remove_ticket(Ticket_list MDL_lock::*list, MDL_ticket *ticket) { - rw_pr_wrlock(&m_rwlock); + mysql_prlock_wrlock(&m_rwlock); (this->*list).remove_ticket(ticket); if (is_empty()) mdl_locks.remove(this); @@ -1114,7 +1167,7 @@ void MDL_lock::remove_ticket(Ticket_list which now might be able to do it. Wake them up! */ wake_up_waiters(); - rw_pr_unlock(&m_rwlock); + mysql_prlock_unlock(&m_rwlock); } } @@ -1134,9 +1187,9 @@ bool MDL_lock::has_pending_conflicting_l mysql_mutex_assert_not_owner(&LOCK_open); - rw_pr_rdlock(&m_rwlock); + mysql_prlock_rdlock(&m_rwlock); result= (m_waiting.bitmap() & incompatible_granted_types_bitmap()[type]); - rw_pr_unlock(&m_rwlock); + mysql_prlock_unlock(&m_rwlock); return result; } @@ -1330,7 +1383,7 @@ MDL_context::try_acquire_lock(MDL_reques { ticket->m_lock= lock; lock->m_granted.add_ticket(ticket); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); m_tickets.push_front(ticket); @@ -1340,7 +1393,7 @@ MDL_context::try_acquire_lock(MDL_reques { /* We can't get here if we allocated a new lock. */ DBUG_ASSERT(! lock->is_empty()); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); MDL_ticket::destroy(ticket); } @@ -1381,9 +1434,9 @@ MDL_context::clone_ticket(MDL_request *m ticket->m_lock= mdl_request->ticket->m_lock; mdl_request->ticket= ticket; - rw_pr_wrlock(&ticket->m_lock->m_rwlock); + mysql_prlock_wrlock(&ticket->m_lock->m_rwlock); ticket->m_lock->m_granted.add_ticket(ticket); - rw_pr_unlock(&ticket->m_lock->m_rwlock); + mysql_prlock_unlock(&ticket->m_lock->m_rwlock); m_tickets.push_front(ticket); @@ -1489,7 +1542,7 @@ bool MDL_context::acquire_lock_impl(MDL_ if (ticket->is_upgradable_or_exclusive()) lock->notify_shared_locks(this); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); set_deadlock_weight(mdl_request->get_deadlock_weight()); will_wait_for(ticket); @@ -1524,7 +1577,7 @@ bool MDL_context::acquire_lock_impl(MDL_ my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0)); return TRUE; } - rw_pr_wrlock(&lock->m_rwlock); + mysql_prlock_wrlock(&lock->m_rwlock); } lock->m_waiting.remove_ticket(ticket); @@ -1534,7 +1587,7 @@ bool MDL_context::acquire_lock_impl(MDL_ (*lock->cached_object_release_hook)(lock->cached_object); lock->cached_object= NULL; - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); m_tickets.push_front(ticket); @@ -1679,7 +1732,7 @@ MDL_context::upgrade_shared_lock_to_excl is_new_ticket= ! has_lock(mdl_svp, mdl_xlock_request.ticket); /* Merge the acquired and the original lock. @todo: move to a method. */ - rw_pr_wrlock(&mdl_ticket->m_lock->m_rwlock); + mysql_prlock_wrlock(&mdl_ticket->m_lock->m_rwlock); if (is_new_ticket) mdl_ticket->m_lock->m_granted.remove_ticket(mdl_xlock_request.ticket); /* @@ -1691,7 +1744,7 @@ MDL_context::upgrade_shared_lock_to_excl mdl_ticket->m_type= MDL_EXCLUSIVE; mdl_ticket->m_lock->m_granted.add_ticket(mdl_ticket); - rw_pr_unlock(&mdl_ticket->m_lock->m_rwlock); + mysql_prlock_unlock(&mdl_ticket->m_lock->m_rwlock); if (is_new_ticket) { @@ -1709,7 +1762,7 @@ bool MDL_lock::find_deadlock(MDL_ticket MDL_ticket *ticket; bool result= FALSE; - rw_pr_rdlock(&m_rwlock); + mysql_prlock_rdlock(&m_rwlock); Ticket_iterator granted_it(m_granted); Ticket_iterator waiting_it(m_waiting); @@ -1761,7 +1814,7 @@ bool MDL_lock::find_deadlock(MDL_ticket } end: - rw_pr_unlock(&m_rwlock); + mysql_prlock_unlock(&m_rwlock); return result; } @@ -1770,7 +1823,7 @@ bool MDL_context::find_deadlock(Deadlock { bool result= FALSE; - rw_pr_rdlock(&m_waiting_for_lock); + mysql_prlock_rdlock(&m_waiting_for_lock); if (m_waiting_for) { @@ -1799,14 +1852,14 @@ bool MDL_context::find_deadlock(Deadlock deadlock_ctx->victim= this; else if (deadlock_ctx->victim->m_deadlock_weight >= m_deadlock_weight) { - rw_pr_unlock(&deadlock_ctx->victim->m_waiting_for_lock); + mysql_prlock_unlock(&deadlock_ctx->victim->m_waiting_for_lock); deadlock_ctx->victim= this; } else - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); } else - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); return result; } @@ -1832,7 +1885,7 @@ bool MDL_context::find_deadlock() if (deadlock_ctx.victim != this) { deadlock_ctx.victim->awake(VICTIM_WAKE_UP); - rw_pr_unlock(&deadlock_ctx.victim->m_waiting_for_lock); + mysql_prlock_unlock(&deadlock_ctx.victim->m_waiting_for_lock); /* After adding new arc to waiting graph we found that it participates in some loop (i.e. there is a deadlock). We decided to destroy this @@ -1845,7 +1898,7 @@ bool MDL_context::find_deadlock() else { DBUG_ASSERT(&deadlock_ctx.victim->m_waiting_for_lock == &m_waiting_for_lock); - rw_pr_unlock(&deadlock_ctx.victim->m_waiting_for_lock); + mysql_prlock_unlock(&deadlock_ctx.victim->m_waiting_for_lock); return TRUE; } } @@ -1902,14 +1955,14 @@ MDL_context::wait_for_lock(MDL_request * if (lock->can_grant_lock(mdl_request->type, this)) { - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); return FALSE; } MDL_ticket *pending_ticket; if (! (pending_ticket= MDL_ticket::create(this, mdl_request->type))) { - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); return TRUE; } @@ -1918,7 +1971,7 @@ MDL_context::wait_for_lock(MDL_request * lock->m_waiting.add_ticket(pending_ticket); wait_reset(); - rw_pr_unlock(&lock->m_rwlock); + mysql_prlock_unlock(&lock->m_rwlock); set_deadlock_weight(MDL_DEADLOCK_WEIGHT_DML); will_wait_for(pending_ticket); @@ -2069,7 +2122,7 @@ void MDL_ticket::downgrade_exclusive_loc if (m_type != MDL_EXCLUSIVE) return; - rw_pr_wrlock(&m_lock->m_rwlock); + mysql_prlock_wrlock(&m_lock->m_rwlock); /* To update state of MDL_lock object correctly we need to temporarily exclude ticket from the granted queue and then include it back. @@ -2078,7 +2131,7 @@ void MDL_ticket::downgrade_exclusive_loc m_type= type; m_lock->m_granted.add_ticket(this); m_lock->wake_up_waiters(); - rw_pr_unlock(&m_lock->m_rwlock); + mysql_prlock_unlock(&m_lock->m_rwlock); } === modified file 'sql/mdl.h' --- a/sql/mdl.h 2010-03-01 18:08:17 +0000 +++ b/sql/mdl.h 2010-03-07 18:54:05 +0000 @@ -628,7 +628,7 @@ private: important as deadlock detector won't work correctly otherwise. @sa Comment for MDL_lock::m_rwlock. */ - rw_pr_lock_t m_waiting_for_lock; + mysql_prlock_t m_waiting_for_lock; MDL_ticket *m_waiting_for; uint m_deadlock_weight; /** @@ -652,9 +652,9 @@ private: void will_wait_for(MDL_ticket *pending_ticket) { - rw_pr_wrlock(&m_waiting_for_lock); + mysql_prlock_wrlock(&m_waiting_for_lock); m_waiting_for= pending_ticket; - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); } void set_deadlock_weight(uint weight) @@ -670,9 +670,9 @@ private: void stop_waiting() { - rw_pr_wrlock(&m_waiting_for_lock); + mysql_prlock_wrlock(&m_waiting_for_lock); m_waiting_for= NULL; - rw_pr_unlock(&m_waiting_for_lock); + mysql_prlock_unlock(&m_waiting_for_lock); } void wait_reset() === modified file 'storage/perfschema/pfs_instr.cc' --- a/storage/perfschema/pfs_instr.cc 2010-03-02 00:17:51 +0000 +++ b/storage/perfschema/pfs_instr.cc 2010-03-07 18:54:05 +0000 @@ -746,6 +746,26 @@ find_or_create_file(PFS_thread *thread, } } + char safe_buffer[FN_REFLEN]; + const char *safe_filename; + + if (len >= FN_REFLEN) + { + /* + The instrumented code uses file names that exceeds FN_REFLEN. + This could be legal for instrumentation on non mysys APIs, + so we support it. + Truncate the file name so that: + - it fits into pfs->m_filename + - it is safe to use mysys apis to normalize the file name. + */ + memcpy(safe_buffer, filename, FN_REFLEN - 2); + safe_buffer[FN_REFLEN - 1]= 0; + safe_filename= safe_buffer; + } + else + safe_filename= filename; + /* Normalize the file name to avoid duplicates when using aliases: - absolute or relative paths @@ -759,7 +779,7 @@ find_or_create_file(PFS_thread *thread, Ignore errors, the file may not exist. my_realpath always provide a best effort result in buffer. */ - (void) my_realpath(buffer, filename, MYF(0)); + (void) my_realpath(buffer, safe_filename, MYF(0)); normalized_filename= buffer; normalized_length= strlen(normalized_filename); === modified file 'storage/perfschema/unittest/pfs-t.cc' --- a/storage/perfschema/unittest/pfs-t.cc 2010-01-12 01:48:52 +0000 +++ b/storage/perfschema/unittest/pfs-t.cc 2010-03-07 18:54:05 +0000 @@ -37,14 +37,25 @@ PFS_file* lookup_file_by_name(const char uint i; PFS_file *pfs; uint len= strlen(name); + size_t dirlen; + const char *filename; + uint filename_length;; for (i= 0; i < file_max; i++) { pfs= & file_array[i]; if (pfs->m_lock.is_populated()) { - if ((len == pfs->m_filename_length) && - (strncmp(name, pfs->m_filename, pfs->m_filename_length) == 0)) + /* + When a file "foo" is instrumented, the name is normalized + to "/path/to/current/directory/foo", so we remove the + directory name here to find it back. + */ + dirlen= dirname_length(pfs->m_filename); + filename= pfs->m_filename + dirlen; + filename_length= pfs->m_filename_length - dirlen; + if ((len == filename_length) && + (strncmp(name, filename, filename_length) == 0)) return pfs; } } --===============5323690596981701434== 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-6.0-codebase-\ # bugfixing/ # testament_sha1: dbada5b197281c2893533ed37ea7ed35de795e1f # timestamp: 2010-03-07 11:55:03 -0700 # source_branch: file:///home/malff/BZR_TREE/mysql-next-mr-bugfixing/ # base_revision_id: bjorn.munch@stripped\ # 7m34uxjybpcf355r # # Begin bundle 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 --===============5323690596981701434==--