List:Commits« Previous MessageNext Message »
From:Christopher Powers Date:August 25 2010 6:37pm
Subject:bzr commit into mysql-5.5-bugfixing branch (chris.powers:3193) Bug#53874
View as plain text  
#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
 {


Attachment: [text/bzr-bundle] bzr/chris.powers@oracle.com-20100825183745-66sa6wqsfc0x15bp.bundle
Thread
bzr commit into mysql-5.5-bugfixing branch (chris.powers:3193) Bug#53874Christopher Powers25 Aug