List:Commits« Previous MessageNext Message »
From:Marc Alff Date:May 13 2011 4:16pm
Subject:bzr push into mysql-trunk branch (marc.alff:3084)
View as plain text  
 3084 Marc Alff	2011-05-13 [merge]
      Local merge

    modified:
      mysql-test/suite/rpl/r/rpl_begin_commit_rollback.result
      mysql-test/suite/rpl/t/rpl_begin_commit_rollback.test
=== modified file 'storage/perfschema/pfs.cc'
--- a/storage/perfschema/pfs.cc	2011-02-14 14:23:55 +0000
+++ b/storage/perfschema/pfs.cc	2011-05-13 13:44:31 +0000
@@ -1402,9 +1402,6 @@ static void destroy_cond_v1(PSI_cond* co
 static PSI_table_share*
 get_table_share_v1(my_bool temporary, TABLE_SHARE *share)
 {
-  /* Do not instrument this table is all table instruments are disabled. */
-  if (! global_table_io_class.m_enabled && ! global_table_lock_class.m_enabled)
-    return NULL;
   /* An instrumented thread is required, for LF_PINS. */
   PFS_thread *pfs_thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS);
   if (unlikely(pfs_thread == NULL))
@@ -1454,6 +1451,16 @@ open_table_v1(PSI_table_share *share, co
   PFS_thread *thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS);
   if (unlikely(thread == NULL))
     return NULL;
+
+  if (unlikely(setup_objects_version != pfs_table_share->m_setup_objects_version))
+  {
+    pfs_table_share->refresh_setup_object_flags(thread);
+  }
+
+  /* Do not instrument this table is all table instruments are disabled. */
+  if (! pfs_table_share->m_io_enabled && ! pfs_table_share->m_lock_enabled)
+    return NULL;
+
   PFS_table *pfs_table= create_table(pfs_table_share, thread, identity);
   return reinterpret_cast<PSI_table *> (pfs_table);
 }
@@ -2212,27 +2219,8 @@ get_thread_table_io_locker_v1(PSI_table_
   if (! flag_global_instrumentation)
     return NULL;
 
-  if (! global_table_io_class.m_enabled)
-    return NULL;
-
   PFS_table_share *share= pfs_table->m_share;
-  if (unlikely(setup_objects_version != share->m_setup_objects_version))
-  {
-    PFS_thread *pfs_thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS);
-    if (unlikely(pfs_thread == NULL))
-      return NULL;
-    /* Refresh the enabled and timed flags from SETUP_OBJECTS */
-    share->m_setup_objects_version= setup_objects_version;
-    lookup_setup_object(pfs_thread,
-                        OBJECT_TYPE_TABLE, /* even for temporary tables */
-                        share->m_schema_name,
-                        share->m_schema_name_length,
-                        share->m_table_name,
-                        share->m_table_name_length,
-                        & share->m_enabled,
-                        & share->m_timed);
-  }
-  if (! share->m_enabled)
+  if (! share->m_io_enabled)
     return NULL;
 
   PFS_instr_class *klass;
@@ -2250,7 +2238,7 @@ get_thread_table_io_locker_v1(PSI_table_
     state->m_thread= reinterpret_cast<PSI_thread *> (pfs_thread);
     flags= STATE_FLAG_THREAD;
 
-    if (klass->m_timed && share->m_timed)
+    if (share->m_io_timed)
       flags|= STATE_FLAG_TIMED;
 
     if (flag_events_waits_current)
@@ -2284,7 +2272,7 @@ get_thread_table_io_locker_v1(PSI_table_
   }
   else
   {
-    if (klass->m_timed && share->m_timed)
+    if (share->m_io_timed)
     {
       flags= STATE_FLAG_TIMED;
     }
@@ -2320,27 +2308,8 @@ get_thread_table_lock_locker_v1(PSI_tabl
   if (! flag_global_instrumentation)
     return NULL;
 
-  if (! global_table_lock_class.m_enabled)
-    return NULL;
-
   PFS_table_share *share= pfs_table->m_share;
-  if (unlikely(setup_objects_version != share->m_setup_objects_version))
-  {
-    PFS_thread *pfs_thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS);
-    if (unlikely(pfs_thread == NULL))
-      return NULL;
-    /* Refresh the enabled and timed flags from SETUP_OBJECTS */
-    share->m_setup_objects_version= setup_objects_version;
-    lookup_setup_object(pfs_thread,
-                        OBJECT_TYPE_TABLE, /* even for temporary tables */
-                        share->m_schema_name,
-                        share->m_schema_name_length,
-                        share->m_table_name,
-                        share->m_table_name_length,
-                        & share->m_enabled,
-                        & share->m_timed);
-  }
-  if (! share->m_enabled)
+  if (! share->m_lock_enabled)
     return NULL;
 
   PFS_instr_class *klass;
@@ -2380,7 +2349,7 @@ get_thread_table_lock_locker_v1(PSI_tabl
     state->m_thread= reinterpret_cast<PSI_thread *> (pfs_thread);
     flags= STATE_FLAG_THREAD;
 
-    if (klass->m_timed && share->m_timed)
+    if (share->m_lock_timed)
       flags|= STATE_FLAG_TIMED;
 
     if (flag_events_waits_current)
@@ -2414,7 +2383,7 @@ get_thread_table_lock_locker_v1(PSI_tabl
   }
   else
   {
-    if (klass->m_timed && share->m_timed)
+    if (share->m_lock_timed)
     {
       flags= STATE_FLAG_TIMED;
     }

=== modified file 'storage/perfschema/pfs_instr_class.cc'
--- a/storage/perfschema/pfs_instr_class.cc	2011-02-14 14:23:55 +0000
+++ b/storage/perfschema/pfs_instr_class.cc	2011-05-13 13:44:31 +0000
@@ -118,6 +118,36 @@ PFS_table_share *table_share_array= NULL
 PFS_instr_class global_table_io_class;
 PFS_instr_class global_table_lock_class;
 
+void PFS_instr_class::set_enabled(PFS_instr_class *pfs, bool enabled)
+{
+  pfs->m_enabled= enabled;
+
+  /*
+    When the table instruments are changed,
+    the cache on top of SETUP_OBJECTS is invalidated.
+  */
+  if ((pfs == & global_table_io_class) ||
+      (pfs == & global_table_lock_class))
+  {
+    setup_objects_version++;
+  }
+}
+
+void PFS_instr_class::set_timed(PFS_instr_class *pfs, bool timed)
+{
+  pfs->m_timed= timed;
+
+  /*
+    When the table instruments are changed,
+    the cache on top of SETUP_OBJECTS is invalidated.
+  */
+  if ((pfs == & global_table_io_class) ||
+      (pfs == & global_table_lock_class))
+  {
+    setup_objects_version++;
+  }
+}
+
 /**
   Hash index for instrumented table shares.
   This index is searched by table fully qualified name (@c PFS_table_share_key),
@@ -409,6 +439,24 @@ static void set_table_share_key(PFS_tabl
   }
 }
 
+void PFS_table_share::refresh_setup_object_flags(PFS_thread *thread)
+{
+  bool enabled;
+  bool timed;
+  m_setup_objects_version= setup_objects_version;
+  lookup_setup_object(thread,
+                      OBJECT_TYPE_TABLE,
+                      m_schema_name, m_schema_name_length,
+                      m_table_name, m_table_name_length,
+                      &enabled, &timed);
+
+  m_io_enabled= enabled && global_table_io_class.m_enabled;
+  m_io_timed= timed && global_table_io_class.m_timed;
+
+  m_lock_enabled= enabled && global_table_lock_class.m_enabled;
+  m_lock_timed= timed && global_table_lock_class.m_timed;
+}
+
 /**
   Initialize the file class buffer.
   @param file_class_sizing            max number of file class
@@ -1041,8 +1089,10 @@ PFS_table_share* find_or_create_table_sh
   uint retry_count= 0;
   uint version= 0;
   const uint retry_max= 3;
-  bool enabled= true;
-  bool timed= true;
+  bool io_enabled= true;
+  bool lock_enabled= true;
+  bool io_timed= true;
+  bool lock_timed= true;
 
 search:
   entry= reinterpret_cast<PFS_table_share**>
@@ -1065,6 +1115,8 @@ search:
 
   if (retry_count == 0)
   {
+    bool enabled;
+    bool timed;
     version= setup_objects_version;
     lookup_setup_object(thread,
                         OBJECT_TYPE_TABLE,
@@ -1072,6 +1124,12 @@ search:
                         table_name, table_name_length,
                         &enabled, &timed);
 
+    io_enabled= enabled && global_table_io_class.m_enabled;
+    io_timed= timed && global_table_io_class.m_timed;
+
+    lock_enabled= enabled && global_table_lock_class.m_enabled;
+    lock_timed= timed && global_table_lock_class.m_timed;
+
     /*
       Even when enabled is false, a record is added in the dictionary:
       - It makes enabling a table already in the table cache possible,
@@ -1101,8 +1159,10 @@ search:
           pfs->m_schema_name_length= schema_name_length;
           pfs->m_table_name= &pfs->m_key.m_hash_key[schema_name_length + 2];
           pfs->m_table_name_length= table_name_length;
-          pfs->m_enabled= enabled;
-          pfs->m_timed= timed;
+          pfs->m_io_enabled= io_enabled;
+          pfs->m_lock_enabled= lock_enabled;
+          pfs->m_io_timed= io_timed;
+          pfs->m_lock_timed= lock_timed;
           pfs->init_refcount();
           pfs->m_table_stat.reset();
           set_keys(pfs, share);

=== modified file 'storage/perfschema/pfs_instr_class.h'
--- a/storage/perfschema/pfs_instr_class.h	2011-02-14 14:23:55 +0000
+++ b/storage/perfschema/pfs_instr_class.h	2011-05-13 13:44:31 +0000
@@ -99,6 +99,9 @@ struct PFS_instr_class
   {
     return m_flags & PSI_FLAG_GLOBAL;
   }
+
+  static void set_enabled(PFS_instr_class *pfs, bool enabled);
+  static void set_timed(PFS_instr_class *pfs, bool timed);
 };
 
 struct PFS_mutex;
@@ -231,7 +234,17 @@ public:
     PFS_atomic::add_32(& m_refcount, -1);
   }
 
-  /** Setup object refresh version. */
+  void refresh_setup_object_flags(PFS_thread *thread);
+
+  /**
+    Setup object refresh version.
+    Cache version used when computing the enabled / timed flags.
+    @sa setup_objects_version
+    @sa m_io_enabled
+    @sa m_lock_enabled
+    @sa m_io_timed
+    @sa m_lock_timed
+  */
   uint m_setup_objects_version;
   /** Internal lock. */
   pfs_lock m_lock;
@@ -245,11 +258,14 @@ public:
   const char *m_table_name;
   /** Length in bytes of @c m_table_name. */
   uint m_table_name_length;
-  /** True if this table instrument is enabled. */
-  bool m_enabled;
-  /** True if this table instrument is timed. */
-  bool m_timed;
-  bool m_purge;
+  /** True if table io instrumentation is enabled. */
+  bool m_io_enabled;
+  /** True if table lock instrumentation is enabled. */
+  bool m_lock_enabled;
+  /** True if table io instrumentation is timed. */
+  bool m_io_timed;
+  /** True if table lock instrumentation is timed. */
+  bool m_lock_timed;
   /** Table statistics. */
   PFS_table_stat m_table_stat;
   /** Number of indexes. */

=== modified file 'storage/perfschema/pfs_setup_object.h'
--- a/storage/perfschema/pfs_setup_object.h	2011-02-04 11:55:17 +0000
+++ b/storage/perfschema/pfs_setup_object.h	2011-05-13 13:44:31 +0000
@@ -70,6 +70,20 @@ struct PFS_setup_object
   bool m_timed;
 };
 
+/**
+  Version number of the SETUP_OBJECTS cache.
+  The content of the SETUP_OBJECTS table,
+  and the content of SETUP_INSTRUMENTS table for instruments that apply to objects :
+  - wait/io/table/sql/handler
+  - wait/lock/table/sql/handler
+  is cached once for each object,
+  to avoid evaluating the object ENABLED and TIMED flags too frequently.
+  Incrementing @c setup_objects_version invalidates the cache.
+  @sa global_table_io_class
+  @sa global_table_lock_class
+  @sa PFS_table_share::refresh_setup_objects_flags
+  @sa PFS_table_share::m_setup_objects_version
+*/
 extern uint setup_objects_version;
 
 int init_setup_object(const PFS_global_param *param);

=== modified file 'storage/perfschema/table_setup_instruments.cc'
--- a/storage/perfschema/table_setup_instruments.cc	2011-02-14 14:23:55 +0000
+++ b/storage/perfschema/table_setup_instruments.cc	2011-05-13 13:44:31 +0000
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2008, 2011, 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
@@ -25,6 +25,7 @@
 #include "pfs_column_values.h"
 #include "table_setup_instruments.h"
 #include "pfs_global.h"
+#include "pfs_setup_object.h"
 
 THR_LOCK table_setup_instruments::m_table_lock;
 
@@ -173,10 +174,7 @@ int table_setup_instruments::rnd_pos(con
 
 void table_setup_instruments::make_row(PFS_instr_class *klass)
 {
-  m_row.m_name= &klass->m_name[0];
-  m_row.m_name_length= klass->m_name_length;
-  m_row.m_enabled_ptr= &klass->m_enabled;
-  m_row.m_timed_ptr= &klass->m_timed;
+  m_row.m_instr_class= klass;
 }
 
 int table_setup_instruments::read_row_values(TABLE *table,
@@ -200,16 +198,13 @@ int table_setup_instruments::read_row_va
       switch(f->field_index)
       {
       case 0: /* NAME */
-        set_field_varchar_utf8(f, m_row.m_name, m_row.m_name_length);
+        set_field_varchar_utf8(f, m_row.m_instr_class->m_name, m_row.m_instr_class->m_name_length);
         break;
       case 1: /* ENABLED */
-        set_field_enum(f, (*m_row.m_enabled_ptr) ? ENUM_YES : ENUM_NO);
+        set_field_enum(f, m_row.m_instr_class->m_enabled ? ENUM_YES : ENUM_NO);
         break;
       case 2: /* TIMED */
-        if (m_row.m_timed_ptr)
-          set_field_enum(f, (*m_row.m_timed_ptr) ? ENUM_YES : ENUM_NO);
-        else
-          set_field_enum(f, ENUM_NO);
+        set_field_enum(f, m_row.m_instr_class->m_timed ? ENUM_YES : ENUM_NO);
         break;
       default:
         DBUG_ASSERT(false);
@@ -238,14 +233,11 @@ int table_setup_instruments::update_row_
         return HA_ERR_WRONG_COMMAND;
       case 1: /* ENABLED */
         value= (enum_yes_no) get_field_enum(f);
-        *m_row.m_enabled_ptr= (value == ENUM_YES) ? true : false;
+        PFS_instr_class::set_enabled(m_row.m_instr_class, (value == ENUM_YES) ? true : false);
         break;
       case 2: /* TIMED */
-        if (m_row.m_timed_ptr)
-        {
-          value= (enum_yes_no) get_field_enum(f);
-          *m_row.m_timed_ptr= (value == ENUM_YES) ? true : false;
-        }
+        value= (enum_yes_no) get_field_enum(f);
+        PFS_instr_class::set_timed(m_row.m_instr_class, (value == ENUM_YES) ? true : false);
         break;
       default:
         DBUG_ASSERT(false);

=== modified file 'storage/perfschema/table_setup_instruments.h'
--- a/storage/perfschema/table_setup_instruments.h	2011-02-14 14:23:55 +0000
+++ b/storage/perfschema/table_setup_instruments.h	2011-05-13 13:44:31 +0000
@@ -32,14 +32,8 @@
 /** A row of PERFORMANCE_SCHEMA.SETUP_INSTRUMENTS. */
 struct row_setup_instruments
 {
-  /** Column NAME. */
-  const char *m_name;
-  /** Length in bytes of @c m_name. */
-  uint m_name_length;
-  /** Column ENABLED. */
-  bool *m_enabled_ptr;
-  /** Column TIMED. */
-  bool *m_timed_ptr;
+  /** Columns NAME, ENABLED, TIMED. */
+  PFS_instr_class *m_instr_class;
 };
 
 /** Position of a cursor on PERFORMANCE_SCHEMA.SETUP_INSTRUMENTS. */

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-trunk branch (marc.alff:3084) Marc Alff13 May