From: Christopher Powers Date: August 11 2010 7:49pm Subject: bzr push into mysql-next-mr-wl4896 branch (chris.powers:3160 to 3161) WL#4896 List-Archive: http://lists.mysql.com/commits/115532 Message-Id: <20100811194909.D38101DB030E@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2704585564170674570==" --===============2704585564170674570== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3161 Christopher Powers 2010-08-11 WL#4896 PERFORMANCE_SCHEMA Instrumenting Net IO Updated socket instrumentation: - Bytes read/written - Test for return codes modified: include/mysql/psi/mysql_socket.h include/mysql/psi/psi.h include/mysql/psi/psi_abi_v1.h.pp storage/perfschema/pfs.cc storage/perfschema/pfs_instr.cc 3160 Christopher Powers 2010-08-04 Merged with next-mr Integrated WL 4895 "Performance Schema Table IO" Integrated bug 55087, "Performance schema: optimization of the instrumentation interface" removed: include/mysql/psi/mysql_network.h added: storage/perfschema/table_helper.h.moved modified: include/mysql/psi/mysql_socket.h include/mysql/psi/psi_abi_v1.h.pp include/mysql/psi/psi_abi_v2.h.pp sql/mysqld.cc storage/perfschema/pfs.cc storage/perfschema/table_events_waits.cc storage/perfschema/table_helper.h === modified file 'include/mysql/psi/mysql_socket.h' --- a/include/mysql/psi/mysql_socket.h 2010-08-04 15:47:50 +0000 +++ b/include/mysql/psi/mysql_socket.h 2010-08-11 19:48:41 +0000 @@ -71,9 +71,9 @@ Foundation, Inc., 51 Franklin St, Fifth */ #ifdef HAVE_PSI_INTERFACE #define MYSQL_START_SOCKET_WAIT(PSI, OP, INDEX, FLAGS) \ - inline_mysql_start_socket_wait(PSI, OP, INDEX, FLAGS, __FILE__, __LINE__) + inline_mysql_start_socket_wait(PSI, OP, INDEX, FLAGS, COUNT, __FILE__, __LINE__) #else - #define MYSQL_START_SOCKET_WAIT(PSI, OP, INDEX, FLAGS) \ + #define MYSQL_START_SOCKET_WAIT(PSI, OP, INDEX, FLAGS, COUNT) \ do {} while (0) #endif @@ -84,10 +84,10 @@ Foundation, Inc., 51 Franklin St, Fifth @sa MYSQL_START_SOCKET_WAIT. */ #ifdef HAVE_PSI_INTERFACE - #define MYSQL_END_SOCKET_WAIT(L) \ - inline_mysql_end_socket_wait(L) + #define MYSQL_END_SOCKET_WAIT(L, C) \ + inline_mysql_end_socket_wait(L, C) #else - #define MYSQL_END_SOCKET_WAIT(L) \ + #define MYSQL_END_SOCKET_WAIT(L, C) \ do {} while (0) #endif @@ -101,7 +101,7 @@ Foundation, Inc., 51 Franklin St, Fifth static inline PSI_socket_locker * inline_mysql_start_socket_wait(PSI_socket_locker_state *state, PSI_socket *psi, enum PSI_socket_operation op, - uint index, ulong flags, + uint index, ulong flags, size_t count, const char *src_file, int src_line) { PSI_socket_locker *locker= NULL; @@ -110,7 +110,7 @@ inline_mysql_start_socket_wait(PSI_socke { locker= PSI_server->get_thread_socket_locker(state, psi, op); if (likely(locker != NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, count, src_file, src_line); } return locker; } @@ -120,10 +120,10 @@ inline_mysql_start_socket_wait(PSI_socke @sa MYSQL_END_SOCKET_WAIT. */ static inline void -inline_mysql_end_socket_wait(PSI_socket_locker *locker) +inline_mysql_end_socket_wait(PSI_socket_locker *locker, size_t count) { if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, count); } #endif @@ -368,13 +368,13 @@ inline_mysql_socket_socketpair { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_CREATE); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= socketpair(int domain, int type, int protocol, int fds[2]); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif #endif return result; @@ -399,16 +399,17 @@ inline_mysql_socket_bind { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_BIND); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= bind(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE - if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL + && result == 0)) PSI_server->set_socket_address(mysql_socket.m_psi, addr); if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -432,13 +433,13 @@ inline_mysql_socket_getsockname { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_BIND); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= getsockname(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -462,13 +463,13 @@ inline_mysql_socket_connect { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= connect(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -492,13 +493,13 @@ inline_mysql_socket_getpeername { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_BIND); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= getpeername(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -522,13 +523,16 @@ inline_mysql_socket_send { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_SEND); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= send(mysql_socket.fd, buf, n, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + { + size_t bytes_written = (result > -1) ? result : 0; + PSI_server->end_socket_wait(locker, bytes_written); + } #endif return result; } @@ -552,13 +556,16 @@ inline_mysql_socket_recv { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_RECV); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= recv(mysql_socket.fd, buf, n, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + { + size_t bytes_read = (result > -1) ? result : 0; + PSI_server->end_socket_wait(locker, bytes_read); + } #endif return result; } @@ -582,13 +589,16 @@ inline_mysql_socket_sendto { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_SEND); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= sendto(mysql_socket.fd, buf, n, flags, addr, addr_len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + { + size_t bytes_written = (result > -1) ? result : 0; + PSI_server->end_socket_wait(locker, bytes_written); + } #endif return result; } @@ -612,13 +622,16 @@ inline_mysql_socket_recvfrom { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_RECV); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= recvfrom(mysql_socket.fd, buf, n, flags, addr, addr_len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + { + size_t bytes_read = (result > -1) ? result : 0; + PSI_server->end_socket_wait(locker, bytes_read); + } #endif return result; } @@ -642,13 +655,16 @@ inline_mysql_socket_sendmsg { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_SEND); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= sendmsg(mysql_socket.fd, message, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + { + size_t bytes_written = (result > -1) ? result : 0; + PSI_server->end_socket_wait(locker, bytes_written); + } #endif return result; } @@ -672,13 +688,16 @@ inline_mysql_socket_recvmsg { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_RECV); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= recvmsg(mysql_socket.fd, message, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + { + size_t bytes_written = (result > -1) ? result : 0; + PSI_server->end_socket_wait(locker, bytes_written); + } #endif return result; } @@ -702,13 +721,13 @@ inline_mysql_socket_getsockopt { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_OPT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= getsockopt(mysql_socket.fd, level, optname, optval, optlen); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -732,13 +751,13 @@ inline_mysql_socket_setsockopt { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_OPT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= setsockopt(mysql_socket.fd, level, optname, optval, optlen); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -762,13 +781,13 @@ inline_mysql_socket_listen { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_CONNECT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= listen(mysql_socket.fd, n); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -794,18 +813,19 @@ inline_mysql_socket_accept { locker= PSI_server->get_thread_socket_locker(&state, socket_accept.m_psi, PSI_SOCKET_CONNECT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #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)) + 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); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return socket_accept; } @@ -832,13 +852,18 @@ inline_mysql_socket_accept4 { locker= PSI_server->get_thread_socket_locker(socket_accept.m_psi, PSI_SOCKET_CONNECT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + 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); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return socket_accept; } @@ -846,7 +871,6 @@ inline_mysql_socket_accept4 #endif - /** mysql_socket_close */ static inline int @@ -866,13 +890,13 @@ inline_mysql_socket_close { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_CLOSE); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= closesocket(mysql_socket.fd); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -896,13 +920,13 @@ inline_mysql_socket_shutdown { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_SHUTDOWN); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= shutdown(mysql_socket.fd, how); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -926,13 +950,13 @@ inline_mysql_socket_sockatmark { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_STAT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= sockatmark(mysql_socket.fd); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } @@ -956,13 +980,13 @@ inline_mysql_socket_isfdtype { locker= PSI_server->get_thread_socket_locker(&state, mysql_socket.m_psi, PSI_SOCKET_STAT); if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + PSI_server->start_socket_wait(locker, (size_t)0, src_file, src_line); } #endif result= isfdtype(mysql_socket.fd, fdtype); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) - PSI_server->end_socket_wait(locker); + PSI_server->end_socket_wait(locker, (size_t)0); #endif return result; } === modified file 'include/mysql/psi/psi.h' --- a/include/mysql/psi/psi.h 2010-08-04 03:19:48 +0000 +++ b/include/mysql/psi/psi.h 2010-08-11 19:48:41 +0000 @@ -1193,11 +1193,12 @@ typedef void (*end_file_wait_v1_t) Record a socket instrumentation start event. @param locker a socket locker for the running thread @param op socket operation to be performed + @param count the number of bytes requested, or 0 if not applicable @param src_file the source file name @param src_line the source line number */ typedef void (*start_socket_wait_v1_t) - (struct PSI_socket_locker *locker, + (struct PSI_socket_locker *locker, size_t count, const char *src_file, uint src_line); /** @@ -1206,10 +1207,12 @@ typedef void (*start_socket_wait_v1_t) associated with the socket (which was provided to obtain a locker) is invalid after this call. @param locker a socket locker for the running thread + @param count the number of bytes actually used in the operation, + or 0 if not applicable, or -1 if the operation failed @sa get_thread_socket_locker */ typedef void (*end_socket_wait_v1_t) - (struct PSI_socket_locker *locker); + (struct PSI_socket_locker *locker, size_t count); /** Set the socket descriptor for an instrumented socket. === modified file 'include/mysql/psi/psi_abi_v1.h.pp' --- a/include/mysql/psi/psi_abi_v1.h.pp 2010-08-04 15:47:50 +0000 +++ b/include/mysql/psi/psi_abi_v1.h.pp 2010-08-11 19:48:41 +0000 @@ -311,10 +311,10 @@ typedef void (*start_file_wait_v1_t) typedef void (*end_file_wait_v1_t) (struct PSI_file_locker *locker, size_t count); typedef void (*start_socket_wait_v1_t) - (struct PSI_socket_locker *locker, + (struct PSI_socket_locker *locker, size_t count, const char *src_file, uint src_line); typedef void (*end_socket_wait_v1_t) - (struct PSI_socket_locker *locker); + (struct PSI_socket_locker *locker, size_t count); typedef void (*set_socket_descriptor_v1_t)(struct PSI_socket *socket, uint fd); typedef void (*set_socket_address_v1_t)(struct PSI_socket *socket, === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2010-08-04 15:47:50 +0000 +++ b/storage/perfschema/pfs.cc 2010-08-11 19:48:41 +0000 @@ -2240,12 +2240,14 @@ static void end_file_wait_v1(PSI_file_lo /** Socket operations */ static void start_socket_wait_v1(PSI_socket_locker *locker, + size_t count, const char *src_file, uint src_line); -static void end_socket_wait_v1(PSI_socket_locker *locker); +static void end_socket_wait_v1(PSI_socket_locker *locker, size_t count); static void start_socket_wait_v1(PSI_socket_locker *locker, + size_t count, const char *src_file, uint src_line) { @@ -2260,14 +2262,16 @@ static void start_socket_wait_v1(PSI_soc } wait->m_source_file= src_file; wait->m_source_line= src_line; + wait->m_number_of_bytes= count; } -static void end_socket_wait_v1(PSI_socket_locker *locker) +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; + wait->m_number_of_bytes= count; if (wait->m_timer_state == TIMER_STATE_STARTED) { wait->m_timer_end= get_timer_value(pfs_locker->m_timer_name); @@ -2297,17 +2301,18 @@ static void end_socket_wait_v1(PSI_socke break; case OPERATION_TYPE_SOCKETSEND: socket->m_socket_stat.m_count_send++; - //socket->m_socket_stat.m_send_bytes+= count; //TBD - //klass->m_socket_stat.m_send_bytes+= count; //TBD + socket->m_socket_stat.m_send_bytes+= count; + klass->m_socket_stat.m_send_bytes+= count; break; case OPERATION_TYPE_SOCKETRECV: socket->m_socket_stat.m_count_recv++; - //socket->m_socket_stat.m_recv_bytes+= count; //TBD - //klass->m_socket_stat.m_recv_bytes+= count; //TBD + socket->m_socket_stat.m_recv_bytes+= count; + klass->m_socket_stat.m_recv_bytes+= count; break; case OPERATION_TYPE_SOCKETCLOSE: + /** close() frees the file descriptor, shutdown() does not */ release_socket(pfs_locker->m_target.m_socket); - destroy_socket(pfs_locker->m_target.m_socket); // TBD thread? + destroy_socket(pfs_locker->m_target.m_socket); break; case OPERATION_TYPE_SOCKETCONNECT: case OPERATION_TYPE_SOCKETBIND: === modified file 'storage/perfschema/pfs_instr.cc' --- a/storage/perfschema/pfs_instr.cc 2010-08-04 03:19:48 +0000 +++ b/storage/perfschema/pfs_instr.cc 2010-08-11 19:48:41 +0000 @@ -1143,7 +1143,7 @@ PFS_socket* create_socket(PFS_socket_cla Release instrumentation for a socket instance. @param pfs the socket to release */ -void release_socket(PFS_socket *pfs) // TBD +void release_socket(PFS_socket *pfs) { DBUG_ASSERT(pfs != NULL); pfs->m_socket_stat.m_open_count--; --===============2704585564170674570== 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-wl4896/mysql/ # testament_sha1: f9b34ccbd673cdc8728b27d44023bea8344fde01 # timestamp: 2010-08-11 14:49:09 -0500 # source_branch: bzr+ssh://cpowers@stripped/bzrroot\ # /server/mysql-next-mr/ # base_revision_id: chris.powers@stripped\ # qx0wf5c5shvyowdc # # Begin bundle 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 --===============2704585564170674570==--