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 <my_sys.h>
/* For socket api */
-#include <sys/socket.h>
-
+//#include <sys/socket.h>
+#include <netinet/in.h>
/**
@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 <arpa/inet.h>
#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<int>(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<PFS_socket*>(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<PFS_socket*>(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<PFS_socket*>(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 <netinet/in.h>
#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. */
Attachment: [text/bzr-bundle] bzr/chris.powers@oracle.com-20100729195617-043jpyctutwrrss6.bundle
| Thread |
|---|
| • bzr push into mysql-next-mr-wl4896 branch (chris.powers:3154 to 3155) WL#4896 | Christopher Powers | 29 Jul |