From: Christopher Powers Date: August 25 2010 6:37pm Subject: bzr commit into mysql-5.5-bugfixing branch (chris.powers:3193) Bug#53874 List-Archive: http://lists.mysql.com/commits/116795 X-Bug: 53874 Message-Id: <20100825183750.9206C1DB0318@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7808752070572422476==" --===============7808752070572422476== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/cpowers/work/dev/dev-55-bugfixing/mysql/ based on revid:chris.powers@stripped 3193 Christopher Powers 2010-08-25 Bug# 53874 "SETUP_INSTRUMENTS.TIMED='NO' should not change TIMER_WAIT Handle combined instrument states of ENABLED and/or TIMED: ENABLED TIMED 1 1 Aggregate stats, increment counter 1 0 Increment counter 0 1 Do nothing 0 0 Do nothing @ storage/perfschema/pfs.cc Aggregate stats only if state is both ENABLED and TIMED. If ENABLED but not TIMED, only increment the value counter. @ storage/perfschema/pfs_stat.h Split aggregate and counter increment into separate methods for performance. modified: storage/perfschema/pfs.cc storage/perfschema/pfs_stat.h === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2010-08-19 22:24:07 +0000 +++ b/storage/perfschema/pfs.cc 2010-08-25 18:37:45 +0000 @@ -1496,7 +1496,7 @@ static void unlock_mutex_v1(PSI_mutex *m { ulonglong locked_time; locked_time= get_timer_value(wait_timer) - pfs_mutex->m_last_locked; - aggregate_single_stat_chain(&pfs_mutex->m_lock_stat, locked_time); + aggregate_single_stat_chain(&pfs_mutex->m_lock_stat, locked_time, true); } #endif } @@ -1563,7 +1563,7 @@ static void unlock_rwlock_v1(PSI_rwlock if (pfs_rwlock->m_class->m_timed) { locked_time= get_timer_value(wait_timer) - pfs_rwlock->m_last_written; - aggregate_single_stat_chain(&pfs_rwlock->m_write_lock_stat, locked_time); + aggregate_single_stat_chain(&pfs_rwlock->m_write_lock_stat, locked_time, true); } } else if (last_reader) @@ -1571,7 +1571,7 @@ static void unlock_rwlock_v1(PSI_rwlock if (pfs_rwlock->m_class->m_timed) { locked_time= get_timer_value(wait_timer) - pfs_rwlock->m_last_read; - aggregate_single_stat_chain(&pfs_rwlock->m_read_lock_stat, locked_time); + aggregate_single_stat_chain(&pfs_rwlock->m_read_lock_stat, locked_time, true); } } #endif @@ -1625,18 +1625,26 @@ static void end_mutex_wait_v1(PSI_mutex_ if (flag_events_waits_history_long) insert_events_waits_history_long(wait); - if (rc == 0 && wait->m_timer_state == TIMER_STATE_TIMED) + if (rc == 0) { /* Thread safe: we are protected by the instrumented mutex */ - PFS_single_stat_chain *stat; PFS_mutex *mutex= pfs_locker->m_target.m_mutex; + PFS_single_stat_chain *stat= find_per_thread_mutex_class_wait_stat(wait->m_thread, mutex->m_class); mutex->m_owner= wait->m_thread; mutex->m_last_locked= wait->m_timer_end; - ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; - aggregate_single_stat_chain(&mutex->m_wait_stat, wait_time); - stat= find_per_thread_mutex_class_wait_stat(wait->m_thread, mutex->m_class); - aggregate_single_stat_chain(stat, wait_time); + /* If timed then aggregate stats, else increment the value counts only */ + if (wait->m_timer_state == TIMER_STATE_TIMED) + { + ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; + aggregate_single_stat_chain(&mutex->m_wait_stat, wait_time); + aggregate_single_stat_chain(stat, wait_time); + } + else + { + increment_single_stat_chain(&mutex->m_wait_stat); + increment_single_stat_chain(stat); + } } wait->m_thread->m_wait_locker_count--; } @@ -1682,20 +1690,26 @@ static void end_rwlock_rdwait_v1(PSI_rwl The statistics generated are not safe, which is why they are just statistics, not facts. */ - PFS_single_stat_chain *stat; PFS_rwlock *rwlock= pfs_locker->m_target.m_rwlock; + PFS_single_stat_chain *stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class); + if (rwlock->m_readers == 0) rwlock->m_last_read= wait->m_timer_end; rwlock->m_writer= NULL; rwlock->m_readers++; + /* If timed then aggregate stats, else increment the value counts only */ if (wait->m_timer_state == TIMER_STATE_TIMED) { ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; aggregate_single_stat_chain(&rwlock->m_wait_stat, wait_time); - stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class); aggregate_single_stat_chain(stat, wait_time); } + else + { + increment_single_stat_chain(&rwlock->m_wait_stat); + increment_single_stat_chain(stat); + } } wait->m_thread->m_wait_locker_count--; } @@ -1735,21 +1749,26 @@ static void end_rwlock_wrwait_v1(PSI_rwl if (rc == 0) { /* Thread safe : we are protected by the instrumented rwlock */ - PFS_single_stat_chain *stat; PFS_rwlock *rwlock= pfs_locker->m_target.m_rwlock; + PFS_single_stat_chain *stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class); rwlock->m_writer= wait->m_thread; rwlock->m_last_written= wait->m_timer_end; /* Reset the readers stats, they could be off */ rwlock->m_readers= 0; rwlock->m_last_read= 0; + /* If timed then aggregate stats, else increment the value counts only */ if (wait->m_timer_state == TIMER_STATE_TIMED) { ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; aggregate_single_stat_chain(&rwlock->m_wait_stat, wait_time); - stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class); aggregate_single_stat_chain(stat, wait_time); } + else + { + increment_single_stat_chain(&rwlock->m_wait_stat); + increment_single_stat_chain(stat); + } } wait->m_thread->m_wait_locker_count--; } @@ -1803,16 +1822,21 @@ static void end_cond_wait_v1(PSI_cond_lo in condition B. This is accepted, the data will be slightly inaccurate. */ - PFS_single_stat_chain *stat; PFS_cond *cond= pfs_locker->m_target.m_cond; + PFS_single_stat_chain *stat= find_per_thread_cond_class_wait_stat(wait->m_thread, cond->m_class); + /* If timed then aggregate stats, else increment the value counts only */ if (wait->m_timer_state == TIMER_STATE_TIMED) { ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; aggregate_single_stat_chain(&cond->m_wait_stat, wait_time); - stat= find_per_thread_cond_class_wait_stat(wait->m_thread, cond->m_class); aggregate_single_stat_chain(stat, wait_time); } + else + { + increment_single_stat_chain(&cond->m_wait_stat); + increment_single_stat_chain(stat); + } } wait->m_thread->m_wait_locker_count--; } @@ -1855,12 +1879,18 @@ static void end_table_wait_v1(PSI_table_ if (flag_events_waits_history_long) insert_events_waits_history_long(wait); + PFS_table *table= pfs_locker->m_target.m_table; + + /* If timed then aggregate stats, else increment the value counts only */ if (wait->m_timer_state == TIMER_STATE_TIMED) { - PFS_table *table= pfs_locker->m_target.m_table; ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; aggregate_single_stat_chain(&table->m_wait_stat, wait_time); } + else + { + increment_single_stat_chain(&table->m_wait_stat); + } /* There is currently no per table and per thread aggregation. @@ -1962,14 +1992,21 @@ static void end_file_wait_v1(PSI_file_lo if (flag_events_waits_history_long) insert_events_waits_history_long(wait); - PFS_single_stat_chain *stat; PFS_file *file= pfs_locker->m_target.m_file; + PFS_single_stat_chain *stat= find_per_thread_file_class_wait_stat(wait->m_thread, file->m_class); - ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; - aggregate_single_stat_chain(&file->m_wait_stat, wait_time); - stat= find_per_thread_file_class_wait_stat(wait->m_thread, - file->m_class); - aggregate_single_stat_chain(stat, wait_time); + /* If timed then aggregate stats, else increment the value counts only */ + if (wait->m_timer_state == TIMER_STATE_TIMED) + { + ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; + aggregate_single_stat_chain(&file->m_wait_stat, wait_time); + aggregate_single_stat_chain(stat, wait_time); + } + else + { + increment_single_stat_chain(&file->m_wait_stat); + increment_single_stat_chain(stat); + } PFS_file_class *klass= file->m_class; === modified file 'storage/perfschema/pfs_stat.h' --- a/storage/perfschema/pfs_stat.h 2010-07-15 23:44:45 +0000 +++ b/storage/perfschema/pfs_stat.h 2010-08-25 18:37:45 +0000 @@ -83,6 +83,22 @@ inline void aggregate_single_stat_chain( while (stat); } +/** + Increment the value counts in a statistic chain. + Used for instruments that are 'ENABLED' but not 'TIMED'. + @param stat the aggregated statistic chain +*/ +inline void increment_single_stat_chain(PFS_single_stat_chain *stat) +{ + do + { + if (*stat->m_control_flag) + stat->m_count++; + stat= stat->m_parent; + } + while (stat); +} + /** Statistics for COND usage. */ struct PFS_cond_stat { --===============7808752070572422476== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/chris.powers@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: chris.powers@stripped # target_branch: file:///home/cpowers/work/dev/dev-55-bugfixing/mysql/ # testament_sha1: c7f36c214e9ab259495a46e989e8f7e28cfa3278 # timestamp: 2010-08-25 13:37:50 -0500 # base_revision_id: chris.powers@stripped\ # kz9nw6264sxpm6q4 # # Begin bundle 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 oSGVmY9q --===============7808752070572422476==--