From: Christopher Powers Date: July 9 2010 2:23am Subject: bzr push into mysql-next-mr-wl4896 branch (chris.powers:3152 to 3153) WL#4896 List-Archive: http://lists.mysql.com/commits/113200 Message-Id: <20100709022343.0E3091DB0302@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2550306672676321094==" --===============2550306672676321094== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3153 Christopher Powers 2010-07-08 WL#4896 PERFORMANCE_SCHEMA Instrumenting Net IO Various bug fixes for last push modified: scripts/mysql_system_tables.sql storage/perfschema/ha_perfschema.cc storage/perfschema/pfs.cc storage/perfschema/pfs_engine_table.cc storage/perfschema/pfs_engine_table.h storage/perfschema/pfs_events_waits.h storage/perfschema/pfs_instr.cc storage/perfschema/pfs_instr.h storage/perfschema/table_all_instr.cc storage/perfschema/table_all_instr.h storage/perfschema/table_events_waits_summary.h storage/perfschema/table_setup_instruments.h storage/perfschema/table_socket_instances.cc storage/perfschema/table_socket_instances.h 3152 Christopher Powers 2010-07-07 WL#4896 PERFORMANCE_SCHEMA Instrumenting Net IO Added SOCKET_INSTANCES table, completed instrumentation of socket API added: storage/perfschema/table_socket_instances.cc storage/perfschema/table_socket_instances.h modified: include/mysql/psi/mysql_socket.h scripts/mysql_system_tables.sql sql/mysqld.cc sql/mysqld.h sql/sys_vars.cc storage/perfschema/CMakeLists.txt storage/perfschema/ha_perfschema.cc storage/perfschema/pfs.cc storage/perfschema/pfs_engine_table.cc storage/perfschema/pfs_engine_table.h storage/perfschema/pfs_instr.cc storage/perfschema/pfs_instr.h storage/perfschema/pfs_instr_class.cc storage/perfschema/pfs_server.cc storage/perfschema/pfs_server.h storage/perfschema/table_all_instr.cc storage/perfschema/table_all_instr.h storage/perfschema/table_events_waits_summary.cc storage/perfschema/table_events_waits_summary.h storage/perfschema/table_setup_instruments.cc storage/perfschema/table_setup_instruments.h === modified file 'scripts/mysql_system_tables.sql' --- a/scripts/mysql_system_tables.sql 2010-07-07 19:49:15 +0000 +++ b/scripts/mysql_system_tables.sql 2010-07-09 02:23:31 +0000 @@ -364,13 +364,12 @@ DROP PREPARE stmt; -- SET @l1="CREATE TABLE performance_schema.SOCKET_INSTANCES("; -SET @l2="SOCKET_DESC VARCHAR(512) not null,"; -SET @l3="EVENT_NAME VARCHAR(128) not null,"; -SET @l4="IDENTITY BIGINT not null,"; -SET @l5="OPEN_COUNT INTEGER unsigned not null"; -SET @l6=")ENGINE=PERFORMANCE_SCHEMA;"; +SET @l2="EVENT_NAME VARCHAR(128) not null,"; +SET @l3="OBJECT_INSTANCE_BEGIN BIGINT not null,"; +SET @l4="SOCKET_DESC VARCHAR(512) not null"; +SET @l5=")ENGINE=PERFORMANCE_SCHEMA;"; -SET @cmd=concat(@l1,@l2,@l3,@l4,@l5,@l6); +SET @cmd=concat(@l1,@l2,@l3,@l4,@l5); SET @str = IF(@have_pfs = 1, @cmd, 'SET @dummy = 0'); PREPARE stmt FROM @str; === modified file 'storage/perfschema/ha_perfschema.cc' --- a/storage/perfschema/ha_perfschema.cc 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/ha_perfschema.cc 2010-07-09 02:23:31 +0000 @@ -126,7 +126,7 @@ static struct st_mysql_show_var pfs_stat {"Performance_schema_file_handles_lost", (char*) &file_handle_lost, SHOW_LONG}, {"Performance_schema_socket_instances_lost", - (char*) &socket_lost, SHOW_LONG}, + (char*) &socket_instances_lost, SHOW_LONG}, {"Performance_schema_locker_lost", (char*) &locker_lost, SHOW_LONG}, /* table shares, can be flushed */ === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/pfs.cc 2010-07-09 02:23:31 +0000 @@ -1565,12 +1565,12 @@ get_thread_socket_locker_v1(PSI_socket * else pfs_locker->m_waits_current.m_timer_state= TIMER_STATE_UNTIMED; - pfs_locker->m_waits_current.m_object_instance_addr= pfs_socket; // TBD + pfs_locker->m_waits_current.m_object_instance_addr= pfs_socket; pfs_locker->m_waits_current.m_object_name= pfs_socket->m_socket_desc; pfs_locker->m_waits_current.m_object_name_length= pfs_socket->m_socket_desc_length; pfs_locker->m_waits_current.m_event_id= pfs_thread->m_event_id++; pfs_locker->m_waits_current.m_operation= socket_operation_map[static_cast(op)]; - pfs_locker->m_waits_current.m_wait_class= WAIT_CLASS_FILE; + pfs_locker->m_waits_current.m_wait_class= WAIT_CLASS_SOCKET; pfs_thread->m_wait_locker_count++; return reinterpret_cast (pfs_locker); === modified file 'storage/perfschema/pfs_engine_table.cc' --- a/storage/perfschema/pfs_engine_table.cc 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/pfs_engine_table.cc 2010-07-09 02:23:31 +0000 @@ -750,11 +750,11 @@ bool pfs_show_status(handlerton *hton, T break; case 51: name= "SOCKET_INSTANCES.ROW_COUNT"; - size= socket_max; + size= socket_instances_max; break; case 52: name= "SOCKET_INSTANCES.MEMORY"; - size= socket_max * sizeof(PFS_socket); + size= socket_instances_max * sizeof(PFS_socket); total_memory+= size; break; /* === modified file 'storage/perfschema/pfs_engine_table.h' --- a/storage/perfschema/pfs_engine_table.h 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/pfs_engine_table.h 2010-07-09 02:23:31 +0000 @@ -295,11 +295,13 @@ struct PFS_triple_index struct PFS_instrument_view_constants { + static const uint FIRST_VIEW=1; static const uint VIEW_MUTEX= 1; static const uint VIEW_RWLOCK= 2; static const uint VIEW_COND= 3; static const uint VIEW_FILE= 4; static const uint VIEW_SOCKET= 5; + static const uint LAST_VIEW= 6; }; struct PFS_object_view_constants === modified file 'storage/perfschema/pfs_events_waits.h' --- a/storage/perfschema/pfs_events_waits.h 2010-06-22 23:15:38 +0000 +++ b/storage/perfschema/pfs_events_waits.h 2010-07-09 02:23:31 +0000 @@ -41,7 +41,8 @@ enum events_waits_class WAIT_CLASS_RWLOCK, WAIT_CLASS_COND, WAIT_CLASS_TABLE, - WAIT_CLASS_FILE + WAIT_CLASS_FILE, + WAIT_CLASS_SOCKET }; /** State of a timer. */ === modified file 'storage/perfschema/pfs_instr.cc' --- a/storage/perfschema/pfs_instr.cc 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/pfs_instr.cc 2010-07-09 02:23:31 +0000 @@ -64,9 +64,9 @@ ulong table_max; /** Number of table instances lost. @sa table_array */ ulong table_lost; /** Size of the socket instances array. @sa socket_array */ -ulong socket_max; +ulong socket_instances_max; /** Number of socket instances lost. @sa socket_array */ -ulong socket_lost; +ulong socket_instances_lost; /** Number of EVENTS_WAITS_HISTORY records per thread. */ ulong events_waits_history_per_thread; /** Number of instruments class per thread. */ @@ -126,8 +126,8 @@ PFS_table *table_array= NULL; /** Socket instrumentation instances array. - @sa socket_max - @sa socket_lost + @sa socket_instances_max + @sa socket_instances_lost */ PFS_socket *socket_array= NULL; @@ -175,8 +175,8 @@ int init_instruments(const PFS_global_pa table_lost= 0; thread_max= param->m_thread_sizing; thread_lost= 0; - socket_max= param->m_socket_sizing; - socket_lost= 0; + socket_instances_max= param->m_socket_sizing; + socket_instances_lost= 0; events_waits_history_per_thread= param->m_events_waits_history_sizing; thread_history_sizing= param->m_thread_sizing @@ -243,9 +243,9 @@ int init_instruments(const PFS_global_pa return 1; } - if (socket_max > 0) + if (socket_instances_max > 0) { - socket_array= PFS_MALLOC_ARRAY(socket_max, PFS_socket, MYF(MY_ZEROFILL)); + socket_array= PFS_MALLOC_ARRAY(socket_instances_max, PFS_socket, MYF(MY_ZEROFILL)); if (unlikely(socket_array == NULL)) return 1; } @@ -448,7 +448,7 @@ void cleanup_instruments(void) file_handle_max= 0; pfs_free(socket_array); socket_array= NULL; - socket_max= 0; + socket_instances_max= 0; pfs_free(table_array); table_array= NULL; table_max= 0; @@ -1105,9 +1105,9 @@ void destroy_table(PFS_table *pfs) PFS_socket* create_socket(PFS_socket_class *klass, const void *identity) { PFS_scan scan; - uint random= randomized_index(identity, socket_max); + uint random= randomized_index(identity, socket_instances_max); - for (scan.init(random, socket_max); + for (scan.init(random, socket_instances_max); scan.has_pass(); scan.next_pass()) { @@ -1131,7 +1131,7 @@ PFS_socket* create_socket(PFS_socket_cla } } - socket_lost++; + socket_instances_lost++; return NULL; } === modified file 'storage/perfschema/pfs_instr.h' --- a/storage/perfschema/pfs_instr.h 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/pfs_instr.h 2010-07-09 02:23:31 +0000 @@ -309,8 +309,8 @@ extern long file_handle_max; extern ulong file_handle_lost; extern ulong table_max; extern ulong table_lost; -extern ulong socket_max; -extern ulong socket_lost; +extern ulong socket_instances_max; +extern ulong socket_instances_lost; extern ulong events_waits_history_per_thread; extern ulong instr_class_per_thread; extern ulong locker_lost; === modified file 'storage/perfschema/table_all_instr.cc' --- a/storage/perfschema/table_all_instr.cc 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/table_all_instr.cc 2010-07-09 02:23:31 +0000 @@ -96,7 +96,7 @@ int table_all_instr::rnd_next(void) } break; case pos_all_instr::VIEW_SOCKET: - for ( ; m_pos.m_index_2 < socket_max; m_pos.m_index_2++) + for ( ; m_pos.m_index_2 < socket_instances_max; m_pos.m_index_2++) { socket= &socket_array[m_pos.m_index_2]; if (socket->m_lock.is_populated()) @@ -161,7 +161,7 @@ int table_all_instr::rnd_pos(const void } break; case pos_all_instr::VIEW_SOCKET: - DBUG_ASSERT(m_pos.m_index_2 < socket_max); + DBUG_ASSERT(m_pos.m_index_2 < socket_instances_max); socket= &socket_array[m_pos.m_index_2]; if (socket->m_lock.is_populated()) { === modified file 'storage/perfschema/table_all_instr.h' --- a/storage/perfschema/table_all_instr.h 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/table_all_instr.h 2010-07-09 02:23:31 +0000 @@ -35,17 +35,17 @@ struct pos_all_instr_class : public PFS_ public PFS_instrument_view_constants { pos_all_instr_class() - : PFS_double_index(VIEW_MUTEX, 1) + : PFS_double_index(FIRST_VIEW, 1) {} inline void reset(void) { - m_index_1= VIEW_MUTEX; + m_index_1= FIRST_VIEW; m_index_2= 1; } inline bool has_more_view(void) - { return (m_index_1 <= VIEW_SOCKET); } + { return (m_index_1 <= LAST_VIEW); } inline void next_view(void) { @@ -95,17 +95,17 @@ struct pos_all_instr : public PFS_double public PFS_instrument_view_constants { pos_all_instr() - : PFS_double_index(VIEW_MUTEX, 0) + : PFS_double_index(FIRST_VIEW, 0) {} inline void reset(void) { - m_index_1= VIEW_MUTEX; + m_index_1= FIRST_VIEW; m_index_2= 0; } inline bool has_more_view(void) - { return (m_index_1 <= VIEW_SOCKET); } + { return (m_index_1 <= LAST_VIEW); } inline void next_view(void) { === modified file 'storage/perfschema/table_events_waits_summary.h' --- a/storage/perfschema/table_events_waits_summary.h 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/table_events_waits_summary.h 2010-07-09 02:23:31 +0000 @@ -64,13 +64,13 @@ struct pos_events_waits_summary_by_threa : public PFS_triple_index, public PFS_instrument_view_constants { pos_events_waits_summary_by_thread_by_event_name() - : PFS_triple_index(0, VIEW_MUTEX, 1) + : PFS_triple_index(0, FIRST_VIEW, 1) {} inline void reset(void) { m_index_1= 0; - m_index_2= VIEW_MUTEX; + m_index_2= FIRST_VIEW; m_index_3= 1; } @@ -78,12 +78,12 @@ struct pos_events_waits_summary_by_threa { return (m_index_1 < thread_max); } inline bool has_more_view(void) - { return (m_index_2 <= VIEW_SOCKET); } + { return (m_index_2 <= LAST_VIEW); } inline void next_thread(void) { m_index_1++; - m_index_2= VIEW_MUTEX; + m_index_2= FIRST_VIEW; m_index_3= 1; } === modified file 'storage/perfschema/table_setup_instruments.h' --- a/storage/perfschema/table_setup_instruments.h 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/table_setup_instruments.h 2010-07-09 02:23:31 +0000 @@ -45,6 +45,7 @@ struct row_setup_instruments /** Position of a cursor on PERFORMANCE_SCHEMA.SETUP_INSTRUMENTS. */ struct pos_setup_instruments : public PFS_double_index { + static const uint FIRST_VIEW= 1; static const uint VIEW_MUTEX= 1; static const uint VIEW_RWLOCK= 2; static const uint VIEW_COND= 3; @@ -52,19 +53,20 @@ struct pos_setup_instruments : public PF static const uint VIEW_THREAD= 4; static const uint VIEW_FILE= 5; static const uint VIEW_SOCKET= 6; + static const uint LAST_VIEW= 6; pos_setup_instruments() - : PFS_double_index(VIEW_MUTEX, 1) + : PFS_double_index(FIRST_VIEW, 1) {} inline void reset(void) { - m_index_1= VIEW_MUTEX; + m_index_1= FIRST_VIEW; m_index_2= 1; } inline bool has_more_view(void) - { return (m_index_1 <= VIEW_FILE); } + { return (m_index_1 <= LAST_VIEW); } inline void next_view(void) { === modified file 'storage/perfschema/table_socket_instances.cc' --- a/storage/perfschema/table_socket_instances.cc 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/table_socket_instances.cc 2010-07-09 02:23:31 +0000 @@ -31,30 +31,25 @@ THR_LOCK table_socket_instances::m_table static const TABLE_FIELD_TYPE field_types[]= { { - { C_STRING_WITH_LEN("SOCKET_DESC") }, - { C_STRING_WITH_LEN("varchar(512)") }, - { NULL, 0} - }, - { { C_STRING_WITH_LEN("EVENT_NAME") }, { C_STRING_WITH_LEN("varchar(128)") }, { NULL, 0} }, { - { C_STRING_WITH_LEN("IDENTITY") }, // TBD + { C_STRING_WITH_LEN("OBJECT_INSTANCE_BEGIN") }, { C_STRING_WITH_LEN("bigint(20)") }, { NULL, 0} }, { - { C_STRING_WITH_LEN("OPEN_COUNT") }, - { C_STRING_WITH_LEN("int(10)") }, + { C_STRING_WITH_LEN("SOCKET_DESC") }, + { C_STRING_WITH_LEN("varchar(512)") }, { NULL, 0} } }; TABLE_FIELD_DEF table_socket_instances::m_field_def= -{ 4, field_types }; +{ 3, field_types }; PFS_engine_table_share table_socket_instances::m_share= @@ -92,7 +87,7 @@ int table_socket_instances::rnd_next(voi PFS_socket *pfs; for (m_pos.set_at(&m_next_pos); - m_pos.m_index < socket_max; + m_pos.m_index < socket_instances_max; m_pos.next()) { pfs= &socket_array[m_pos.m_index]; @@ -112,7 +107,7 @@ int table_socket_instances::rnd_pos(cons PFS_socket *pfs; set_position(pos); - DBUG_ASSERT(m_pos.m_index < socket_max); + DBUG_ASSERT(m_pos.m_index < socket_instances_max); pfs= &socket_array[m_pos.m_index]; if (! pfs->m_lock.is_populated()) @@ -136,12 +131,11 @@ void table_socket_instances::make_row(PF if (unlikely(safe_class == NULL)) return; - m_row.m_socket_desc= pfs->m_socket_desc; - m_row.m_socket_desc_length= pfs->m_socket_desc_length; m_row.m_event_name= safe_class->m_name; m_row.m_event_name_length= safe_class->m_name_length; m_row.m_identity= pfs->m_identity; - m_row.m_open_count= pfs->m_socket_stat.m_open_count; + m_row.m_socket_desc= pfs->m_socket_desc; + m_row.m_socket_desc_length= pfs->m_socket_desc_length; if (pfs->m_lock.end_optimistic_lock(&lock)) m_row_exists= true; @@ -154,7 +148,7 @@ int table_socket_instances::read_row_val { Field *f; - if (unlikely(! m_row_exists)) + if (unlikely(!m_row_exists)) return HA_ERR_RECORD_DELETED; /* Set the null bits */ @@ -166,17 +160,14 @@ int table_socket_instances::read_row_val { switch(f->field_index) { - case 0: /* SOCKET_DESC */ - set_field_varchar_utf8(f, m_row.m_socket_desc, m_row.m_socket_desc_length); - break; - case 1: /* EVENT_NAME */ + case 0: /* EVENT_NAME */ set_field_varchar_utf8(f, m_row.m_event_name, m_row.m_event_name_length); break; - case 2: /* IDENTITY */ + case 1: /* OBJECT_INSTANCE_BEGIN */ set_field_ulonglong(f, (intptr)m_row.m_identity); break; - case 3: /* OPEN_COUNT */ - set_field_ulong(f, m_row.m_open_count); + case 2: /* SOCKET_DESC */ + set_field_varchar_utf8(f, m_row.m_socket_desc, m_row.m_socket_desc_length); break; default: DBUG_ASSERT(false); === modified file 'storage/perfschema/table_socket_instances.h' --- a/storage/perfschema/table_socket_instances.h 2010-07-07 19:49:15 +0000 +++ b/storage/perfschema/table_socket_instances.h 2010-07-09 02:23:31 +0000 @@ -32,18 +32,16 @@ /** A row of PERFORMANCE_SCHEMA.SOCKET_INSTANCES. */ struct row_socket_instances { - /** Column SOCKET_DESC. */ - const char *m_socket_desc; - /** Length in bytes of @c m_socket_desc. */ - uint m_socket_desc_length; /** Column EVENT_NAME. */ const char *m_event_name; /** Length in bytes of @c m_event_name. */ uint m_event_name_length; - /** IDENTITY TBD */ + /** Column OBJECT_INSTANCE_BEGIN */ const void *m_identity; - /** Column OPEN_COUNT. */ - uint m_open_count; + /** Column SOCKET_DESC. */ + const char *m_socket_desc; + /** Length in bytes of @c m_socket_desc. */ + uint m_socket_desc_length; }; /** Table PERFORMANCE_SCHEMA.SOCKET_INSTANCES. */ --===============2550306672676321094== 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-wl4896/mysql/ # testament_sha1: 00eebde53dfeb57755c6fa21c9c426a395cd3c72 # timestamp: 2010-07-08 21:23:42 -0500 # base_revision_id: chris.powers@stripped\ # tib7g12cnjlcge8e # # Begin bundle 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 oGDk6XeB8YD/4u5IpwoSAKAa4WA= --===============2550306672676321094==--