From: Marc Alff Date: February 4 2011 11:55am Subject: bzr commit into mysql-trunk branch (marc.alff:3592) List-Archive: http://lists.mysql.com/commits/130399 Message-Id: <201102041156.p14B7het005779@rcsinet13.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7856601606867631170==" --===============7856601606867631170== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/malff/BZR_TREE/mysql-trunk-cleanup/ based on revid:marc.alff@stripped 3592 Marc Alff 2011-02-04 Fixed broken doxygen markups. Added doxygen documentation for the performance schema. modified: sql/handler.cc sql/rpl_info_handler.h sql/sql_select.cc storage/perfschema/pfs.cc storage/perfschema/pfs_engine_table.cc storage/perfschema/pfs_engine_table.h storage/perfschema/pfs_instr.h storage/perfschema/pfs_instr_class.cc storage/perfschema/pfs_setup_actor.h storage/perfschema/pfs_setup_object.h storage/perfschema/pfs_stat.h storage/perfschema/pfs_timer.h storage/perfschema/table_helper.h === modified file 'sql/handler.cc' --- a/sql/handler.cc 2011-01-21 10:50:31 +0000 +++ b/sql/handler.cc 2011-02-04 11:55:17 +0000 @@ -705,7 +705,7 @@ void ha_close_connection(THD* thd) end. Such nested transaction was internally referred to as a "statement transaction" and gave birth to the term. - + (Historical note ends) Since then a statement transaction is started for each statement that accesses transactional tables or uses the binary log. If === modified file 'sql/rpl_info_handler.h' --- a/sql/rpl_info_handler.h 2010-10-25 10:39:01 +0000 +++ b/sql/rpl_info_handler.h 2011-02-04 11:55:17 +0000 @@ -55,13 +55,13 @@ public: /** Flushes and syncs in-memory information into a stable storage (i.e. repository). Usually, syncing after flushing depends on other options - such as @code relay-log-info-sync, master-info-sync. These options + such as @c relay-log-info-sync, @c master-info-sync. These options dictate after how many events or transactions the information should be synced. We can ignore them and always sync by setting the - parameter @code force, which is by default false, to @code true. + parameter @c force, which is by default @c false, to @c true. So if the number of events is below a threshold, the parameter - @code force is FALSE and we are using a file system as a storage + @c force is FALSE and we are using a file system as a storage system, it may happen that the changes will only end up in the operating system's cache and a crash may lead to inconsistencies. === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2011-02-01 14:24:57 +0000 +++ b/sql/sql_select.cc 2011-02-04 11:55:17 +0000 @@ -9220,7 +9220,7 @@ inline void add_cond_and_fix(Item **e1, @code SELECT A.f2 FROM t1 LEFT JOIN t2 A ON A.f2 = f1 WHERE A.f3=(SELECT MIN(f3) FROM t2 C WHERE A.f4 = C.f4) OR A.f3 IS NULL; - @endocde + @endcode Here condition A.f3 IS NOT NULL is going to be added to the WHERE condition of the embedding query. Another example: === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2010-12-09 16:17:13 +0000 +++ b/storage/perfschema/pfs.cc 2011-02-04 11:55:17 +0000 @@ -899,19 +899,30 @@ static inline int mysql_mutex_lock(...) @ingroup Performance_schema_implementation */ +/** TIMED bit in the state flags bitfield. */ #define STATE_FLAG_TIMED (1<<0) +/** THREAD bit in the state flags bitfield. */ #define STATE_FLAG_THREAD (1<<1) +/** EVENT bit in the state flags bitfield. */ #define STATE_FLAG_WAIT (1<<2) pthread_key(PFS_thread*, THR_PFS); bool THR_PFS_initialized= false; +/** + Conversion map from PSI_mutex_operation to enum_operation_type. + Indexed by enum PSI_mutex_operation. +*/ static enum_operation_type mutex_operation_map[]= { OPERATION_TYPE_LOCK, OPERATION_TYPE_TRYLOCK }; +/** + Conversion map from PSI_rwlock_operation to enum_operation_type. + Indexed by enum PSI_rwlock_operation. +*/ static enum_operation_type rwlock_operation_map[]= { OPERATION_TYPE_READLOCK, @@ -920,6 +931,10 @@ static enum_operation_type rwlock_operat OPERATION_TYPE_TRYWRITELOCK }; +/** + Conversion map from PSI_cond_operation to enum_operation_type. + Indexed by enum PSI_cond_operation. +*/ static enum_operation_type cond_operation_map[]= { OPERATION_TYPE_WAIT, @@ -1072,6 +1087,10 @@ static int build_prefix(const LEX_STRING C_MODE_START +/** + Implementation of the mutex instrumentation interface. + @sa PSI_v1::register_mutex. +*/ static void register_mutex_v1(const char *category, PSI_mutex_info_v1 *info, int count) @@ -1081,6 +1100,10 @@ static void register_mutex_v1(const char register_mutex_class) } +/** + Implementation of the rwlock instrumentation interface. + @sa PSI_v1::register_rwlock. +*/ static void register_rwlock_v1(const char *category, PSI_rwlock_info_v1 *info, int count) @@ -1090,6 +1113,10 @@ static void register_rwlock_v1(const cha register_rwlock_class) } +/** + Implementation of the cond instrumentation interface. + @sa PSI_v1::register_cond. +*/ static void register_cond_v1(const char *category, PSI_cond_info_v1 *info, int count) @@ -1099,6 +1126,10 @@ static void register_cond_v1(const char register_cond_class) } +/** + Implementation of the thread instrumentation interface. + @sa PSI_v1::register_thread. +*/ static void register_thread_v1(const char *category, PSI_thread_info_v1 *info, int count) @@ -1108,6 +1139,10 @@ static void register_thread_v1(const cha register_thread_class) } +/** + Implementation of the file instrumentation interface. + @sa PSI_v1::register_file. +*/ static void register_file_v1(const char *category, PSI_file_info_v1 *info, int count) @@ -1304,6 +1339,11 @@ static void create_file_v1(PSI_file_key file_handle_array[index]= pfs_file; } +/** + Arguments given from a parent to a child thread, packaged in one structure. + This data is used when spawning a new instrumented thread. + @sa pfs_spawn_thread. +*/ struct PFS_spawn_thread_arg { PFS_thread *m_parent_thread; @@ -1619,12 +1659,20 @@ static void set_thread_info_v1(const cha } } +/** + Implementation of the thread instrumentation interface. + @sa PSI_v1::set_thread. +*/ static void set_thread_v1(PSI_thread* thread) { PFS_thread *pfs= reinterpret_cast (thread); my_pthread_setspecific_ptr(THR_PFS, pfs); } +/** + Implementation of the thread instrumentation interface. + @sa PSI_v1::delete_current_thread. +*/ static void delete_current_thread_v1(void) { PFS_thread *thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS); @@ -1636,6 +1684,10 @@ static void delete_current_thread_v1(voi } } +/** + Implementation of the thread instrumentation interface. + @sa PSI_v1::delete_thread. +*/ static void delete_thread_v1(PSI_thread *thread) { PFS_thread *pfs= reinterpret_cast (thread); @@ -2471,6 +2523,10 @@ get_thread_file_descriptor_locker_v1(PSI return reinterpret_cast (state); } +/** + Implementation of the mutex instrumentation interface. + @sa PSI_v1::unlock_mutex. +*/ static void unlock_mutex_v1(PSI_mutex *mutex) { PFS_mutex *pfs_mutex= reinterpret_cast (mutex); @@ -2510,6 +2566,10 @@ static void unlock_mutex_v1(PSI_mutex *m #endif } +/** + Implementation of the rwlock instrumentation interface. + @sa PSI_v1::unlock_rwlock. +*/ static void unlock_rwlock_v1(PSI_rwlock *rwlock) { PFS_rwlock *pfs_rwlock= reinterpret_cast (rwlock); @@ -2586,6 +2646,10 @@ static void unlock_rwlock_v1(PSI_rwlock #endif } +/** + Implementation of the cond instrumentation interface. + @sa PSI_v1::signal_cond. +*/ static void signal_cond_v1(PSI_cond* cond) { PFS_cond *pfs_cond= reinterpret_cast (cond); @@ -2594,6 +2658,10 @@ static void signal_cond_v1(PSI_cond* con pfs_cond->m_cond_stat.m_signal_count++; } +/** + Implementation of the cond instrumentation interface. + @sa PSI_v1::broadcast_cond. +*/ static void broadcast_cond_v1(PSI_cond* cond) { PFS_cond *pfs_cond= reinterpret_cast (cond); === modified file 'storage/perfschema/pfs_engine_table.cc' --- a/storage/perfschema/pfs_engine_table.cc 2011-01-03 13:39:18 +0000 +++ b/storage/perfschema/pfs_engine_table.cc 2011-02-04 11:55:17 +0000 @@ -100,6 +100,7 @@ void PFS_engine_table_share::check_all_t (*current)->check_one_table(thd); } +/** Error reporting for schema integrity checks. */ class PFS_check_intact : public Table_check_intact { protected: @@ -465,6 +466,7 @@ int PFS_engine_table::update_row_values( return HA_ERR_WRONG_COMMAND; } +/** Implementation of internal ACL checks, for the performance schema. */ class PFS_internal_schema_access : public ACL_internal_schema_access { public: === modified file 'storage/perfschema/pfs_engine_table.h' --- a/storage/perfschema/pfs_engine_table.h 2010-07-30 09:02:32 +0000 +++ b/storage/perfschema/pfs_engine_table.h 2011-02-04 11:55:17 +0000 @@ -140,7 +140,9 @@ struct PFS_engine_table_share void check_one_table(THD *thd); static void init_all_locks(void); static void delete_all_locks(void); + /** Get the row count. */ ha_rows get_row_count(void) const; + /** Write a row. */ int write_row(TABLE *table, unsigned char *buf, Field **fields) const; /** Table name. */ @@ -172,6 +174,10 @@ struct PFS_engine_table_share bool m_checked; }; +/** + Privileges for read only tables. + The only operation allowed is SELECT. +*/ class PFS_readonly_acl : public ACL_internal_table_access { public: @@ -184,8 +190,13 @@ public: ACL_internal_access_result check(ulong want_access, ulong *save_priv) const; }; +/** Singleton instance of PFS_readonly_acl. */ extern PFS_readonly_acl pfs_readonly_acl; +/** + Privileges for truncatable tables. + Operations allowed are SELECT and TRUNCATE. +*/ class PFS_truncatable_acl : public ACL_internal_table_access { public: @@ -198,8 +209,13 @@ public: ACL_internal_access_result check(ulong want_access, ulong *save_priv) const; }; +/** Singleton instance of PFS_truncatable_acl. */ extern PFS_truncatable_acl pfs_truncatable_acl; +/** + Privileges for updatable tables. + Operations allowed are SELECT and UPDATE. +*/ class PFS_updatable_acl : public ACL_internal_table_access { public: @@ -212,8 +228,13 @@ public: ACL_internal_access_result check(ulong want_access, ulong *save_priv) const; }; +/** Singleton instance of PFS_updatable_acl. */ extern PFS_updatable_acl pfs_updatable_acl; +/** + Privileges for editable tables. + Operations allowed are SELECT, INSERT, UPDATE, DELETE and TRUNCATE. +*/ class PFS_editable_acl : public ACL_internal_table_access { public: @@ -226,8 +247,12 @@ public: ACL_internal_access_result check(ulong want_access, ulong *save_priv) const; }; +/** Singleton instance of PFS_editable_acl. */ extern PFS_editable_acl pfs_editable_acl; +/** + Privileges for unknown tables. +*/ class PFS_unknown_acl : public ACL_internal_table_access { public: @@ -240,6 +265,7 @@ public: ACL_internal_access_result check(ulong want_access, ulong *save_priv) const; }; +/** Singleton instance of PFS_unknown_acl. */ extern PFS_unknown_acl pfs_unknown_acl; /** Position of a cursor, for simple iterations. */ @@ -262,6 +288,7 @@ struct PFS_simple_index { m_index++; } }; +/** Position of a double cursor, for iterations using 2 nested loops. */ struct PFS_double_index { /** Outer index. */ @@ -286,6 +313,7 @@ struct PFS_double_index } }; +/** Position of a triple cursor, for iterations using 3 nested loops. */ struct PFS_triple_index { /** Outer index. */ === modified file 'storage/perfschema/pfs_instr.h' --- a/storage/perfschema/pfs_instr.h 2010-12-09 16:17:13 +0000 +++ b/storage/perfschema/pfs_instr.h 2011-02-04 11:55:17 +0000 @@ -42,6 +42,7 @@ struct PFS_thread_class; struct PFS_thread; +/** Base structure for wait instruments. */ struct PFS_instr { /** Internal lock. */ === modified file 'storage/perfschema/pfs_instr_class.cc' --- a/storage/perfschema/pfs_instr_class.cc 2010-12-09 16:17:13 +0000 +++ b/storage/perfschema/pfs_instr_class.cc 2011-02-04 11:55:17 +0000 @@ -335,7 +335,7 @@ void cleanup_table_share_hash(void) } /** - Get the hash pins for @table_share_hash. + Get the hash pins for @sa table_share_hash. @param thread The running thread. @returns The LF_HASH pins for the thread. */ @@ -1004,7 +1004,7 @@ void purge_table_share(PFS_thread *threa @param schema_name The table schema name @param schema_name_length The table schema name length @param table_name The table name - @parem table_name_length The table name length + @param table_name_length The table name length */ void drop_table_share(PFS_thread *thread, bool temporary, === modified file 'storage/perfschema/pfs_setup_actor.h' --- a/storage/perfschema/pfs_setup_actor.h 2010-07-10 03:31:35 +0000 +++ b/storage/perfschema/pfs_setup_actor.h 2011-02-04 11:55:17 +0000 @@ -35,6 +35,7 @@ struct PFS_global_param; @{ */ +/** Hash key for @sa PFS_setup_actor. */ struct PFS_setup_actor_key { /** @@ -47,6 +48,7 @@ struct PFS_setup_actor_key uint m_key_length; }; +/** A setup_actor record. */ struct PFS_setup_actor { /** Internal lock. */ === modified file 'storage/perfschema/pfs_setup_object.h' --- a/storage/perfschema/pfs_setup_object.h 2010-09-23 16:08:54 +0000 +++ b/storage/perfschema/pfs_setup_object.h 2011-02-04 11:55:17 +0000 @@ -32,6 +32,7 @@ struct PFS_global_param; @{ */ +/** Hash key for @sa PFS_setup_object. */ struct PFS_setup_object_key { /** @@ -43,6 +44,7 @@ struct PFS_setup_object_key uint m_key_length; }; +/** A setup_object record. */ struct PFS_setup_object { enum_object_type get_object_type() === modified file 'storage/perfschema/pfs_stat.h' --- a/storage/perfschema/pfs_stat.h 2010-12-09 16:17:13 +0000 +++ b/storage/perfschema/pfs_stat.h 2011-02-04 11:55:17 +0000 @@ -199,6 +199,7 @@ enum PFS_TL_LOCK_TYPE #define COUNT_PFS_TL_LOCK_TYPE 11 +/** Statistics for table locks. */ struct PFS_table_lock_stat { PFS_single_stat m_stat[COUNT_PFS_TL_LOCK_TYPE]; === modified file 'storage/perfschema/pfs_timer.h' --- a/storage/perfschema/pfs_timer.h 2010-09-23 16:08:54 +0000 +++ b/storage/perfschema/pfs_timer.h 2011-02-04 11:55:17 +0000 @@ -23,6 +23,12 @@ #include #include "pfs_column_types.h" +/** + A time normalizer. + A time normalizer consist of a transformation that + converts raw timer values (expressed in the timer unit) + to normalized values, expressed in picoseconds. +*/ struct time_normalizer { static time_normalizer* get(enum_timer_name timer_name); === modified file 'storage/perfschema/table_helper.h' --- a/storage/perfschema/table_helper.h 2011-01-07 16:20:19 +0000 +++ b/storage/perfschema/table_helper.h 2011-02-04 11:55:17 +0000 @@ -32,6 +32,7 @@ @{ */ +/** Namespace, internal views used within table setup_instruments. */ struct PFS_instrument_view_constants { static const uint FIRST_VIEW= 1; @@ -43,6 +44,7 @@ struct PFS_instrument_view_constants static const uint LAST_VIEW= 5; }; +/** Namespace, internal views used within object summaries. */ struct PFS_object_view_constants { static const uint FIRST_VIEW= 1; --===============7856601606867631170== 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-trunk-cleanup/ # testament_sha1: 3aa1dfd60e9f831dbdf872a0a0cbbc8279cf3216 # timestamp: 2011-02-04 12:55:46 +0100 # base_revision_id: marc.alff@stripped\ # p5azio9gpjr5oig6 # # Begin bundle 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 --===============7856601606867631170==--