From: Christopher Powers Date: July 29 2010 7:57pm Subject: bzr push into mysql-next-mr-wl4896 branch (chris.powers:3154 to 3155) WL#4896 List-Archive: http://lists.mysql.com/commits/114684 Message-Id: <20100729195704.3470B1DB030E@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============9198583617044399153==" --===============9198583617044399153== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3155 Christopher Powers 2010-07-29 WL#4896 PERFORMANCE_SCHEMA Instrumenting Net IO Track IP and port for each socket. Added columns SOCKET_ID, IP, PORT, BYTES_READ, BYTES_WRITE to SOCKET_INSTANCES. Added interface methods set_socket_descriptor(), set_socket_address() and set_socket_info(). modified: include/mysql/psi/mysql_socket.h include/mysql/psi/psi.h include/mysql/psi/psi_abi_v1.h.pp scripts/mysql_system_tables.sql storage/perfschema/pfs.cc storage/perfschema/pfs_instr.h storage/perfschema/table_socket_instances.cc storage/perfschema/table_socket_instances.h 3154 Christopher Powers 2010-07-16 [merge] merge removed: mysql-test/suite/manual/ mysql-test/suite/manual/r/ mysql-test/suite/manual/r/rpl_replication_delay.result mysql-test/suite/manual/t/ mysql-test/suite/manual/t/rpl_replication_delay-slave.opt mysql-test/suite/manual/t/rpl_replication_delay.test sql/sql_repl.cc sql/sql_repl.h added: config/ac-macros/gtest.m4 mysql-test/collections/mysql-next-mr-rpl-merge.push mysql-test/extra/rpl_tests/delayed_slave_wait_on_query.inc mysql-test/include/save_master_pos.inc mysql-test/include/show_delayed_slave_state.inc mysql-test/include/show_slave_hosts.inc mysql-test/include/sync_with_master.inc mysql-test/r/server_uuid.result mysql-test/std_data/old-format-relay-log-win.info mysql-test/std_data/old-format-relay-log.info mysql-test/suite/rpl/extension/ mysql-test/suite/rpl/extension/README mysql-test/suite/rpl/extension/README.bhs mysql-test/suite/rpl/extension/bhs/ mysql-test/suite/rpl/extension/bhs.pl mysql-test/suite/rpl/extension/bhs/default.rules mysql-test/suite/rpl/extension/bhs/disabled.def mysql-test/suite/rpl/extension/bhs/master-slave-bhs.inc mysql-test/suite/rpl/extension/bhs/master-slave.inc mysql-test/suite/rpl/extension/bhs/my.cnf mysql-test/suite/rpl/extension/bhs/rpl_1slave_base.cnf mysql-test/suite/rpl/extension/bhs/update_test_cases mysql-test/suite/rpl/r/rpl_delayed_slave.result mysql-test/suite/rpl/r/rpl_read_old_relay_log_info.result mysql-test/suite/rpl/r/rpl_row_event_max_size.result mysql-test/suite/rpl/r/rpl_seconds_behind_master.result mysql-test/suite/rpl/r/rpl_server_uuid.result mysql-test/suite/rpl/t/rpl_delayed_slave.test mysql-test/suite/rpl/t/rpl_read_old_relay_log_info.test mysql-test/suite/rpl/t/rpl_row_event_max_size-master.opt mysql-test/suite/rpl/t/rpl_row_event_max_size-slave.opt mysql-test/suite/rpl/t/rpl_row_event_max_size.test mysql-test/suite/rpl/t/rpl_seconds_behind_master.test mysql-test/suite/rpl/t/rpl_server_uuid.cnf mysql-test/suite/rpl/t/rpl_server_uuid.test mysql-test/suite/sys_vars/r/server_uuid_basic.result mysql-test/suite/sys_vars/t/server_uuid_basic.test mysql-test/t/server_uuid.test sql/binlog.cc sql/binlog.h sql/rpl_master.cc sql/rpl_master.h sql/sql_alloc_error_handler.cc sql/thr_malloc.h.moved unittest/CMakeLists.txt unittest/gunit/ unittest/gunit/CMakeLists.txt unittest/gunit/FindGTest.cmake unittest/gunit/Makefile.am unittest/gunit/gunit_test_main.cc unittest/gunit/mdl-t.cc unittest/gunit/mdl_mytap-t.cc unittest/gunit/sql_list-t.cc unittest/gunit/tap_event_listener.cc unittest/gunit/thread_utils-t.cc unittest/gunit/thread_utils.cc unittest/gunit/thread_utils.h unittest/mytap/t/CMakeLists.txt renamed: sql/slave.cc => sql/rpl_slave.cc sql/slave.h => sql/rpl_slave.h modified: .bzrignore CMakeLists.txt Makefile.am client/client_priv.h client/mysqlbinlog.cc client/mysqltest.cc cmake/ssl.cmake configure.in libmysqld/CMakeLists.txt libmysqld/Makefile.am mysql-test/collections/default.experimental mysql-test/include/mtr_warnings.sql mysql-test/include/sync_slave_io_with_master.inc mysql-test/include/wait_for_slave_sql_error.inc mysql-test/mysql-test-run.pl mysql-test/suite/binlog/r/binlog_unsafe.result mysql-test/suite/engines/funcs/r/rpl_000015.result mysql-test/suite/engines/funcs/t/rpl_000015.test mysql-test/suite/rpl/r/rpl_get_master_version_and_clock.result mysql-test/suite/rpl/r/rpl_mixed_ddl_dml.result mysql-test/suite/rpl/r/rpl_show_slave_hosts.result mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test mysql-test/suite/rpl/t/rpl_mixed_ddl_dml.test mysql-test/suite/rpl/t/rpl_show_slave_hosts.test mysql-test/suite/rpl/t/rpl_show_slave_running.test mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test mysql-test/t/sp_trans_log.test mysys/default.c sql/CMakeLists.txt sql/Makefile.am sql/field.cc sql/ha_ndbcluster_binlog.cc sql/ha_partition.cc sql/item_func.cc sql/item_strfunc.h sql/lex.h sql/log.cc sql/log.h sql/log_event.cc sql/log_event.h sql/log_event_old.cc sql/mysqld.cc sql/mysqld.h sql/repl_failsafe.cc sql/repl_failsafe.h sql/rpl_handler.cc sql/rpl_injector.cc sql/rpl_mi.cc sql/rpl_mi.h sql/rpl_record.cc sql/rpl_rli.cc sql/rpl_rli.h sql/set_var.h sql/share/errmsg-utf8.txt sql/sql_binlog.cc sql/sql_class.cc sql/sql_class.h sql/sql_db.cc sql/sql_insert.cc sql/sql_lex.cc sql/sql_lex.h sql/sql_load.cc sql/sql_parse.cc sql/sql_parse.h sql/sql_servers.h sql/sql_yacc.yy sql/structs.h sql/sys_vars.cc sql/thr_malloc.cc unittest/Makefile.am unittest/unit.pl sql/rpl_slave.cc sql/rpl_slave.h === modified file 'include/mysql/psi/mysql_socket.h' --- a/include/mysql/psi/mysql_socket.h 2010-07-07 19:49:15 +0000 +++ b/include/mysql/psi/mysql_socket.h 2010-07-29 19:56:17 +0000 @@ -26,8 +26,8 @@ Foundation, Inc., 51 Franklin St, Fifth /* For my_chsize */ #include /* For socket api */ -#include - +//#include +#include /** @file mysql/psi/mysql_socket.h [...] @@ -320,6 +320,10 @@ inline_mysql_socket_socket #endif mysql_socket.fd= socket(domain, type, protocol); +#ifdef HAVE_PSI_INTERFACE + if (likely(mysql_socket.m_psi != NULL)) + PSI_server->set_socket_descriptor(mysql_socket.m_psi, mysql_socket.fd); +#endif return mysql_socket; } @@ -375,6 +379,9 @@ inline_mysql_socket_bind #endif result= bind(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) + PSI_server->set_socket_address(mysql_socket.m_psi, addr); + if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); #endif @@ -740,7 +747,12 @@ inline_mysql_socket_accept } #endif socket_accept.fd= accept(socket_listen.fd, addr, addr_len); + #ifdef HAVE_PSI_INTERFACE + /** Set socket address info */ + if (likely(PSI_server != NULL && socket_accept.m_psi != NULL)) + PSI_server->set_socket_info(socket_accept.m_psi, socket_accept.fd, addr); + if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); #endif === modified file 'include/mysql/psi/psi.h' --- a/include/mysql/psi/psi.h 2010-06-22 23:02:37 +0000 +++ b/include/mysql/psi/psi.h 2010-07-29 19:56:17 +0000 @@ -967,6 +967,33 @@ typedef void (*start_socket_wait_v1_t) */ typedef void (*end_socket_wait_v1_t) (struct PSI_socket_locker *locker); + +/** + Set the socket descriptor for an instrumented socket. + @param socket the instrumented socket + @param fd socket descriptor + */ +typedef void (*set_socket_descriptor_v1_t)(struct PSI_socket *socket, + uint fd); + +/** + Set the socket address for an instrumented socket. + @param socket the instrumented socket + @param addr socket address information + */ +typedef void (*set_socket_address_v1_t)(struct PSI_socket *socket, + const struct sockaddr * addr); + +/** + Set the socket info for an instrumented socket. + @param socket the instrumented socket + @param fd the socket descriptor + @param addr the socket ip address +*/ +typedef void (*set_socket_info_v1_t)(struct PSI_socket *socket, + uint fd, + const struct sockaddr * addr); + /** Performance Schema Interface, version 1. @since PSI_VERSION_1 @@ -1084,6 +1111,12 @@ struct PSI_v1 start_socket_wait_v1_t start_socket_wait; /** @sa end_file_wait_v1_t. */ end_socket_wait_v1_t end_socket_wait; + /** @sa set_socket_descriptor_v1_t. */ + set_socket_descriptor_v1_t set_socket_descriptor; + /** @sa set_socket_address_v1_t. */ + set_socket_address_v1_t set_socket_address; + /** @sa set_socket_info_v1_t. */ + set_socket_info_v1_t set_socket_info; }; /** @} (end of group Group_PSI_v1) */ === modified file 'include/mysql/psi/psi_abi_v1.h.pp' --- a/include/mysql/psi/psi_abi_v1.h.pp 2010-06-22 23:02:37 +0000 +++ b/include/mysql/psi/psi_abi_v1.h.pp 2010-07-29 19:56:17 +0000 @@ -214,6 +214,13 @@ typedef void (*start_socket_wait_v1_t) const char *src_file, uint src_line); typedef void (*end_socket_wait_v1_t) (struct PSI_socket_locker *locker); +typedef void (*set_socket_descriptor_v1_t)(struct PSI_socket *socket, + uint fd); +typedef void (*set_socket_address_v1_t)(struct PSI_socket *socket, + const struct sockaddr * addr); +typedef void (*set_socket_info_v1_t)(struct PSI_socket *socket, + uint fd, + const struct sockaddr * addr); struct PSI_v1 { register_mutex_v1_t register_mutex; @@ -272,6 +279,9 @@ struct PSI_v1 end_file_wait_v1_t end_file_wait; start_socket_wait_v1_t start_socket_wait; end_socket_wait_v1_t end_socket_wait; + set_socket_descriptor_v1_t set_socket_descriptor; + set_socket_address_v1_t set_socket_address; + set_socket_info_v1_t set_socket_info; }; typedef struct PSI_v1 PSI; typedef struct PSI_mutex_info_v1 PSI_mutex_info; === modified file 'scripts/mysql_system_tables.sql' --- a/scripts/mysql_system_tables.sql 2010-07-09 02:23:31 +0000 +++ b/scripts/mysql_system_tables.sql 2010-07-29 19:56:17 +0000 @@ -364,12 +364,15 @@ DROP PREPARE stmt; -- SET @l1="CREATE TABLE performance_schema.SOCKET_INSTANCES("; -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); +SET @l2="EVENT_NAME varchar(128) not null,"; +SET @l3="OBJECT_INSTANCE_BEGIN bigint(20) not null,"; +SET @l4="SOCKET_ID int(11) not null,"; +SET @l5="IP varchar(128) not null,"; +SET @l6="PORT int(11) not null,"; +SET @l7="BYTES_READ bigint(20) not null,"; +SET @l8="BYTES_WRITE bigint(20) not null"; +SET @l9=")ENGINE=PERFORMANCE_SCHEMA;"; +SET @cmd=concat(@l1,@l2,@l3,@l4,@l5,@l6,@l7,@l8,@l9); SET @str = IF(@have_pfs = 1, @cmd, 'SET @dummy = 0'); PREPARE stmt FROM @str; === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2010-07-09 02:23:31 +0000 +++ b/storage/perfschema/pfs.cc 2010-07-29 19:56:17 +0000 @@ -18,6 +18,7 @@ The performance schema implementation of all instruments. */ +#include #include "my_global.h" #include "pfs.h" #include "pfs_instr_class.h" @@ -1566,8 +1567,8 @@ get_thread_socket_locker_v1(PSI_socket * pfs_locker->m_waits_current.m_timer_state= TIMER_STATE_UNTIMED; 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_object_name= pfs_socket->m_ip; + pfs_locker->m_waits_current.m_object_name_length= pfs_socket->m_ip_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_SOCKET; @@ -2199,6 +2200,56 @@ static void end_socket_wait_v1(PSI_socke wait->m_thread->m_wait_locker_count--; } +static void set_socket_descriptor_v1(PSI_socket *socket, + uint fd) +{ + DBUG_ASSERT(socket); + PFS_socket *pfs= reinterpret_cast(socket); + pfs->m_fd= fd; +} + +static void set_socket_address_v1(PSI_socket *socket, + const struct sockaddr * socket_addr) +{ + DBUG_ASSERT(socket); + PFS_socket *pfs= reinterpret_cast(socket); + + switch (socket_addr->sa_family) + { + case AF_INET: + { + struct sockaddr_in * sa4= (struct sockaddr_in *)(socket_addr); + pfs->m_ip_length= INET_ADDRSTRLEN; + inet_ntop(AF_INET, &(sa4->sin_addr), pfs->m_ip, pfs->m_ip_length); + pfs->m_port= ntohs(sa4->sin_port); + } + break; + + case AF_INET6: + { + struct sockaddr_in6 * sa6= (struct sockaddr_in6 *)(socket_addr); + pfs->m_ip_length= INET6_ADDRSTRLEN; + inet_ntop(AF_INET6, &(sa6->sin6_addr), pfs->m_ip, pfs->m_ip_length); + pfs->m_port= ntohs(sa6->sin6_port); + } + break; + + default: + break; + } +} + +static void set_socket_info_v1(PSI_socket *socket, + uint fd, + const struct sockaddr * addr) +{ + DBUG_ASSERT(socket); + PFS_socket *pfs= reinterpret_cast(socket); + + pfs->m_fd= fd; + set_socket_address_v1(socket, addr); +} + PSI_v1 PFS_v1= { @@ -2256,7 +2307,10 @@ PSI_v1 PFS_v1= start_file_wait_v1, end_file_wait_v1, start_socket_wait_v1, - end_socket_wait_v1 + end_socket_wait_v1, + set_socket_descriptor_v1, + set_socket_address_v1, + set_socket_info_v1 }; static void* get_interface(int version) === modified file 'storage/perfschema/pfs_instr.h' --- a/storage/perfschema/pfs_instr.h 2010-07-09 02:23:31 +0000 +++ b/storage/perfschema/pfs_instr.h 2010-07-29 19:56:17 +0000 @@ -20,7 +20,7 @@ @file storage/perfschema/pfs_instr.h Performance schema instruments (declarations). */ - +#include #include "pfs_lock.h" #include "pfs_instr_class.h" #include "pfs_events_waits.h" @@ -129,15 +129,19 @@ struct PFS_table : public PFS_instr const void *m_identity; }; -/** Instrumented Socket and FILE implementation. @see PSI_socket. */ +/** Instrumented socket implementation. @see PSI_socket. */ struct PFS_socket : public PFS_instr { /** Socket identity, typically int */ const void *m_identity; - /** Socket description. */ - char m_socket_desc[14]; // TBD - /** Socket description length in bytes */ - uint m_socket_desc_length; + /** Socket file descriptor */ + uint m_fd; + /** Socket ip address, IPV4 or IPV6 */ + char m_ip[INET6_ADDRSTRLEN]; + /** Socket ip address length in bytes */ + uint m_ip_length; + /** Socket ip port */ + uint m_port; /** Socket class. */ PFS_socket_class *m_class; /** Socket usage statistics. */ === modified file 'storage/perfschema/table_socket_instances.cc' --- a/storage/perfschema/table_socket_instances.cc 2010-07-09 02:23:31 +0000 +++ b/storage/perfschema/table_socket_instances.cc 2010-07-29 19:56:17 +0000 @@ -41,15 +41,36 @@ static const TABLE_FIELD_TYPE field_type { NULL, 0} }, { - { C_STRING_WITH_LEN("SOCKET_DESC") }, - { C_STRING_WITH_LEN("varchar(512)") }, + { C_STRING_WITH_LEN("SOCKET_ID") }, + { C_STRING_WITH_LEN("int(11)") }, + { NULL, 0} + }, + { + { C_STRING_WITH_LEN("IP") }, + { C_STRING_WITH_LEN("varchar(128)") }, + { NULL, 0} + }, + { + { C_STRING_WITH_LEN("PORT") }, + { C_STRING_WITH_LEN("int(11)") }, + { NULL, 0} + }, + { + { C_STRING_WITH_LEN("BYTES_READ") }, + { C_STRING_WITH_LEN("bigint(20)") }, + { NULL, 0} + }, + { + { C_STRING_WITH_LEN("BYTES_WRITE") }, + { C_STRING_WITH_LEN("bigint(20)") }, { NULL, 0} } }; + TABLE_FIELD_DEF table_socket_instances::m_field_def= -{ 3, field_types }; +{ 7, field_types }; PFS_engine_table_share table_socket_instances::m_share= @@ -134,8 +155,12 @@ void table_socket_instances::make_row(PF 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_socket_desc= pfs->m_socket_desc; - m_row.m_socket_desc_length= pfs->m_socket_desc_length; + m_row.m_fd= pfs->m_fd; + 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; if (pfs->m_lock.end_optimistic_lock(&lock)) m_row_exists= true; @@ -166,8 +191,20 @@ int table_socket_instances::read_row_val case 1: /* OBJECT_INSTANCE_BEGIN */ set_field_ulonglong(f, (intptr)m_row.m_identity); break; - case 2: /* SOCKET_DESC */ - set_field_varchar_utf8(f, m_row.m_socket_desc, m_row.m_socket_desc_length); + case 2: /* SOCKET_ID */ + set_field_ulong(f, m_row.m_fd); + break; + case 3: /* IP */ + set_field_varchar_utf8(f, m_row.m_ip, m_row.m_ip_length); + break; + case 4: /* PORT */ + set_field_ulong(f, m_row.m_port); + break; + case 5: /* BYTES_READ */ + set_field_ulonglong(f, m_row.m_bytes_read); + break; + case 6: /* BYTES_WRITE */ + set_field_ulonglong(f, m_row.m_bytes_write); break; default: DBUG_ASSERT(false); === modified file 'storage/perfschema/table_socket_instances.h' --- a/storage/perfschema/table_socket_instances.h 2010-07-09 02:23:31 +0000 +++ b/storage/perfschema/table_socket_instances.h 2010-07-29 19:56:17 +0000 @@ -38,10 +38,18 @@ struct row_socket_instances uint m_event_name_length; /** Column OBJECT_INSTANCE_BEGIN */ const void *m_identity; - /** Column SOCKET_DESC. */ - const char *m_socket_desc; - /** Length in bytes of @c m_socket_desc. */ - uint m_socket_desc_length; + /** Column SOCKET_ID */ + uint m_fd; + /** Column IP. */ + const char *m_ip; + /** Length in bytes of @c m_ip. */ + uint m_ip_length; + /** Column PORT */ + uint m_port; + /** Column BYTES_READ */ + ulonglong m_bytes_read; // TBD + /** Column BYTES_WRITE */ + ulonglong m_bytes_write; }; /** Table PERFORMANCE_SCHEMA.SOCKET_INSTANCES. */ --===============9198583617044399153== 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: 615469ef2d47f3c0c68f080b1d95d297b145a3c8 # timestamp: 2010-07-29 14:57:03 -0500 # base_revision_id: chris.powers@stripped\ # lzjzucapej0vp90j # # Begin bundle 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 kinChIEfuc6o --===============9198583617044399153==--