From: Christopher Powers Date: February 16 2011 10:55pm Subject: bzr push into mysql-trunk-wl5379 branch (chris.powers:3230 to 3231) WL#4896 List-Archive: http://lists.mysql.com/commits/131491 Message-Id: <20110216225523.2E25E1DB0333@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============9157154923048064864==" --===============9157154923048064864== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3231 cpowers 2011-02-16 WL#4896 "Performance Schema Net IO" - Renamed performance_schema_max_sockets to ..max_socket_instances - Fixed events_waits aggregation for timer waits - close_socket instrument now destroys PFS socket instance - Renamed PFS_single_stat.aggregate_timed() to aggregate_value() - Added status variable performance_schema_socket_classes_lost - Enabled socket_shutdown() and socket_close() instruments - Instrumented vio::fastsend() modified: include/mysql/psi/mysql_socket.h sql/sys_vars.cc storage/perfschema/ha_perfschema.cc storage/perfschema/pfs.cc storage/perfschema/pfs_instr_class.h storage/perfschema/pfs_stat.h vio/vio.c vio/viosocket.c 3230 cpowers 2011-02-14 WL#4896 "Performance Schema Net IO" - Added events_waits hooks - Added object_name info as ip:port modified: storage/perfschema/pfs.cc storage/perfschema/pfs_events_waits.h storage/perfschema/pfs_instr.h storage/perfschema/table_events_waits.cc storage/perfschema/table_events_waits.h === modified file 'include/mysql/psi/mysql_socket.h' --- a/include/mysql/psi/mysql_socket.h 2011-02-12 00:22:15 +0000 +++ b/include/mysql/psi/mysql_socket.h 2011-02-16 22:53:35 +0000 @@ -242,17 +242,6 @@ inline_mysql_end_socket_wait(struct PSI_ inline_mysql_socket_accept(FD, A, LP) #endif -/** Not supported by P_S */ -#if 0 - #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_accept4(K, FD, A, LP, FL) \ - inline_mysql_socket_accept4(K, __FILE__, __LINE__, FD, A, LP, FL) - #else - #define mysql_socket_accept4(FD, A, LP, FL) \ - inline_mysql_socket_accept4(FD, A, LP, FL) - #endif -#endif - #ifdef HAVE_PSI_INTERFACE #define mysql_socket_close(FD) \ inline_mysql_socket_close(__FILE__, __LINE__, FD) @@ -269,6 +258,17 @@ inline_mysql_end_socket_wait(struct PSI_ inline_mysql_socket_shutdown(FD, H) #endif +/** Not supported by P_S */ +#if 0 + #ifdef HAVE_PSI_INTERFACE + #define mysql_socket_accept4(K, FD, A, LP, FL) \ + inline_mysql_socket_accept4(K, __FILE__, __LINE__, FD, A, LP, FL) + #else + #define mysql_socket_accept4(FD, A, LP, FL) \ + inline_mysql_socket_accept4(FD, A, LP, FL) + #endif +#endif + /** Not supported by Winsock */ #ifdef __WIN__ @@ -332,7 +332,6 @@ struct st_mysql_socket Note that this hook is not conditionally defined, for binary compatibility of the @c MYSQL_FILE interface. */ - struct PSI_socket *m_psi; }; @@ -754,45 +753,6 @@ inline_mysql_socket_accept return socket_accept; } -/** mysql_socket_accept4 */ - -#if 0 - static inline MYSQL_SOCKET - inline_mysql_socket_accept4 - ( - #ifdef HAVE_PSI_INTERFACE - PSI_socket_key key, const char *src_file, uint src_line, - #endif - MYSQL_SOCKET socket_listen, addr, socklen_t *addr_len, int flags) - { - MYSQL_SOCKET socket_accept = {0, NULL}; - #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; - PSI_socket_locker_state state; - - socket_accept.m_psi = PSI_server ? PSI_server->init_socket(key, NULL)// &socket_accept.fd) // TBD: check this - : NULL; - if (likely(PSI_server != NULL && socket_accept.m_psi != NULL)) - { - locker= PSI_server->get_thread_socket_locker(socket_accept.m_psi, PSI_SOCKET_CONNECT); - if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); - } - #endif - socket_accept.fd= accept4(socket_listen.fd, addr, addr_len, flags); - #ifdef HAVE_PSI_INTERFACE - /** Set socket address info */ - if (likely(PSI_server != NULL && socket_accept.m_psi != NULL - && socket_accept.fd != -1)) - PSI_server->set_socket_info(socket_accept.m_psi, socket_accept.fd, addr); - - if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker, (size_t)0); - #endif - return socket_accept; - } -#endif - /** mysql_socket_close */ static inline int @@ -818,7 +778,11 @@ inline_mysql_socket_close result= closesocket(mysql_socket.fd); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) + { PSI_server->end_socket_wait(locker, (size_t)0); + /* This socket will no longer be used by the server */ + PSI_server->destroy_socket(mysql_socket.m_psi); + } #endif return result; } @@ -853,6 +817,50 @@ inline_mysql_socket_shutdown return result; } +/** Not supported by P_S */ + +#if 0 + +/** mysql_socket_accept4 */ + + static inline MYSQL_SOCKET + inline_mysql_socket_accept4 + ( + #ifdef HAVE_PSI_INTERFACE + PSI_socket_key key, const char *src_file, uint src_line, + #endif + MYSQL_SOCKET socket_listen, addr, socklen_t *addr_len, int flags) + { + MYSQL_SOCKET socket_accept = {0, NULL}; + #ifdef HAVE_PSI_INTERFACE + struct PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + + socket_accept.m_psi = PSI_server ? PSI_server->init_socket(key, NULL)// &socket_accept.fd) // TBD: check this + : NULL; + if (likely(PSI_server != NULL && socket_accept.m_psi != NULL)) + { + locker= PSI_server->get_thread_socket_locker(socket_accept.m_psi, PSI_SOCKET_CONNECT); + if (likely(locker !=NULL)) + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); + } + #endif + socket_accept.fd= accept4(socket_listen.fd, addr, addr_len, flags); + #ifdef HAVE_PSI_INTERFACE + /** Set socket address info */ + if (likely(PSI_server != NULL && socket_accept.m_psi != NULL + && socket_accept.fd != -1)) + PSI_server->set_socket_info(socket_accept.m_psi, socket_accept.fd, addr); + + if (likely(locker != NULL)) + PSI_server->end_socket_wait(locker, (size_t)0); + #endif + return socket_accept; + } + +#endif // unsupported + + /** Not supported by Winsock */ #ifndef __WIN__ === modified file 'sql/sys_vars.cc' --- a/sql/sys_vars.cc 2011-01-14 19:33:04 +0000 +++ b/sql/sys_vars.cc 2011-02-16 22:53:35 +0000 @@ -135,7 +135,7 @@ static Sys_var_ulong Sys_pfs_max_file_in BLOCK_SIZE(1), PFS_TRAILING_PROPERTIES); static Sys_var_ulong Sys_pfs_max_sockets( - "performance_schema_max_sockets", + "performance_schema_max_socket_instances", "Maximum number of opened instrumented sockets.", READ_ONLY GLOBAL_VAR(pfs_param.m_socket_sizing), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 1024*1024), === modified file 'storage/perfschema/ha_perfschema.cc' --- a/storage/perfschema/ha_perfschema.cc 2010-12-08 03:24:30 +0000 +++ b/storage/perfschema/ha_perfschema.cc 2011-02-16 22:53:35 +0000 @@ -126,6 +126,8 @@ static struct st_mysql_show_var pfs_stat (char*) &thread_class_lost, SHOW_LONG_NOFLUSH}, {"Performance_schema_file_classes_lost", (char*) &file_class_lost, SHOW_LONG_NOFLUSH}, + {"Performance_schema_socket_classes_lost", + (char*) &socket_class_lost, SHOW_LONG_NOFLUSH}, {"Performance_schema_mutex_instances_lost", (char*) &mutex_lost, SHOW_LONG}, {"Performance_schema_rwlock_instances_lost", === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2011-02-14 23:26:08 +0000 +++ b/storage/perfschema/pfs.cc 2011-02-16 22:53:35 +0000 @@ -2794,7 +2794,7 @@ static void end_mutex_wait_v1(PSI_mutex_ timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (timed) */ - mutex->m_wait_stat.aggregate_timed(wait_time); + mutex->m_wait_stat.aggregate_value(wait_time); } else { @@ -2817,7 +2817,7 @@ static void end_mutex_wait_v1(PSI_mutex_ if (flags & STATE_FLAG_TIMED) { /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (timed) */ - event_name_array[index].aggregate_timed(wait_time); + event_name_array[index].aggregate_value(wait_time); } else { @@ -2886,7 +2886,7 @@ static void end_rwlock_rdwait_v1(PSI_rwl timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (timed) */ - rwlock->m_wait_stat.aggregate_timed(wait_time); + rwlock->m_wait_stat.aggregate_value(wait_time); } else { @@ -2921,7 +2921,7 @@ static void end_rwlock_rdwait_v1(PSI_rwl if (state->m_flags & STATE_FLAG_TIMED) { /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (timed) */ - event_name_array[index].aggregate_timed(wait_time); + event_name_array[index].aggregate_value(wait_time); } else { @@ -2991,7 +2991,7 @@ static void end_rwlock_wrwait_v1(PSI_rwl timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (timed) */ - rwlock->m_wait_stat.aggregate_timed(wait_time); + rwlock->m_wait_stat.aggregate_value(wait_time); } else { @@ -3018,7 +3018,7 @@ static void end_rwlock_wrwait_v1(PSI_rwl if (state->m_flags & STATE_FLAG_TIMED) { /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (timed) */ - event_name_array[index].aggregate_timed(wait_time); + event_name_array[index].aggregate_value(wait_time); } else { @@ -3088,7 +3088,7 @@ static void end_cond_wait_v1(PSI_cond_lo timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (timed) */ - cond->m_wait_stat.aggregate_timed(wait_time); + cond->m_wait_stat.aggregate_value(wait_time); } else { @@ -3108,7 +3108,7 @@ static void end_cond_wait_v1(PSI_cond_lo if (state->m_flags & STATE_FLAG_TIMED) { /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (timed) */ - event_name_array[index].aggregate_timed(wait_time); + event_name_array[index].aggregate_value(wait_time); } else { @@ -3206,7 +3206,7 @@ static void end_table_io_wait_v1(PSI_tab { timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; - stat->aggregate_timed(wait_time); + stat->aggregate_value(wait_time); } else { @@ -3283,7 +3283,7 @@ static void end_table_lock_wait_v1(PSI_t { timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; - stat->aggregate_timed(wait_time); + stat->aggregate_value(wait_time); } else { @@ -3426,7 +3426,7 @@ static void end_file_wait_v1(PSI_file_lo timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (timed) */ - file->m_wait_stat.aggregate_timed(wait_time); + file->m_wait_stat.aggregate_value(wait_time); } else { @@ -3445,7 +3445,7 @@ static void end_file_wait_v1(PSI_file_lo if (flags & STATE_FLAG_TIMED) { /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (timed) */ - event_name_array[index].aggregate_timed(wait_time); + event_name_array[index].aggregate_value(wait_time); } else { @@ -3545,9 +3545,9 @@ static void end_socket_wait_v1(PSI_socke PFS_socket *socket= reinterpret_cast (state->m_socket); DBUG_ASSERT(socket != NULL); + PFS_thread *thread= reinterpret_cast (state->m_thread); - PFS_single_stat *time_stat; - PFS_single_stat *io_stat; + PFS_single_stat *time_stat, *io_stat; switch (state->m_operation) { @@ -3604,33 +3604,57 @@ static void end_socket_wait_v1(PSI_socke { timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; - time_stat->aggregate_timed(wait_time); + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (timed) */ + socket->m_wait_stat.aggregate_value(wait_time); + /* Aggregate to current operation (timed) */ + time_stat->aggregate_value(wait_time); } else { + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (counted) */ + socket->m_wait_stat.aggregate_counted(); + /* Aggregate to current operation (counted) */ time_stat->aggregate_counted(); } - if (flags & STATE_FLAG_WAIT) + if (flags & STATE_FLAG_THREAD) { - DBUG_ASSERT(flags & STATE_FLAG_THREAD); - PFS_thread *thread= reinterpret_cast (state->m_thread); - DBUG_ASSERT(thread != NULL); + PFS_single_stat *event_name_array; + event_name_array= thread->m_instr_class_wait_stats; + uint index= socket->m_class->m_event_name_index; - PFS_events_waits *wait= reinterpret_cast (state->m_wait); - DBUG_ASSERT(wait != NULL); + if (flags & STATE_FLAG_TIMED) + { + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (timed) */ + event_name_array[index].aggregate_value(wait_time); + } + else + { + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (counted) */ + event_name_array[index].aggregate_counted(); + } - wait->m_timer_end= timer_end; - if (flag_events_waits_history) - insert_events_waits_history(thread, wait); - if (flag_events_waits_history_long) - insert_events_waits_history_long(wait); - thread->m_events_waits_count--; + if (flags & STATE_FLAG_WAIT) + { + DBUG_ASSERT(flags & STATE_FLAG_THREAD); + PFS_thread *thread= reinterpret_cast (state->m_thread); + DBUG_ASSERT(thread != NULL); + + PFS_events_waits *wait= reinterpret_cast (state->m_wait); + DBUG_ASSERT(wait != NULL); + + wait->m_timer_end= timer_end; + if (flag_events_waits_history) + insert_events_waits_history(thread, wait); + if (flag_events_waits_history_long) + insert_events_waits_history_long(wait); + thread->m_events_waits_count--; + } } - /** Aggregate the number of bytes for the operation */ + /** Aggregate number of bytes for the operation */ if ((int)byte_count > -1) - io_stat->aggregate_timed(byte_count); + io_stat->aggregate_value(byte_count); } static void set_socket_descriptor_v1(PSI_socket *socket, uint fd) === modified file 'storage/perfschema/pfs_instr_class.h' --- a/storage/perfschema/pfs_instr_class.h 2011-02-07 21:34:45 +0000 +++ b/storage/perfschema/pfs_instr_class.h 2011-02-16 22:53:35 +0000 @@ -373,6 +373,7 @@ extern ulong thread_class_lost; extern ulong file_class_max; extern ulong file_class_lost; extern ulong socket_class_max; +extern ulong socket_class_lost; extern ulong table_share_max; extern ulong table_share_lost; extern PFS_table_share *table_share_array; === modified file 'storage/perfschema/pfs_stat.h' --- a/storage/perfschema/pfs_stat.h 2011-02-07 21:34:45 +0000 +++ b/storage/perfschema/pfs_stat.h 2011-02-16 22:53:35 +0000 @@ -71,7 +71,7 @@ struct PFS_single_stat m_count++; } - inline void aggregate_timed(ulonglong value) + inline void aggregate_value(ulonglong value) { m_count++; m_sum+= value; @@ -82,7 +82,7 @@ struct PFS_single_stat } }; -/** Single statistic. */ +/** Combined statistic. */ struct PFS_multi_stat { /** Timer statistics */ === modified file 'vio/vio.c' --- a/vio/vio.c 2010-12-07 18:55:54 +0000 +++ b/vio/vio.c 2011-02-16 22:53:35 +0000 @@ -166,8 +166,8 @@ static void vio_init(Vio* vio, enum enum vio->has_data= (flags & VIO_BUFFERED_READ) ? vio_buff_has_data : has_no_data; #ifdef HAVE_PSI_INTERFACE - vio->mysql_socket.fd= sd; // TBDs - vio->mysql_socket.m_psi= NULL; + mysql_socket_getfd(vio->mysql_socket)= sd; + vio->mysql_socket.m_psi= NULL; // TBD #endif DBUG_VOID_RETURN; } === modified file 'vio/viosocket.c' --- a/vio/viosocket.c 2010-12-07 18:55:54 +0000 +++ b/vio/viosocket.c 2011-02-16 22:53:35 +0000 @@ -215,7 +215,9 @@ vio_is_blocking(Vio * vio) int vio_fastsend(Vio* vio __attribute__((unused))) { int r=0; + MYSQL_SOCKET_WAIT_VARIABLES(locker, state) /* no ';' */ DBUG_ENTER("vio_fastsend"); + MYSQL_START_SOCKET_WAIT(locker, &state, vio->mysql_socket.m_psi, PSI_SOCKET_OPT, 0); #if defined(IPTOS_THROUGHPUT) { @@ -234,8 +236,10 @@ int vio_fastsend(Vio* vio __attribute__( r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, IF_WIN((const char*), (void*)) &nodelay, sizeof(nodelay)); - } + + MYSQL_END_SOCKET_WAIT(locker, 0); + if (r) { DBUG_PRINT("warning", ("Couldn't set socket option for fast send")); @@ -249,9 +253,12 @@ int vio_keepalive(Vio* vio, my_bool set_ { int r=0; uint opt = 0; + MYSQL_SOCKET_WAIT_VARIABLES(locker, state) /* no ';' */ DBUG_ENTER("vio_keepalive"); DBUG_PRINT("enter", ("sd: %d set_keep_alive: %d", vio->sd, (int) set_keep_alive)); + MYSQL_START_SOCKET_WAIT(locker, &state, vio->mysql_socket.m_psi, PSI_SOCKET_OPT, 0); + if (vio->type != VIO_TYPE_NAMEDPIPE) { if (set_keep_alive) @@ -259,6 +266,8 @@ int vio_keepalive(Vio* vio, my_bool set_ r = setsockopt(vio->sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt)); } + + MYSQL_END_SOCKET_WAIT(locker, 0); DBUG_RETURN(r); } @@ -300,11 +309,11 @@ int vio_close(Vio * vio) DBUG_ASSERT(vio->type == VIO_TYPE_TCPIP || vio->type == VIO_TYPE_SOCKET || vio->type == VIO_TYPE_SSL); - DBUG_ASSERT(vio->sd >= 0); - if (shutdown(vio->sd, SHUT_RDWR)) + + if (mysql_socket_shutdown(vio->mysql_socket, SHUT_RDWR)) r= -1; - if (closesocket(vio->sd)) + if (mysql_socket_close(vio->mysql_socket)) r= -1; } if (r) @@ -314,6 +323,7 @@ int vio_close(Vio * vio) } vio->type= VIO_CLOSED; vio->sd= -1; + mysql_socket_getfd(vio->mysql_socket)= vio->sd; DBUG_RETURN(r); } --===============9157154923048064864== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/cpowers@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: cpowers@tma-1-20110216225335-t5qts3qnz02rw60a # target_branch: file:///home/cpowers/work/dev/base_mysql-trunk-\ # wl4896/ # testament_sha1: 38b1082219d33cf7bc088a071804ce6ab910254e # timestamp: 2011-02-16 16:55:22 -0600 # base_revision_id: cpowers@tma-1-20110214232608-xpt1ohgp4aa8trhw # # Begin bundle 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 4UJBSe7yNA== --===============9157154923048064864==--