From: Marc Alff Date: August 12 2010 9:52am Subject: bzr push into mysql-5.5-bugfixing branch (marc.alff:3173 to 3174) Bug#55462 List-Archive: http://lists.mysql.com/commits/115554 X-Bug: 55462 Message-Id: <201008120954.o7BG07J6004506@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4523656109464611631==" --===============4523656109464611631== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3174 Marc Alff 2010-08-12 Bug#55462 Performance schema: reduce the overhead of PFS_events_waits::m_wait_class This is a performance improvement fix. Removed the "volatile" property of PFS_events_waits::m_wait_class. Simplified the code accordingly. modified: storage/perfschema/pfs.cc storage/perfschema/pfs_events_waits.cc storage/perfschema/pfs_events_waits.h storage/perfschema/table_events_waits.cc 3173 Jonathan Perkin 2010-08-10 [merge] Merge to mysql-5.5-bugfixing modified: scripts/CMakeLists.txt scripts/mysql_config.sh === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2010-07-15 23:44:45 +0000 +++ b/storage/perfschema/pfs.cc 2010-08-12 09:51:58 +0000 @@ -1117,7 +1117,6 @@ get_thread_mutex_locker_v1(PSI_mutex_loc } PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack [pfs_thread->m_wait_locker_count]; - pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; pfs_locker->m_target.m_mutex= pfs_mutex; pfs_locker->m_waits_current.m_thread= pfs_thread; @@ -1163,7 +1162,6 @@ get_thread_rwlock_locker_v1(PSI_rwlock_l } PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack [pfs_thread->m_wait_locker_count]; - pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; pfs_locker->m_target.m_rwlock= pfs_rwlock; pfs_locker->m_waits_current.m_thread= pfs_thread; @@ -1222,7 +1220,6 @@ get_thread_cond_locker_v1(PSI_cond_locke } PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack [pfs_thread->m_wait_locker_count]; - pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; pfs_locker->m_target.m_cond= pfs_cond; pfs_locker->m_waits_current.m_thread= pfs_thread; @@ -1267,7 +1264,6 @@ get_thread_table_locker_v1(PSI_table_loc } PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack [pfs_thread->m_wait_locker_count]; - pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; pfs_locker->m_target.m_table= pfs_table; pfs_locker->m_waits_current.m_thread= pfs_thread; @@ -1320,7 +1316,6 @@ get_thread_file_name_locker_v1(PSI_file_ PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack [pfs_thread->m_wait_locker_count]; - pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; pfs_locker->m_target.m_file= pfs_file; pfs_locker->m_waits_current.m_thread= pfs_thread; @@ -1372,7 +1367,6 @@ get_thread_file_stream_locker_v1(PSI_fil } PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack [pfs_thread->m_wait_locker_count]; - pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; pfs_locker->m_target.m_file= pfs_file; pfs_locker->m_waits_current.m_thread= pfs_thread; @@ -1441,7 +1435,6 @@ get_thread_file_descriptor_locker_v1(PSI } PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack [pfs_thread->m_wait_locker_count]; - pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; pfs_locker->m_target.m_file= pfs_file; pfs_locker->m_waits_current.m_thread= pfs_thread; === modified file 'storage/perfschema/pfs_events_waits.cc' --- a/storage/perfschema/pfs_events_waits.cc 2010-07-23 20:17:55 +0000 +++ b/storage/perfschema/pfs_events_waits.cc 2010-08-12 09:51:58 +0000 @@ -80,25 +80,10 @@ void cleanup_events_waits_history_long(v events_waits_history_long_array= NULL; } -static void copy_events_waits(PFS_events_waits *dest, - const PFS_events_waits *source) +static inline void copy_events_waits(PFS_events_waits *dest, + const PFS_events_waits *source) { - /* m_wait_class must be the first member of PFS_events_waits. */ - compile_time_assert(offsetof(PFS_events_waits, m_wait_class) == 0); - - char* dest_body= (reinterpret_cast (dest)) + sizeof(events_waits_class); - const char* source_body= (reinterpret_cast (source)) - + sizeof(events_waits_class); - - /* See comments in table_events_waits_common::make_row(). */ - - /* Signal readers they are about to read garbage ... */ - dest->m_wait_class= NO_WAIT_CLASS; - /* ... that this can generate. */ - memcpy(dest_body, source_body, - sizeof(PFS_events_waits) - sizeof(events_waits_class)); - /* Signal readers the record is now clean again. */ - dest->m_wait_class= source->m_wait_class; + memcpy(dest, source, sizeof(PFS_events_waits)); } /** @@ -116,9 +101,7 @@ void insert_events_waits_history(PFS_thr causing a potential race condition. We are not testing for this and insert a possibly empty record, to make this thread (the writer) faster. - This is ok, the truncated data will have - wait->m_wait_class == NO_WAIT_CLASS, - which readers of m_waits_history will filter out. + This is ok, the readers of m_waits_history will filter this out. */ copy_events_waits(&thread->m_waits_history[index], wait); === modified file 'storage/perfschema/pfs_events_waits.h' --- a/storage/perfschema/pfs_events_waits.h 2010-07-15 23:44:45 +0000 +++ b/storage/perfschema/pfs_events_waits.h 2010-08-12 09:51:58 +0000 @@ -97,7 +97,7 @@ struct PFS_events_waits - TRUNCATE EVENTS_WAITS_HISTORY - TRUNCATE EVENTS_WAITS_HISTORY_LONG */ - volatile events_waits_class m_wait_class; + events_waits_class m_wait_class; /** Executing thread. */ PFS_thread *m_thread; /** Instrument metadata. */ === modified file 'storage/perfschema/table_events_waits.cc' --- a/storage/perfschema/table_events_waits.cc 2010-07-16 00:06:33 +0000 +++ b/storage/perfschema/table_events_waits.cc 2010-08-12 09:51:58 +0000 @@ -217,16 +217,8 @@ void table_events_waits_common::make_row or 8 atomics per recorded event. The problem is that we record a *lot* of events ... - Instead, a *dirty* marking is done using m_wait_class. - Using m_wait_class alone does not guarantee anything, it just filters - out most of the bad data. - This is acceptable because this code is garbage-proof, - and won't crash on bad data, only display it, - very rarely (which is accepted). - - If a bad record is displayed, it's a very transient failure: - the next select * from EVENTS_WAITS_CURRENT/_HISTORY/_HISTORY_LONG will - show clean data again. + This code is prepared to accept *dirty* records, + and sanitizes all the data before returning a row. */ m_row.m_thread_internal_id= safe_thread->m_thread_internal_id; --===============4523656109464611631== 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:///Users/malff/BZR_TREE/mysql-5.5-bugfixing-\ # merge/ # testament_sha1: 543cf441ba907c8a2588b7ca5e8138bdce77bdc7 # timestamp: 2010-08-12 03:52:47 -0600 # base_revision_id: jonathan.perkin@stripped\ # wdp3t6f52yxktbml # # Begin bundle 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 wtSo1gvAF/4u5IpwoSElJ2uM --===============4523656109464611631==--