From: Christopher Powers Date: December 8 2010 3:25am Subject: bzr push into mysql-trunk-wl4896 branch (chris.powers:3211 to 3212) WL#4896 List-Archive: http://lists.mysql.com/commits/126282 Message-Id: <20101208032516.5FB491DB031E@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0752656218988977951==" --===============0752656218988977951== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3212 Christopher Powers 2010-12-07 WL#4896 Peformance schema Net IO Merge w/ mysql-trunk - build fixes modified: include/mysql/psi/psi.h include/violite.h sql/mysqld.cc storage/perfschema/ha_perfschema.cc storage/perfschema/pfs.cc storage/perfschema/pfs_instr.cc storage/perfschema/pfs_instr.h storage/perfschema/pfs_instr_class.cc storage/perfschema/pfs_instr_class.h storage/perfschema/pfs_stat.h storage/perfschema/table_all_instr.cc storage/perfschema/table_events_waits.cc storage/perfschema/table_setup_instruments.cc storage/perfschema/table_setup_instruments.h storage/perfschema/table_socket_instances.cc 3211 Christopher Powers 2010-12-07 WL#4896 Performance schema Net IO Merge with mysql-trunk: Forgot to 'bzr add' two files added: storage/perfschema/table_socket_instances.cc storage/perfschema/table_socket_instances.h === modified file 'include/mysql/psi/psi.h' --- a/include/mysql/psi/psi.h 2010-12-07 18:55:54 +0000 +++ b/include/mysql/psi/psi.h 2010-12-08 03:24:30 +0000 @@ -265,31 +265,22 @@ enum PSI_socket_operation { /** Socket creation, as in @c socket() or @c socketpair(). */ PSI_SOCKET_CREATE= 0, - /** Socket connection, as in @c connect(), @c listen() and @c accept(). */ PSI_SOCKET_CONNECT= 1, - /** Socket bind, as in @c bind(), @c getsockname() and @c getpeername(). */ PSI_SOCKET_BIND= 2, - /** Socket close, as in @c shutdown(). */ PSI_SOCKET_CLOSE= 3, - /** - Generic socket send, such as @c send(), @c sendto(), @c sendmsg(). */ + /** Generic socket send, such as @c send(), @c sendto(), @c sendmsg(). */ PSI_SOCKET_SEND= 4, - /** - Generic socket receive, such as @c recv(), @c recvfrom), @c recvmsg(). */ + /** Generic socket receive, such as @c recv(), @c recvfrom), @c recvmsg(). */ PSI_SOCKET_RECV= 5, - /** Generic socket seek, such as @c fseek() or @c seek(). */ PSI_SOCKET_SEEK= 6, - /** Socket options, as in @c getsockopt() and @c setsockopt(). */ PSI_SOCKET_OPT= 7, - /** Socket status, as in @c sockatmark() and @c isfdtype(). */ PSI_SOCKET_STAT= 8, - /** Socket shutdown, as in @c shutdown(). */ PSI_SOCKET_SHUTDOWN= 9 }; === modified file 'include/violite.h' --- a/include/violite.h 2010-06-07 14:01:39 +0000 +++ b/include/violite.h 2010-12-08 03:24:30 +0000 @@ -22,6 +22,7 @@ #define vio_violite_h_ #include "my_net.h" /* needed because of struct in_addr */ +#include /* Simple vio interface in C; The functions are implemented in violite.c */ @@ -46,6 +47,7 @@ enum enum_vio_type #define VIO_READ_BUFFER_SIZE 16384 /* size of read buffer */ Vio* vio_new(my_socket sd, enum enum_vio_type type, uint flags); +Vio* mysql_socket_vio_new(MYSQL_SOCKET mysql_socket, enum enum_vio_type type, uint flags); #ifdef __WIN__ Vio* vio_new_win32pipe(HANDLE hPipe); Vio* vio_new_win32shared_memory(HANDLE handle_file_map, @@ -188,6 +190,7 @@ enum SSL_type struct st_vio { my_socket sd; /* my_socket - real or imaginary */ + MYSQL_SOCKET mysql_socket; /* socket handle for performance schema */ HANDLE hPipe; my_bool localhost; /* Are we from localhost? */ int fcntl_mode; /* Buffered fcntl(sd,F_GETFL) */ @@ -197,10 +200,9 @@ struct st_vio enum enum_vio_type type; /* Type of connection */ char desc[30]; /* String description */ char *read_buffer; /* buffer for vio_read_buff */ - char *read_pos; /* start of unfetched data in the - read buffer */ + char *read_pos; /* start of unfetched data in the read buffer */ char *read_end; /* end of unfetched data */ - /* function pointers. They are similar for socket/SSL/whatever */ + /* Function pointers. They are similar for socket/SSL/whatever. */ void (*viodelete)(Vio*); int (*vioerrno)(Vio*); size_t (*read)(Vio*, uchar *, size_t); === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-12-07 18:55:54 +0000 +++ b/sql/mysqld.cc 2010-12-08 03:24:30 +0000 @@ -142,7 +142,7 @@ extern "C" { // Because of SCO 3.2V4 #include #endif -#ifdef __WIN__ +#ifdef __WIN__ #include #define SIGNAL_FMT "exception 0x%x" #else @@ -383,7 +383,7 @@ bool in_bootstrap= FALSE; @brief 'grant_option' is used to indicate if privileges needs to be checked, in which case the lock, LOCK_grant, is used to protect access to the grant table. - @note This flag is dropped in 5.1 + @note This flag is dropped in 5.1 @see grant_init() */ bool volatile grant_option; @@ -1270,18 +1270,18 @@ static void __cdecl kill_server(int sig_ else sql_print_error(ER_DEFAULT(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */ -#if defined(HAVE_SMEM) && defined(__WIN__) - /* - Send event to smem_event_connect_request for aborting - */ - if (!SetEvent(smem_event_connect_request)) - { +#if defined(HAVE_SMEM) && defined(__WIN__) + /* + Send event to smem_event_connect_request for aborting + */ + if (!SetEvent(smem_event_connect_request)) + { DBUG_PRINT("error", ("Got error: %ld from SetEvent of smem_event_connect_request", - GetLastError())); + GetLastError())); } -#endif - +#endif + close_connections(); if (sig != MYSQL_KILL_SIGNAL && sig != 0) @@ -2205,7 +2205,7 @@ extern "C" sig_handler abort_thread(int callstack. */ -static BOOL WINAPI console_event_handler( DWORD type ) +static BOOL WINAPI console_event_handler( DWORD type ) { DBUG_ENTER("console_event_handler"); #ifndef EMBEDDED_LIBRARY @@ -2213,7 +2213,7 @@ static BOOL WINAPI console_event_handler { /* Do not shutdown before startup is finished and shutdown - thread is initialized. Otherwise there is a race condition + thread is initialized. Otherwise there is a race condition between main thread doing initialization and CTRL-C thread doing cleanup, which can result into crash. */ @@ -2278,9 +2278,9 @@ LONG WINAPI my_unhandler_exception_filte #ifdef DEBUG_UNHANDLED_EXCEPTION_FILTER /* Unfortunately there is no clean way to debug unhandled exception filters, - as debugger does not stop there(also documented in MSDN) + as debugger does not stop there(also documented in MSDN) To overcome, one could put a MessageBox, but this will not work in service. - Better solution is to print error message and sleep some minutes + Better solution is to print error message and sleep some minutes until debugger is attached */ wait_for_debugger(DEBUGGER_ATTACH_TIMEOUT); @@ -2294,7 +2294,7 @@ LONG WINAPI my_unhandler_exception_filte { DWORD written; const char msg[] = "Got exception in exception handler!\n"; - WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),msg, sizeof(msg)-1, + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),msg, sizeof(msg)-1, &written,NULL); } /* @@ -2491,7 +2491,7 @@ You should either build a dynamically-li to be used with the LD_ASSUME_KERNEL environment variable. Please consult\n\ the documentation for your distribution on how to do that.\n"); #endif - + if (locked_in_memory) { fprintf(stderr, "\n\ @@ -3068,7 +3068,7 @@ SHOW_VAR com_status_vars[]= { /** Create the name of the default general log file - + @param[IN] buff Location for building new string. @param[IN] log_ext The extension for the file (e.g .log) @returns Pointer to a new string containing the name @@ -3167,13 +3167,13 @@ static int init_common_variables() strmake(default_logfile_name, STRING_WITH_LEN("mysql")); } else - strmake(default_logfile_name, glob_hostname, + strmake(default_logfile_name, glob_hostname, sizeof(default_logfile_name)-5); strmake(pidfile_name, default_logfile_name, sizeof(pidfile_name)-5); strmov(fn_ext(pidfile_name),".pid"); // Add proper extension - + /* The default-storage-engine entry in my_long_options should have a non-null default value. It was earlier intialized as @@ -3251,7 +3251,7 @@ static int init_common_variables() else { opt_large_pages= 0; - /* + /* Either not configured to use large pages or Linux haven't been compiled with large page support */ @@ -3427,7 +3427,7 @@ static int init_common_variables() global_system_variables.collation_connection= default_charset_info; global_system_variables.character_set_results= default_charset_info; global_system_variables.character_set_client= default_charset_info; - if (!(character_set_filesystem= + if (!(character_set_filesystem= get_charset_by_csname(character_set_filesystem_name, MY_CS_PRIMARY, MYF(MY_WME)))) return 1; @@ -3620,20 +3620,20 @@ static int init_thread_environment() #if defined(HAVE_OPENSSL) && !defined(HAVE_YASSL) static unsigned long openssl_id_function() -{ +{ return (unsigned long) pthread_self(); -} +} static openssl_lock_t *openssl_dynlock_create(const char *file, int line) -{ +{ openssl_lock_t *lock= new openssl_lock_t; mysql_rwlock_init(key_rwlock_openssl, &lock->lock); return lock; } -static void openssl_dynlock_destroy(openssl_lock_t *lock, const char *file, +static void openssl_dynlock_destroy(openssl_lock_t *lock, const char *file, int line) { mysql_rwlock_destroy(&lock->lock); @@ -3653,7 +3653,7 @@ static void openssl_lock_function(int mo } -static void openssl_lock(int mode, openssl_lock_t *lock, const char *file, +static void openssl_lock(int mode, openssl_lock_t *lock, const char *file, int line) { int err; @@ -3678,7 +3678,7 @@ static void openssl_lock(int mode, opens sql_print_error("Fatal: OpenSSL interface problem (mode=0x%x)", mode); abort(); } - if (err) + if (err) { sql_print_error("Fatal: can't %s OpenSSL lock", what); abort(); @@ -4008,9 +4008,9 @@ will be ignored as the --log-bin option if (opt_bin_log) { - /* Reports an error and aborts, if the --log-bin's path + /* Reports an error and aborts, if the --log-bin's path is a directory.*/ - if (opt_bin_logname && + if (opt_bin_logname && opt_bin_logname[strlen(opt_bin_logname) - 1] == FN_LIBCHAR) { sql_print_error("Path '%s' is a directory name, please specify \ @@ -4018,10 +4018,10 @@ a file name for --log-bin option", opt_b unireg_abort(1); } - /* Reports an error and aborts, if the --log-bin-index's path + /* Reports an error and aborts, if the --log-bin-index's path is a directory.*/ - if (opt_binlog_index_name && - opt_binlog_index_name[strlen(opt_binlog_index_name) - 1] + if (opt_binlog_index_name && + opt_binlog_index_name[strlen(opt_binlog_index_name) - 1] == FN_LIBCHAR) { sql_print_error("Path '%s' is a directory name, please specify \ @@ -4149,7 +4149,7 @@ a file name for --log-bin-index option", /* if the errmsg.sys is not loaded, terminate to maintain behaviour */ if (!DEFAULT_ERRMSGS[0][0]) - unireg_abort(1); + unireg_abort(1); /* We have to initialize the storage engines before CSV logging */ if (ha_init()) @@ -4361,7 +4361,7 @@ static void handle_connections_methods() handler_count--; } } -#endif +#endif while (handler_count > 0) mysql_cond_wait(&COND_handler_count, &LOCK_thread_count); @@ -4633,7 +4633,7 @@ int mysqld_main(int argc, char **argv) #ifndef DBUG_OFF test_lc_time_sz(); - srand(time(NULL)); + srand(time(NULL)); #endif /* @@ -4811,7 +4811,7 @@ int mysqld_main(int argc, char **argv) #endif /* _WIN32 || HAVE_SMEM */ /* (void) pthread_attr_destroy(&connection_attrib); */ - + DBUG_PRINT("quit",("Exiting main thread")); #ifndef __WIN__ @@ -4919,10 +4919,10 @@ default_service_handling(char **argv, pos= add_quoted_string(path_and_service, file_path, end); if (*extra_opt) { - /* - Add option after file_path. There will be zero or one extra option. It's + /* + Add option after file_path. There will be zero or one extra option. It's assumed to be --defaults-file=file but isn't checked. The variable (not - the option name) should be quoted if it contains a string. + the option name) should be quoted if it contains a string. */ *pos++= ' '; if (opt_delim= strchr(extra_opt, '=')) @@ -4932,7 +4932,7 @@ default_service_handling(char **argv, } else opt_delim= extra_opt; - + pos= add_quoted_string(pos, opt_delim, end); } /* We must have servicename last */ @@ -5921,8 +5921,8 @@ struct my_option my_long_options[]= "The value has to be a multiple of 256.", &opt_binlog_rows_event_max_size, &opt_binlog_rows_event_max_size, 0, GET_ULONG, REQUIRED_ARG, - /* def_value */ 1024, /* min_value */ 256, /* max_value */ ULONG_MAX, - /* sub_size */ 0, /* block_size */ 256, + /* def_value */ 1024, /* min_value */ 256, /* max_value */ ULONG_MAX, + /* sub_size */ 0, /* block_size */ 256, /* app_type */ 0 }, #ifndef DISABLE_GRANT_OPTIONS @@ -6053,7 +6053,7 @@ struct my_option my_long_options[]= REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"master-retry-count", OPT_MASTER_RETRY_COUNT, "The number of tries the slave will make to connect to the master before giving up. " - "Deprecated option, use 'CHANGE MASTER TO master_retry_count = ' instead.", + "Deprecated option, use 'CHANGE MASTER TO master_retry_count = ' instead.", &master_retry_count, &master_retry_count, 0, GET_ULONG, REQUIRED_ARG, 3600*24, 0, 0, 0, 0, 0}, #ifdef HAVE_REPLICATION @@ -6269,7 +6269,7 @@ static int show_slave_running(THD *thd, var->type= SHOW_MY_BOOL; mysql_mutex_lock(&LOCK_active_mi); var->value= buff; - *((my_bool *)buff)= (my_bool) (active_mi && + *((my_bool *)buff)= (my_bool) (active_mi && active_mi->slave_running == MYSQL_SLAVE_RUN_CONNECT && active_mi->rli->slave_running); mysql_mutex_unlock(&LOCK_active_mi); @@ -6322,7 +6322,7 @@ static int show_slave_last_heartbeat(THD { var->type= SHOW_CHAR; var->value= buff; - thd->variables.time_zone->gmt_sec_to_TIME(&received_heartbeat_time, + thd->variables.time_zone->gmt_sec_to_TIME(&received_heartbeat_time, active_mi->last_heartbeat); my_datetime_to_str(&received_heartbeat_time, buff); } @@ -6540,7 +6540,7 @@ static int show_ssl_ctx_get_session_cach } /* - Functions relying on SSL + Functions relying on SSL Note: In the show_ssl_* functions, we need to check if we have a valid vio-object since this isn't always true, specifically when session_status or global_status is requested from @@ -6986,7 +6986,7 @@ static int mysql_init_variables(void) character_set_filesystem_name= (char*) "binary"; lc_messages= (char*) "en_US"; lc_time_names_name= (char*) "en_US"; - + /* Variables that depends on compile options */ #ifndef DBUG_OFF default_dbug_option=IF_WIN("d:t:i:O,\\mysqld.trace", @@ -7272,13 +7272,13 @@ mysqld_get_one_option(int optid, break; case (int) OPT_BIND_ADDRESS: { - struct addrinfo *res_lst, hints; + struct addrinfo *res_lst, hints; bzero(&hints, sizeof(struct addrinfo)); hints.ai_socktype= SOCK_STREAM; hints.ai_protocol= IPPROTO_TCP; - if (getaddrinfo(argument, NULL, &hints, &res_lst) != 0) + if (getaddrinfo(argument, NULL, &hints, &res_lst) != 0) { sql_print_error("Can't start server: cannot resolve hostname!"); return 1; @@ -7637,7 +7637,7 @@ fn_format_relative_to_data_home(char * t /** Test a file path to determine if the path is compatible with the secure file path restriction. - + @param path null terminated character string @return @@ -7699,7 +7699,7 @@ static int fix_paths(void) opt_plugin_dir_ptr= opt_plugin_dir; my_realpath(mysql_unpacked_real_data_home, mysql_real_data_home, MYF(0)); - mysql_unpacked_real_data_home_len= + mysql_unpacked_real_data_home_len= (int) strlen(mysql_unpacked_real_data_home); if (mysql_unpacked_real_data_home[mysql_unpacked_real_data_home_len-1] == FN_LIBCHAR) --mysql_unpacked_real_data_home_len; @@ -7755,7 +7755,7 @@ static int fix_paths(void) opt_secure_file_priv= secure_file_real_path; } } - + return 0; } @@ -8127,6 +8127,9 @@ void init_server_psi_keys(void) count= array_elements(all_server_files); PSI_server->register_file(category, all_server_files, count); + + count= array_elements(all_server_sockets); + PSI_server->register_socket(category, all_server_sockets, count); } #endif /* HAVE_PSI_INTERFACE */ === modified file 'storage/perfschema/ha_perfschema.cc' --- a/storage/perfschema/ha_perfschema.cc 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/ha_perfschema.cc 2010-12-08 03:24:30 +0000 @@ -139,7 +139,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_instances_lost, SHOW_LONG}, + (char*) &socket_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-12-07 18:55:54 +0000 +++ b/storage/perfschema/pfs.cc 2010-12-08 03:24:30 +0000 @@ -2422,7 +2422,7 @@ get_thread_socket_locker_v1(PSI_socket_l if (flag_events_waits_current) { - if (unlikely(pfs_thread->m_wait_waits_count >= WAIT_STACK_SIZE)) + if (unlikely(pfs_thread->m_events_waits_count >= WAIT_STACK_SIZE)) { locker_lost++; return NULL; @@ -2466,7 +2466,6 @@ get_thread_socket_locker_v1(PSI_socket_l state->m_flags= flags; state->m_socket= socket; - state->m_class= klass; state->m_operation= op; return reinterpret_cast (state); } @@ -3311,86 +3310,130 @@ static void start_socket_wait_v1(PSI_soc static void end_socket_wait_v1(PSI_socket_locker *locker, size_t count); +/** + Implementation of the socket instrumentation interface. + @sa PSI_v1::start_socket_wait. +*/ static void start_socket_wait_v1(PSI_socket_locker *locker, - size_t count, - const char *src_file, - uint src_line) + size_t count, + const char *src_file, + uint src_line) { - PFS_wait_locker *pfs_locker= reinterpret_cast (locker); - DBUG_ASSERT(pfs_locker != NULL); + ulonglong timer_start= 0; + PSI_socket_locker_state *state= reinterpret_cast (locker); + DBUG_ASSERT(state != NULL); + + register uint flags= state->m_flags; + + if (flags & STATE_FLAG_TIMED) + { + timer_start= get_timer_raw_value_and_function(wait_timer, & state->m_timer); + state->m_timer_start= timer_start; + } - PFS_events_waits *wait=&pfs_locker->m_waits_current; - if (wait->m_timer_state == TIMER_STATE_STARTING) + if (flags & STATE_FLAG_WAIT) { - wait->m_timer_start= get_timer_value(pfs_locker->m_timer_name); - wait->m_timer_state= TIMER_STATE_STARTED; + PFS_events_waits *wait= reinterpret_cast (state->m_wait); + DBUG_ASSERT(wait != NULL); + + wait->m_timer_start= timer_start; + wait->m_source_file= src_file; + wait->m_source_line= src_line; + wait->m_number_of_bytes= count; } - wait->m_source_file= src_file; - wait->m_source_line= src_line; - wait->m_number_of_bytes= count; } +/** + Implementation of the socket instrumentation interface. + @sa PSI_v1::end_socket_wait. +*/ static void end_socket_wait_v1(PSI_socket_locker *locker, size_t count) { - PFS_wait_locker *pfs_locker= reinterpret_cast (locker); - DBUG_ASSERT(pfs_locker != NULL); - PFS_events_waits *wait= &pfs_locker->m_waits_current; + PSI_socket_locker_state *state= reinterpret_cast (locker); + DBUG_ASSERT(state != NULL); + ulonglong timer_end= 0; + ulonglong wait_time= 0; - wait->m_number_of_bytes= count; - if (wait->m_timer_state == TIMER_STATE_STARTED) + PFS_socket *socket= reinterpret_cast (state->m_socket); + DBUG_ASSERT(socket != NULL); + PFS_thread *thread= reinterpret_cast (state->m_thread); + + register uint flags= state->m_flags; + + if (flags & STATE_FLAG_TIMED) { - wait->m_timer_end= get_timer_value(pfs_locker->m_timer_name); - wait->m_timer_state= TIMER_STATE_TIMED; + timer_end= state->m_timer(); + wait_time= timer_end - state->m_timer_start; + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (timed) */ + socket->m_wait_stat.aggregate_timed(wait_time); + } + else + { + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_INSTANCE (counted) */ + socket->m_wait_stat.aggregate_counted(); } - if (flag_events_waits_history) - insert_events_waits_history(wait->m_thread, wait); - if (flag_events_waits_history_long) - insert_events_waits_history_long(wait); - PFS_single_stat_chain *stat; - PFS_socket *socket= pfs_locker->m_target.m_socket; + if (flags & STATE_FLAG_THREAD) + { + DBUG_ASSERT(thread != NULL); - ulonglong wait_time= wait->m_timer_end - wait->m_timer_start; - aggregate_single_stat_chain(&socket->m_wait_stat, wait_time); - stat= find_per_thread_socket_class_wait_stat(wait->m_thread, - socket->m_class); - aggregate_single_stat_chain(stat, wait_time); + 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_socket_class *klass= socket->m_class; + if (flags & STATE_FLAG_TIMED) + { + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (timed) */ + event_name_array[index].aggregate_timed(wait_time); + } + else + { + /* Aggregate to EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME (counted) */ + event_name_array[index].aggregate_counted(); + } - switch(wait->m_operation) + if (state->m_flags & STATE_FLAG_WAIT) + { + PFS_events_waits *wait= reinterpret_cast (state->m_wait); + DBUG_ASSERT(wait != NULL); + + wait->m_timer_end= timer_end; + wait->m_number_of_bytes= count; + 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--; + } + } + + switch(state->m_operation) { - case OPERATION_TYPE_SOCKETCREATE: - socket->m_socket_stat.m_open_count++; - klass->m_socket_stat.m_open_count++; + case PSI_SOCKET_CREATE: +// socket->m_socket_stat.m_open_count++; +// klass->m_socket_stat.m_open_count++; break; - case OPERATION_TYPE_SOCKETSEND: - socket->m_socket_stat.m_count_send++; - socket->m_socket_stat.m_send_bytes+= count; - klass->m_socket_stat.m_send_bytes+= count; + case PSI_SOCKET_SEND: + socket->m_socket_stat.m_io_stat.aggregate_write(count); break; - case OPERATION_TYPE_SOCKETRECV: - socket->m_socket_stat.m_count_recv++; - socket->m_socket_stat.m_recv_bytes+= count; - klass->m_socket_stat.m_recv_bytes+= count; + case PSI_SOCKET_RECV: + socket->m_socket_stat.m_io_stat.aggregate_read(count); break; - case OPERATION_TYPE_SOCKETCLOSE: + case PSI_SOCKET_CLOSE: /** close() frees the file descriptor, shutdown() does not */ - release_socket(pfs_locker->m_target.m_socket); - destroy_socket(pfs_locker->m_target.m_socket); + release_socket(socket); + destroy_socket(socket); break; - case OPERATION_TYPE_SOCKETCONNECT: - case OPERATION_TYPE_SOCKETBIND: - case OPERATION_TYPE_SOCKETSTAT: - case OPERATION_TYPE_SOCKETOPT: - case OPERATION_TYPE_SOCKETSEEK: - case OPERATION_TYPE_SOCKETSHUTDOWN: + case PSI_SOCKET_CONNECT: + case PSI_SOCKET_BIND: + case PSI_SOCKET_STAT: + case PSI_SOCKET_OPT: + case PSI_SOCKET_SEEK: + case PSI_SOCKET_SHUTDOWN: break; default: break; } - - wait->m_thread->m_wait_locker_count--; } static void set_socket_descriptor_v1(PSI_socket *socket, uint fd) @@ -3401,7 +3444,7 @@ static void set_socket_descriptor_v1(PSI } static void set_socket_address_v1(PSI_socket *socket, - const struct sockaddr * socket_addr) + const struct sockaddr * socket_addr) { DBUG_ASSERT(socket); PFS_socket *pfs= reinterpret_cast(socket); @@ -3432,8 +3475,8 @@ static void set_socket_address_v1(PSI_so } static void set_socket_info_v1(PSI_socket *socket, - uint fd, - const struct sockaddr * addr) + uint fd, + const struct sockaddr * addr) { DBUG_ASSERT(socket); PFS_socket *pfs= reinterpret_cast(socket); === modified file 'storage/perfschema/pfs_instr.cc' --- a/storage/perfschema/pfs_instr.cc 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/pfs_instr.cc 2010-12-08 03:24:30 +0000 @@ -65,9 +65,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_instances_max; +ulong socket_max; /** Number of socket instances lost. @sa socket_array */ -ulong socket_instances_lost; +ulong socket_lost; /** Number of EVENTS_WAITS_HISTORY records per thread. */ ulong events_waits_history_per_thread; /** Number of locker lost. @sa LOCKER_STACK_SIZE. */ @@ -125,8 +125,8 @@ PFS_table *table_array= NULL; /** Socket instrumentation instances array. - @sa socket_instances_max - @sa socket_instances_lost + @sa socket_max + @sa socket_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_instances_max= param->m_socket_sizing; - socket_instances_lost= 0; + socket_max= param->m_socket_sizing; + socket_lost= 0; events_waits_history_per_thread= param->m_events_waits_history_sizing; thread_history_sizing= param->m_thread_sizing @@ -239,9 +239,9 @@ int init_instruments(const PFS_global_pa return 1; } - if (socket_instances_max > 0) + if (socket_max > 0) { - socket_array= PFS_MALLOC_ARRAY(socket_instances_max, PFS_socket, MYF(MY_ZEROFILL)); + socket_array= PFS_MALLOC_ARRAY(socket_max, PFS_socket, MYF(MY_ZEROFILL)); if (unlikely(socket_array == NULL)) return 1; } @@ -333,7 +333,7 @@ void cleanup_instruments(void) table_max= 0; pfs_free(socket_array); socket_array= NULL; - socket_instances_max= 0; + socket_max= 0; pfs_free(thread_array); thread_array= NULL; thread_max= 0; @@ -750,9 +750,9 @@ const char *sanitize_file_name(const cha intptr offset= (ptr - first) % sizeof(PFS_file); intptr valid_offset= my_offsetof(PFS_file, m_filename[0]); if (likely(offset == valid_offset)) - { + { return unsafe; - } + } } return NULL; } @@ -1078,9 +1078,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_instances_max); + uint random= randomized_index(identity, socket_max); - for (scan.init(random, socket_instances_max); + for (scan.init(random, socket_max); scan.has_pass(); scan.next_pass()) { @@ -1103,7 +1103,7 @@ PFS_socket* create_socket(PFS_socket_cla } } - socket_instances_lost++; + socket_lost++; return NULL; } @@ -1114,7 +1114,7 @@ PFS_socket* create_socket(PFS_socket_cla void release_socket(PFS_socket *pfs) { DBUG_ASSERT(pfs != NULL); - pfs->m_socket_stat.m_open_count--; + //pfs->m_socket_stat.m_open_count--; } /** @@ -1167,7 +1167,7 @@ static void reset_file_waits_by_instance static void reset_socket_waits_by_instance(void) { PFS_socket *pfs= socket_array; - PFS_socket *pfs_last= socket_array + sockets_max; + PFS_socket *pfs_last= socket_array + socket_max; for ( ; pfs < pfs_last; pfs++) pfs->m_wait_stat.reset(); === modified file 'storage/perfschema/pfs_instr.h' --- a/storage/perfschema/pfs_instr.h 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/pfs_instr.h 2010-12-08 03:24:30 +0000 @@ -348,8 +348,8 @@ extern long file_handle_max; extern ulong file_handle_lost; extern ulong table_max; extern ulong table_lost; -extern ulong socket_instances_max; -extern ulong socket_instances_lost; +extern ulong socket_max; +extern ulong socket_lost; extern ulong events_waits_history_per_thread; extern ulong locker_lost; === modified file 'storage/perfschema/pfs_instr_class.cc' --- a/storage/perfschema/pfs_instr_class.cc 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/pfs_instr_class.cc 2010-12-08 03:24:30 +0000 @@ -155,9 +155,9 @@ void init_event_name_sizing(const PFS_gl rwlock_class_start= mutex_class_start + param->m_mutex_class_sizing; cond_class_start= rwlock_class_start + param->m_rwlock_class_sizing; file_class_start= cond_class_start + param->m_cond_class_sizing; - table_class_start= file_class_start + param->m_file_class_sizing; - socket_class_start= table_class_start + param->m_table_class_sizing; - max_instrument_class= socket_class_start + 1; /* global table io */ + socket_class_start= file_class_start + param->m_file_class_sizing; + table_class_start= socket_class_start + param->m_socket_class_sizing; + max_instrument_class= table_class_start + 1; /* global table io */ memcpy(global_table_io_class.m_name, "wait/io/table/sql/handler", 25); global_table_io_class.m_name_length= 25; @@ -796,6 +796,7 @@ PFS_file_class *find_file_class(PFS_file PFS_file_class *sanitize_file_class(PFS_file_class *unsafe) { SANITIZE_ARRAY_BODY(PFS_file_class, file_class_array, file_class_max, unsafe); +} /** Register a socket instrumentation metadata. @@ -832,7 +833,7 @@ PFS_socket_key register_socket_class(con init_instr_class(entry, name, name_length, flags); entry->m_index= index; entry->m_event_name_index= file_class_start + index; - entry->m_singleton- NULL; + entry->m_singleton= NULL; PFS_atomic::add_u32(&socket_class_allocated_count, 1); return (index + 1); } @@ -856,7 +857,7 @@ PFS_socket_class *find_socket_class(PFS_ PFS_socket_class *sanitize_socket_class(PFS_socket_class *unsafe) { - SANITIZE_ARRAY_BODY(socket_class_array, socket_class_max, unsafe); + SANITIZE_ARRAY_BODY(PFS_socket_class, socket_class_array, socket_class_max, unsafe); } PFS_instr_class *find_table_class(uint index) === modified file 'storage/perfschema/pfs_instr_class.h' --- a/storage/perfschema/pfs_instr_class.h 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/pfs_instr_class.h 2010-12-08 03:24:30 +0000 @@ -266,6 +266,17 @@ struct PFS_file_class : public PFS_instr PFS_file *m_singleton; }; +/** Instrumentation metadata for a socket. */ +struct PFS_socket_class : public PFS_instr_class +{ + /** Socket usage statistics. */ + PFS_socket_stat m_socket_stat; + /** Self index in @c socket_class_array. */ + uint m_index; + /** Singleton instance. */ + PFS_file *m_singleton; +}; + void init_event_name_sizing(const PFS_global_param *param); int init_sync_class(uint mutex_class_sizing, === modified file 'storage/perfschema/pfs_stat.h' --- a/storage/perfschema/pfs_stat.h 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/pfs_stat.h 2010-12-08 03:24:30 +0000 @@ -222,31 +222,28 @@ struct PFS_table_stat } }; -/** Statistics for SOCKET usage. */ -struct PFS_socket_stat +/** Statistics for SOCKET IO usage. */ +struct PFS_socket_io_stat { - /** Number of current open sockets. */ - ulong m_open_count; - /** Count of RECV operations. */ - ulonglong m_count_recv; - /** Count of SEND operations. */ - ulonglong m_count_send; - /** Number of bytes received. */ - ulonglong m_recv_bytes; - /** Number of bytes sent. */ - ulonglong m_send_bytes; + /** Count of READ operations. */ + ulonglong m_count_read; + /** Count of WRITE operations. */ + ulonglong m_count_write; + /** Number of bytes read. */ + ulonglong m_read_bytes; + /** Number of bytes written. */ + ulonglong m_write_bytes; /** Reset socket statistics. */ inline void reset(void) { - m_open_count= 0; - m_count_recv= 0; - m_count_send= 0; - m_count_recv_bytes= 0; - m_count_send_bytes= 0; + m_count_read= 0; + m_count_write= 0; + m_read_bytes= 0; + m_write_bytes= 0; } - inline void aggregate(const PFS_file_io_stat *stat) + inline void aggregate(const PFS_socket_io_stat *stat) { m_count_read+= stat->m_count_read; m_count_write+= stat->m_count_write; @@ -254,32 +251,27 @@ struct PFS_socket_stat m_write_bytes+= stat->m_write_bytes; } - inline void aggregate_recv(ulonglong bytes) + inline void aggregate_read(ulonglong bytes) { - m_count_recv++; - m_recv_bytes+= bytes; + m_count_read++; + m_read_bytes+= bytes; } - inline void aggregate_send(ulonglong bytes) + inline void aggregate_write(ulonglong bytes) { - m_count_send++; - m_send_bytes+= bytes; + m_count_write++; + m_write_bytes+= bytes; } - }; -/** - Reset socket statistic. - @param stat the statistics to reset -*/ -inline void reset_socket_stat(PFS_socket_stat *stat) +/** Statistics for SOCKET usage. */ +struct PFS_socket_stat { - stat->m_open_count= 0; - stat->m_count_recv= 0; - stat->m_count_send= 0; - stat->m_recv_bytes= 0; - stat->m_send_bytes= 0; -} + /** Number of current open sockets. //TBD Not relevant */ + ulong m_open_count; + /** Socket IO statistics. */ + PFS_socket_io_stat m_io_stat; +}; /** @} */ === modified file 'storage/perfschema/table_all_instr.cc' --- a/storage/perfschema/table_all_instr.cc 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/table_all_instr.cc 2010-12-08 03:24:30 +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_instances_max; m_pos.m_index_2++) + for ( ; m_pos.m_index_2 < socket_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_instances_max); + DBUG_ASSERT(m_pos.m_index_2 < socket_max); socket= &socket_array[m_pos.m_index_2]; if (socket->m_lock.is_populated()) { === modified file 'storage/perfschema/table_events_waits.cc' --- a/storage/perfschema/table_events_waits.cc 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/table_events_waits.cc 2010-12-08 03:24:30 +0000 @@ -395,7 +395,7 @@ static const LEX_STRING operation_names_ { C_STRING_WITH_LEN("fetch") }, { C_STRING_WITH_LEN("insert") }, /* write row */ { C_STRING_WITH_LEN("update") }, /* update row */ - { C_STRING_WITH_LEN("delete") }, /* delete row */ + { C_STRING_WITH_LEN("delete") }, /* delete row */ /* Socket operations */ { C_STRING_WITH_LEN("create") }, @@ -410,7 +410,6 @@ static const LEX_STRING operation_names_ { C_STRING_WITH_LEN("shutdown") } }; - int table_events_waits_common::read_row_values(TABLE *table, unsigned char *buf, Field **fields, @@ -419,8 +418,8 @@ int table_events_waits_common::read_row_ Field *f; const LEX_STRING *operation; - compile_time_assert(COUNT_OPERATION_TYPE == - array_elements(operation_names_map)); +// compile_time_assert(COUNT_OPERATION_TYPE == +// array_elements(operation_names_map)); if (unlikely(! m_row_exists)) return HA_ERR_RECORD_DELETED; === modified file 'storage/perfschema/table_setup_instruments.cc' --- a/storage/perfschema/table_setup_instruments.cc 2010-12-07 18:55:54 +0000 +++ b/storage/perfschema/table_setup_instruments.cc 2010-12-08 03:24:30 +0000 @@ -89,6 +89,7 @@ int table_setup_instruments::rnd_next(vo PFS_rwlock_class *rwlock_class; PFS_cond_class *cond_class; PFS_file_class *file_class; + PFS_instr_class *table_class; PFS_socket_class *socket_class; for (m_pos.set_at(&m_next_pos); === modified file 'storage/perfschema/table_setup_instruments.h' --- a/storage/perfschema/table_setup_instruments.h 2010-07-23 17:08:41 +0000 +++ b/storage/perfschema/table_setup_instruments.h 2010-12-08 03:24:30 +0000 @@ -53,7 +53,8 @@ struct pos_setup_instruments : public PF static const uint VIEW_THREAD= 4; static const uint VIEW_FILE= 5; static const uint VIEW_TABLE= 6; - static const uint LAST_VIEW= 6; + static const uint VIEW_SOCKET= 7; + static const uint LAST_VIEW= 7; pos_setup_instruments() : PFS_double_index(FIRST_VIEW, 1) === modified file 'storage/perfschema/table_socket_instances.cc' --- a/storage/perfschema/table_socket_instances.cc 2010-12-07 19:50:08 +0000 +++ b/storage/perfschema/table_socket_instances.cc 2010-12-08 03:24:30 +0000 @@ -80,6 +80,7 @@ table_socket_instances::m_share= &table_socket_instances::create, NULL, /* write_row */ NULL, /* delete_all_rows */ + NULL, /* get_row_count */ 1000, /* records */ sizeof(PFS_simple_index), &m_table_lock, @@ -108,7 +109,7 @@ int table_socket_instances::rnd_next(voi PFS_socket *pfs; for (m_pos.set_at(&m_next_pos); - m_pos.m_index < socket_instances_max; + m_pos.m_index < socket_max; m_pos.next()) { pfs= &socket_array[m_pos.m_index]; @@ -128,7 +129,7 @@ int table_socket_instances::rnd_pos(cons PFS_socket *pfs; set_position(pos); - DBUG_ASSERT(m_pos.m_index < socket_instances_max); + DBUG_ASSERT(m_pos.m_index < socket_max); pfs= &socket_array[m_pos.m_index]; if (! pfs->m_lock.is_populated()) @@ -159,8 +160,8 @@ void table_socket_instances::make_row(PF m_row.m_ip= pfs->m_ip; m_row.m_ip_length= pfs->m_ip_length; m_row.m_port= pfs->m_port; - m_row.m_bytes_read= pfs->m_socket_stat.m_recv_bytes; - m_row.m_bytes_write= pfs->m_socket_stat.m_send_bytes; + m_row.m_bytes_read= pfs->m_socket_stat.m_io_stat.m_read_bytes; //TBD + m_row.m_bytes_write= pfs->m_socket_stat.m_io_stat.m_write_bytes; if (pfs->m_lock.end_optimistic_lock(&lock)) m_row_exists= true; --===============0752656218988977951== 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/base_mysql-trunk-\ # wl4896/ # testament_sha1: 0e50d08b229f2c444da9771f239b2d043929a7b4 # timestamp: 2010-12-07 21:25:16 -0600 # source_branch: bzr+ssh://cpowers@stripped/bzrroot\ # /server/mysql-trunk/ # base_revision_id: chris.powers@stripped\ # tsk6161qu1ndwldv # # Begin bundle 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 KKKZKpaX9jZ/8XckU4UJDAClRfA= --===============0752656218988977951==--