From: Christopher Powers Date: July 7 2010 7:49pm Subject: bzr push into mysql-next-mr-wl4896 branch (chris.powers:3151 to 3152) WL#4896 List-Archive: http://lists.mysql.com/commits/113068 Message-Id: <20100707194952.B7FB21DB0305@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8879436788859966580==" --===============8879436788859966580== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3152 Christopher Powers 2010-07-07 WL#4896 PERFORMANCE_SCHEMA Instrumenting Net IO Added SOCKET_INSTANCES table, completed instrumentation of socket API added: storage/perfschema/table_socket_instances.cc storage/perfschema/table_socket_instances.h modified: include/mysql/psi/mysql_socket.h scripts/mysql_system_tables.sql sql/mysqld.cc sql/mysqld.h sql/sys_vars.cc storage/perfschema/CMakeLists.txt storage/perfschema/ha_perfschema.cc storage/perfschema/pfs.cc storage/perfschema/pfs_engine_table.cc storage/perfschema/pfs_engine_table.h storage/perfschema/pfs_instr.cc storage/perfschema/pfs_instr.h storage/perfschema/pfs_instr_class.cc storage/perfschema/pfs_server.cc storage/perfschema/pfs_server.h storage/perfschema/table_all_instr.cc storage/perfschema/table_all_instr.h storage/perfschema/table_events_waits_summary.cc storage/perfschema/table_events_waits_summary.h storage/perfschema/table_setup_instruments.cc storage/perfschema/table_setup_instruments.h 3151 Christopher Powers 2010-07-01 WL#4896 "PERFORMANCE_SCHEMA Instrumenting Net IO" Fix build break. @ include/mysql/psi/mysql_socket.h Disable 'accept4' instrumentation modified: include/mysql/psi/mysql_socket.h === modified file 'include/mysql/psi/mysql_socket.h' --- a/include/mysql/psi/mysql_socket.h 2010-07-01 21:25:57 +0000 +++ b/include/mysql/psi/mysql_socket.h 2010-07-07 19:49:15 +0000 @@ -116,173 +116,173 @@ inline_mysql_end_socket_wait(struct PSI_ #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_socketpair(D, T, P, SDS) \ - inline_mysql_socket_socketpair(__FILE__, __LINE__, D, T, P, SDS) + #define mysql_socket_socketpair(D, T, P, FDS) \ + inline_mysql_socket_socketpair(__FILE__, __LINE__, D, T, P, FDS) #else - #define mysql_socket_socketpair(D, T, P, SDS) \ - inline_mysql_socket_socketpair(D, T, P, SDS) + #define mysql_socket_socketpair(D, T, P, FDS) \ + inline_mysql_socket_socketpair(D, T, P, FDS) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_bind(SD, A, L) \ - inline_mysql_socket_bind(__FILE__, __LINE__, SD, A, L) + #define mysql_socket_bind(FD, A, L) \ + inline_mysql_socket_bind(__FILE__, __LINE__, FD, A, L) #else - #define mysql_socket_bind(SD, A, L) \ - inline_mysql_socket_bind(SD, A, L) + #define mysql_socket_bind(FD, A, L) \ + inline_mysql_socket_bind(FD, A, L) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_getsockname(SD, A, LP) \ - inline_mysql_socket_getsockname(__FILE__, __LINE__, SD, A, LP) + #define mysql_socket_getsockname(FD, A, LP) \ + inline_mysql_socket_getsockname(__FILE__, __LINE__, FD, A, LP) #else - #define mysql_socket_getsockname(SD, A, LP) \ - inline_mysql_socket_getsockname(SD, A, LP) + #define mysql_socket_getsockname(FD, A, LP) \ + inline_mysql_socket_getsockname(FD, A, LP) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_connect(SD, A, L) \ - inline_mysql_socket_connect(__FILE__, __LINE__, SD, A, L) + #define mysql_socket_connect(FD, A, L) \ + inline_mysql_socket_connect(__FILE__, __LINE__, FD, A, L) #else - #define mysql_socket_connect(SD, A, L) \ - inline_mysql_socket_connect(SD, A, L) + #define mysql_socket_connect(FD, A, L) \ + inline_mysql_socket_connect(FD, A, L) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_getpeername(SD, A, LP) \ - inline_mysql_socket_getpeername(__FILE__, __LINE__, SD, A, LP) + #define mysql_socket_getpeername(FD, A, LP) \ + inline_mysql_socket_getpeername(__FILE__, __LINE__, FD, A, LP) #else - #define mysql_socket_getpeername(SD, A, LP) \ - inline_mysql_socket_getpeername(SD, A, LP) + #define mysql_socket_getpeername(FD, A, LP) \ + inline_mysql_socket_getpeername(FD, A, LP) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_send(SD, B, N, FL) \ - inline_mysql_socket_send(__FILE__, __LINE__, SD, B, N, FL) + #define mysql_socket_send(FD, B, N, FL) \ + inline_mysql_socket_send(__FILE__, __LINE__, FD, B, N, FL) #else - #define mysql_socket_send(SD, B, N, FL) \ - inline_mysql_socket_send(SD, B, N, FL) + #define mysql_socket_send(FD, B, N, FL) \ + inline_mysql_socket_send(FD, B, N, FL) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_recv(SD, B, N, FL) \ - inline_mysql_socket_recv(__FILE__, __LINE__, SD, B, N, FL) + #define mysql_socket_recv(FD, B, N, FL) \ + inline_mysql_socket_recv(__FILE__, __LINE__, FD, B, N, FL) #else - #define mysql_socket_recv(SD, B, N, FL) \ - inline_mysql_socket_recv(SD, B, N, FL) + #define mysql_socket_recv(FD, B, N, FL) \ + inline_mysql_socket_recv(FD, B, N, FL) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_sendto(SD, B, N, FL, A, L) \ - inline_mysql_socket_sendto(__FILE__, __LINE__, SD, B, N, FL, A, L) + #define mysql_socket_sendto(FD, B, N, FL, A, L) \ + inline_mysql_socket_sendto(__FILE__, __LINE__, FD, B, N, FL, A, L) #else - #define mysql_socket_sendto(SD, B, N, FL, A, L) \ - inline_mysql_socket_sendto(SD, B, N, FL, A, L) + #define mysql_socket_sendto(FD, B, N, FL, A, L) \ + inline_mysql_socket_sendto(FD, B, N, FL, A, L) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_recvfrom(SD, B, N, FL, A, LP) \ - inline_mysql_socket_recvfrom(__FILE__, __LINE__, SD, B, N, FL, A, LP) + #define mysql_socket_recvfrom(FD, B, N, FL, A, LP) \ + inline_mysql_socket_recvfrom(__FILE__, __LINE__, FD, B, N, FL, A, LP) #else - #define mysql_socket_recvfrom(SD, B, N, FL, A, LP) \ - inline_mysql_socket_recvfrom(SD, B, N, FL, A, LP) + #define mysql_socket_recvfrom(FD, B, N, FL, A, LP) \ + inline_mysql_socket_recvfrom(FD, B, N, FL, A, LP) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_sendmsg(SD, M, FL) \ - inline_mysql_socket_sendmsg(__FILE__, __LINE__, SD, M, FL) + #define mysql_socket_sendmsg(FD, M, FL) \ + inline_mysql_socket_sendmsg(__FILE__, __LINE__, FD, M, FL) #else - #define mysql_socket_sendmsg(SD, M, FL) \ - inline_mysql_socket_sendmsg(SD, M, FL) + #define mysql_socket_sendmsg(FD, M, FL) \ + inline_mysql_socket_sendmsg(FD, M, FL) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_recvmsg(SD, M, FL) \ - inline_mysql_socket_recvmsg(__FILE__, __LINE__, SD, M, FL) + #define mysql_socket_recvmsg(FD, M, FL) \ + inline_mysql_socket_recvmsg(__FILE__, __LINE__, FD, M, FL) #else - #define_mysql_socket_recvmsg(SD, M, FL) \ - inline_mysql_socket_recvmsg(SD, M, FL) + #define_mysql_socket_recvmsg(FD, M, FL) \ + inline_mysql_socket_recvmsg(FD, M, FL) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_getsockopt(SD, LV, ON, OP, OL) \ - inline_mysql_socket_getsockopt(__FILE__, __LINE__, SD, LV, ON, OP, OL) + #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \ + inline_mysql_socket_getsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL) #else - #define mysql_socket_getsockopt(SD, LV, ON, OP, OL) \ - inline_mysql_socket_getsockopt(SD, LV, ON, OP, OL) + #define mysql_socket_getsockopt(FD, LV, ON, OP, OL) \ + inline_mysql_socket_getsockopt(FD, LV, ON, OP, OL) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_setsockopt(SD, LV, ON, OP, OL) \ - inline_mysql_socket_setsockopt(__FILE__, __LINE__, SD, LV, ON, OP, OL) + #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \ + inline_mysql_socket_setsockopt(__FILE__, __LINE__, FD, LV, ON, OP, OL) #else - #define mysql_socket_setsockopt(SD, LV, ON, OP, OL) \ - inline_mysql_socket_setsockopt(SD, LV, ON, OP, OL) + #define mysql_socket_setsockopt(FD, LV, ON, OP, OL) \ + inline_mysql_socket_setsockopt(FD, LV, ON, OP, OL) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_listen(SD, N) \ - inline_mysql_socket_listen(__FILE__, __LINE__, SD, N) + #define mysql_socket_listen(FD, N) \ + inline_mysql_socket_listen(__FILE__, __LINE__, FD, N) #else - #define mysql_socket_listen(SD, N) \ - inline_mysql_socket_listen(SD, N) + #define mysql_socket_listen(FD, N) \ + inline_mysql_socket_listen(FD, N) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_accept(SD, A, LP) \ - inline_mysql_socket_accept(__FILE__, __LINE__, SD, A, LP) + #define mysql_socket_accept(K, FD, A, LP) \ + inline_mysql_socket_accept(K, __FILE__, __LINE__, FD, A, LP) #else - #define mysql_socket_accept(SD, A, LP) \ - inline_mysql_socket_accept(SD, A, LP) + #define mysql_socket_accept(FD, A, LP) \ + inline_mysql_socket_accept(FD, A, LP) #endif #if 0 #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_accept4(SD, A, LP, FL) \ - inline_mysql_socket_accept4(__FILE__, __LINE__, SD, A, LP, FL) + #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(SD, A, LP, FL) \ - inline_mysql_socket_accept4(SD, A, LP, FL) + #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(SD) \ - inline_mysql_socket_close(__FILE__, __LINE__, SD) + #define mysql_socket_close(FD) \ + inline_mysql_socket_close(__FILE__, __LINE__, FD) #else - #define mysql_socket_close(SD) \ - inline_mysql_socket_close(SD) + #define mysql_socket_close(FD) \ + inline_mysql_socket_close(FD) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_shutdown(SD, H) \ - inline_mysql_socket_shutdown(__FILE__, __LINE__, SD, H) + #define mysql_socket_shutdown(FD, H) \ + inline_mysql_socket_shutdown(__FILE__, __LINE__, FD, H) #else - #define mysql_socket_shutdown(SD, H) \ - inline_mysql_socket_shutdown(SD, H) + #define mysql_socket_shutdown(FD, H) \ + inline_mysql_socket_shutdown(FD, H) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_sockatmark(SD) \ - inline_mysql_socket_sockatmark(__FILE__, __LINE__, SD) + #define mysql_socket_sockatmark(FD) \ + inline_mysql_socket_sockatmark(__FILE__, __LINE__, FD) #else - #define mysql_socket_sockatmark(SD) \ - inline_mysql_socket_sockatmark(SD) + #define mysql_socket_sockatmark(FD) \ + inline_mysql_socket_sockatmark(FD) #endif #ifdef HAVE_PSI_INTERFACE - #define mysql_socket_isfdtype(SD, FT) \ - inline_mysql_socket_isfdtype(__FILE__, __LINE__, SD, FT) + #define mysql_socket_isfdtype(FD, FT) \ + inline_mysql_socket_isfdtype(__FILE__, __LINE__, FD, FT) #else - #define mysql_socket_isfdtype(SD, FT) \ - inline_mysql_socket_isfdtype(SD, FT) + #define mysql_socket_isfdtype(FD, FT) \ + inline_mysql_socket_isfdtype(FD, FT) #endif struct st_mysql_socket { /** The real socket identifier. */ - my_socket sd; + my_socket fd; /** The instrumentation hook. @@ -301,7 +301,7 @@ struct st_mysql_socket typedef struct st_mysql_socket MYSQL_SOCKET; -#define mysql_socket_getsd(SD) ((SD).sd) +#define mysql_socket_getfd(FD) ((FD).fd) /** mysql_socket_socket */ @@ -315,10 +315,10 @@ inline_mysql_socket_socket { MYSQL_SOCKET mysql_socket = {0, NULL}; #ifdef HAVE_PSI_INTERFACE - mysql_socket.m_psi = PSI_server ? PSI_server->init_socket(key, &mysql_socket.sd) + mysql_socket.m_psi = PSI_server ? PSI_server->init_socket(key, &mysql_socket.fd) : NULL; #endif - mysql_socket.sd= socket(domain, type, protocol); + mysql_socket.fd= socket(domain, type, protocol); return mysql_socket; } @@ -337,11 +337,11 @@ inline_mysql_socket_socketpair #if 0 //TBD #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_CREATE); - if (likely(locker !=NULL)) - PSI_server->start_socket_wait(locker, src_file, src_line); + if (likely(locker !=NULL)) + PSI_server->start_socket_wait(locker, src_file, src_line); } #endif result= socketpair(int domain, int type, int protocol, int fds[2]); @@ -366,14 +366,14 @@ inline_mysql_socket_bind int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_BIND); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= bind(mysql_socket.sd, addr, len); + result= bind(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -394,14 +394,14 @@ inline_mysql_socket_getsockname int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_BIND); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= getsockname(mysql_socket.sd, addr, len); + result= getsockname(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -422,14 +422,14 @@ inline_mysql_socket_connect int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_CONNECT); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= connect(mysql_socket.sd, addr, len); + result= connect(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -450,14 +450,14 @@ inline_mysql_socket_getpeername int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_BIND); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= getpeername(mysql_socket.sd, addr, len); + result= getpeername(mysql_socket.fd, addr, len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -478,14 +478,14 @@ inline_mysql_socket_send ssize_t result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_SEND); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= send(mysql_socket.sd, buf, n, flags); + result= send(mysql_socket.fd, buf, n, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -506,14 +506,14 @@ inline_mysql_socket_recv ssize_t result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_RECV); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= recv(mysql_socket.sd, buf, n, flags); + result= recv(mysql_socket.fd, buf, n, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -534,14 +534,14 @@ inline_mysql_socket_sendto ssize_t result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_SEND); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= sendto(mysql_socket.sd, buf, n, flags, addr, addr_len); + 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); @@ -562,14 +562,14 @@ inline_mysql_socket_recvfrom ssize_t result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_RECV); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= recvfrom(mysql_socket.sd, buf, n, flags, addr, addr_len); + 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); @@ -590,14 +590,14 @@ inline_mysql_socket_sendmsg ssize_t result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_SEND); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= sendmsg(mysql_socket.sd, message, flags); + result= sendmsg(mysql_socket.fd, message, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -618,14 +618,14 @@ inline_mysql_socket_recvmsg ssize_t result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_RECV); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= recvmsg(mysql_socket.sd, message, flags); + result= recvmsg(mysql_socket.fd, message, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -646,14 +646,14 @@ inline_mysql_socket_getsockopt int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_OPT); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= getsockopt(mysql_socket.sd, level, optname, optval, optlen); + result= getsockopt(mysql_socket.fd, level, optname, optval, optlen); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -674,14 +674,14 @@ inline_mysql_socket_setsockopt int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_OPT); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= setsockopt(mysql_socket.sd, level, optname, optval, optlen); + result= setsockopt(mysql_socket.fd, level, optname, optval, optlen); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -702,14 +702,14 @@ inline_mysql_socket_listen int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_CONNECT); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= listen(mysql_socket.sd, n); + result= listen(mysql_socket.fd, n); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -723,27 +723,28 @@ static inline MYSQL_SOCKET inline_mysql_socket_accept ( #ifdef HAVE_PSI_INTERFACE - const char *src_file, uint src_line, + PSI_socket_key key, const char *src_file, uint src_line, #endif - MYSQL_SOCKET mysql_socket, __SOCKADDR_ARG addr, socklen_t *addr_len) + MYSQL_SOCKET socket_listen, __SOCKADDR_ARG addr, socklen_t *addr_len) { - MYSQL_SOCKET result = mysql_socket; - result.sd = 0; + MYSQL_SOCKET socket_accept = {0, NULL}; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + socket_accept.m_psi = PSI_server ? PSI_server->init_socket(key, &socket_accept.fd) + : NULL; + if (likely(PSI_server != NULL && socket_accept.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_CONNECT); + 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); } #endif - result.sd= accept(mysql_socket.sd, addr, addr_len); + socket_accept.fd= accept(socket_listen.fd, addr, addr_len); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); #endif - return result; + return socket_accept; } /** mysql_socket_accept4 */ @@ -753,27 +754,28 @@ static inline MYSQL_SOCKET inline_mysql_socket_accept4 ( #ifdef HAVE_PSI_INTERFACE - const char *src_file, uint src_line, + PSI_socket_key key, const char *src_file, uint src_line, #endif - MYSQL_SOCKET mysql_socket, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) + MYSQL_SOCKET socket_listen, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) { - MYSQL_SOCKET result = mysql_socket; - result.sd = 0; + MYSQL_SOCKET socket_accept = {0, NULL}; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + socket_accept.m_psi = PSI_server ? PSI_server->init_socket(key, &socket_accept.fd) + : NULL; + if (likely(PSI_server != NULL && socket_accept.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_CONNECT); + 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); } #endif - result.sd= accept4(mysql_socket.sd, addr, addr_len, flags); + socket_accept.fd= accept4(socket_listen.fd, addr, addr_len, flags); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); #endif - return result; + return socket_accept; } #endif @@ -793,14 +795,14 @@ inline_mysql_socket_close int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_CLOSE); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= closesocket(mysql_socket.sd); + result= closesocket(mysql_socket.fd); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -821,14 +823,14 @@ inline_mysql_socket_shutdown int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_SHUTDOWN); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= shutdown(mysql_socket.sd, how); + result= shutdown(mysql_socket.fd, how); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -849,14 +851,14 @@ inline_mysql_socket_sockatmark int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_STAT); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= sockatmark(mysql_socket.sd); + result= sockatmark(mysql_socket.fd); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -877,14 +879,14 @@ inline_mysql_socket_isfdtype int result; #ifdef HAVE_PSI_INTERFACE struct PSI_socket_locker *locker= NULL; - if (likely(PSI_server != NULL)) + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_STAT); if (likely(locker !=NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } #endif - result= isfdtype(mysql_socket.sd, fdtype); + result= isfdtype(mysql_socket.fd, fdtype); #ifdef HAVE_PSI_INTERFACE if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); === modified file 'scripts/mysql_system_tables.sql' --- a/scripts/mysql_system_tables.sql 2010-04-14 16:40:04 +0000 +++ b/scripts/mysql_system_tables.sql 2010-07-07 19:49:15 +0000 @@ -360,6 +360,24 @@ EXECUTE stmt; DROP PREPARE stmt; -- +-- TABLE SOCKET_INSTANCES +-- + +SET @l1="CREATE TABLE performance_schema.SOCKET_INSTANCES("; +SET @l2="SOCKET_DESC VARCHAR(512) not null,"; +SET @l3="EVENT_NAME VARCHAR(128) not null,"; +SET @l4="IDENTITY BIGINT not null,"; +SET @l5="OPEN_COUNT INTEGER unsigned not null"; +SET @l6=")ENGINE=PERFORMANCE_SCHEMA;"; + +SET @cmd=concat(@l1,@l2,@l3,@l4,@l5,@l6); + +SET @str = IF(@have_pfs = 1, @cmd, 'SET @dummy = 0'); +PREPARE stmt FROM @str; +EXECUTE stmt; +DROP PREPARE stmt; + +-- -- TABLE MUTEX_INSTANCES -- === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-06-22 23:15:38 +0000 +++ b/sql/mysqld.cc 2010-07-07 19:49:15 +0000 @@ -1078,11 +1078,11 @@ static void close_connections(void) DBUG_PRINT("quit",("Closing sockets")); if (!opt_disable_networking ) { - if (mysql_socket_getsd(ip_sock) != INVALID_SOCKET) + if (mysql_socket_getfd(ip_sock) != INVALID_SOCKET) { (void) mysql_socket_shutdown(ip_sock, SHUT_RDWR); (void) mysql_socket_close(ip_sock); - mysql_socket_getsd(ip_sock)= INVALID_SOCKET; + mysql_socket_getfd(ip_sock)= INVALID_SOCKET; } } #ifdef _WIN32 @@ -1110,12 +1110,12 @@ static void close_connections(void) } #endif #ifdef HAVE_SYS_UN_H - if (mysql_socket_getsd(unix_sock) != INVALID_SOCKET) + if (mysql_socket_getfd(unix_sock) != INVALID_SOCKET) { (void) mysql_socket_shutdown(unix_sock, SHUT_RDWR); (void) mysql_socket_close(unix_sock); (void) unlink(mysqld_unix_port); - mysql_socket_getsd(unix_sock)= INVALID_SOCKET; + mysql_socket_getfd(unix_sock)= INVALID_SOCKET; } #endif end_thr_alarm(0); // Abort old alarms. @@ -1213,9 +1213,9 @@ static void close_server_sock() DBUG_ENTER("close_server_sock"); MYSQL_SOCKET tmp_sock; tmp_sock=ip_sock; - if (mysql_socket_getsd(tmp_sock) != INVALID_SOCKET) + if (mysql_socket_getfd(tmp_sock) != INVALID_SOCKET) { - mysql_socket_getsd(ip_sock)= INVALID_SOCKET; + mysql_socket_getfd(ip_sock)= INVALID_SOCKET; DBUG_PRINT("info",("calling shutdown on TCP/IP socket")); (void) mysql_socket_shutdown(tmp_sock, SHUT_RDWR); #if defined(__NETWARE__) @@ -1228,9 +1228,9 @@ static void close_server_sock() #endif } tmp_sock=unix_sock; - if (mysql_socket_getsd(tmp_sock) != INVALID_SOCKET) + if (mysql_socket_getfd(tmp_sock) != INVALID_SOCKET) { - mysql_socket_getsd(unix_sock)= INVALID_SOCKET; + mysql_socket_getfd(unix_sock)= INVALID_SOCKET; DBUG_PRINT("info",("calling shutdown on unix socket")); (void) mysql_socket_shutdown(tmp_sock, SHUT_RDWR); #if defined(__NETWARE__) @@ -1865,12 +1865,12 @@ static void network_init(void) for (a= ai; a != NULL; a= a->ai_next) { - ip_sock= mysql_socket_socket(key_socket_server, a->ai_family, a->ai_socktype, a->ai_protocol); - if (mysql_socket_getsd(ip_sock) != INVALID_SOCKET) + ip_sock= mysql_socket_socket(key_socket_network_init, a->ai_family, a->ai_socktype, a->ai_protocol); + if (mysql_socket_getfd(ip_sock) != INVALID_SOCKET) break; } - if (mysql_socket_getsd(ip_sock) == INVALID_SOCKET) + if (mysql_socket_getfd(ip_sock) == INVALID_SOCKET) { DBUG_PRINT("error",("Got error: %d from socket()",socket_errno)); sql_perror(ER_DEFAULT(ER_IPSOCK_ERROR)); /* purecov: tested */ @@ -1999,7 +1999,7 @@ static void network_init(void) (uint) sizeof(UNIXaddr.sun_path) - 1, mysqld_unix_port); unireg_abort(1); } - if (mysql_socket_getsd((unix_sock= mysql_socket_socket(key_socket_server, AF_UNIX, SOCK_STREAM, 0))) < 0) + if (mysql_socket_getfd((unix_sock= mysql_socket_socket(key_socket_network_init, AF_UNIX, SOCK_STREAM, 0))) < 0) { sql_perror("Can't start server : UNIX Socket "); /* purecov: inspected */ unireg_abort(1); /* purecov: inspected */ @@ -2012,7 +2012,7 @@ static void network_init(void) (void) mysql_socket_setsockopt(unix_sock, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, sizeof(arg)); umask(0); - if (bind(mysql_socket_getsd(unix_sock), my_reinterpret_cast(struct sockaddr *) (&UNIXaddr), + if (bind(mysql_socket_getfd(unix_sock), my_reinterpret_cast(struct sockaddr *) (&UNIXaddr), sizeof(UNIXaddr)) < 0) { sql_perror("Can't start server : Bind on unix socket"); /* purecov: tested */ @@ -4801,7 +4801,7 @@ int mysqld_main(int argc, char **argv) if (!opt_bootstrap) mysql_file_delete(key_file_pid, pidfile_name, MYF(MY_WME)); // Not needed anymore - if (mysql_socket_getsd(unix_sock) != INVALID_SOCKET) + if (mysql_socket_getfd(unix_sock) != INVALID_SOCKET) unlink(mysqld_unix_port); exit(1); } @@ -4868,7 +4868,7 @@ int mysqld_main(int argc, char **argv) start_handle_manager(); sql_print_information(ER_DEFAULT(ER_STARTUP),my_progname,server_version, - ((mysql_socket_getsd(unix_sock) == INVALID_SOCKET) ? (char*) "" + ((mysql_socket_getfd(unix_sock) == INVALID_SOCKET) ? (char*) "" : mysqld_unix_port), mysqld_port, MYSQL_COMPILATION_COMMENT); @@ -5351,9 +5351,9 @@ inline void kill_broken_server() /* hack to get around signals ignored in syscalls for problem OS's */ if ( #if !defined(__NETWARE__) - mysql_socket_getsd(unix_sock) == INVALID_SOCKET || + mysql_socket_getfd(unix_sock) == INVALID_SOCKET || #endif - (!opt_disable_networking && mysql_socket_getsd(ip_sock) == INVALID_SOCKET)) + (!opt_disable_networking && mysql_socket_getfd(ip_sock) == INVALID_SOCKET)) { select_thread_in_use = 0; /* The following call will never return */ @@ -5383,7 +5383,7 @@ void handle_connections_sockets() struct pollfd fds[2]; // for ip_sock and unix_sock #else fd_set readFDs,clientFDs; - uint max_used_connection= (uint)(max(mysql_socket_getsd(ip_sock), mysql_socket_getsd(unix_sock))+1); + uint max_used_connection= (uint)(max(mysql_socket_getfd(ip_sock), mysql_socket_getfd(unix_sock))+1); #endif DBUG_ENTER("handle_connections_sockets"); @@ -5392,29 +5392,29 @@ void handle_connections_sockets() FD_ZERO(&clientFDs); #endif - if (mysql_socket_getsd(ip_sock) != INVALID_SOCKET) + if (mysql_socket_getfd(ip_sock) != INVALID_SOCKET) { #ifdef HAVE_POLL - fds[socket_count].fd= mysql_socket_getsd(ip_sock); + fds[socket_count].fd= mysql_socket_getfd(ip_sock); fds[socket_count].events= POLLIN; socket_count++; #else - FD_SET(mysql_socket_getsd(ip_sock), &clientFDs); + FD_SET(mysql_socket_getfd(ip_sock), &clientFDs); #endif #ifdef HAVE_FCNTL - ip_flags = fcntl(mysql_socket_getsd(ip_sock), F_GETFL, 0); + ip_flags = fcntl(mysql_socket_getfd(ip_sock), F_GETFL, 0); #endif } #ifdef HAVE_SYS_UN_H #ifdef HAVE_POLL - fds[socket_count].fd= mysql_socket_getsd(unix_sock); + fds[socket_count].fd= mysql_socket_getfd(unix_sock); fds[socket_count].events= POLLIN; socket_count++; #else - FD_SET(mysql_socket_getsd(unix_sock), &clientFDs); + FD_SET(mysql_socket_getfd(unix_sock), &clientFDs); #endif #ifdef HAVE_FCNTL - socket_flags=fcntl(mysql_socket_getsd(unix_sock), F_GETFL, 0); + socket_flags=fcntl(mysql_socket_getfd(unix_sock), F_GETFL, 0); #endif #endif @@ -5453,9 +5453,9 @@ void handle_connections_sockets() { if (fds[i].revents & POLLIN) { - mysql_socket_getsd(sock)= fds[i].fd; + mysql_socket_getfd(sock)= fds[i].fd; #ifdef HAVE_FCNTL - flags= fcntl(mysql_socket_getsd(sock), F_GETFL, 0); + flags= fcntl(mysql_socket_getfd(sock), F_GETFL, 0); #else flags= 0; #endif // HAVE_FCNTL @@ -5464,7 +5464,7 @@ void handle_connections_sockets() } #else // HAVE_POLL #ifdef HAVE_SYS_UN_H - if (FD_ISSET(mysql_socket_getsd(unix_sock), &readFDs)) + if (FD_ISSET(mysql_socket_getfd(unix_sock), &readFDs)) { sock = unix_sock; flags= socket_flags; @@ -5481,24 +5481,24 @@ void handle_connections_sockets() if (!(test_flags & TEST_BLOCKING)) { #if defined(O_NONBLOCK) - fcntl(mysql_socket_getsd(sock), F_SETFL, flags | O_NONBLOCK); + fcntl(mysql_socket_getfd(sock), F_SETFL, flags | O_NONBLOCK); #elif defined(O_NDELAY) - fcntl(mysql_socket_getsd(sock), F_SETFL, flags | O_NDELAY); + fcntl(mysql_socket_getfd(sock), F_SETFL, flags | O_NDELAY); #endif } #endif /* NO_FCNTL_NONBLOCK */ for (uint retry=0; retry < MAX_ACCEPT_RETRY; retry++) { size_socket length= sizeof(struct sockaddr_storage); - new_sock= mysql_socket_accept(sock, (struct sockaddr *)(&cAddr), &length); + new_sock= mysql_socket_accept(key_socket_handle_connection, sock, (struct sockaddr *)(&cAddr), &length); #ifdef __NETWARE__ // TODO: temporary fix, waiting for TCP/IP fix - DEFECT000303149 - if ((mysql_socket_getsd(new_sock) == INVALID_SOCKET) && (socket_errno == EINVAL)) + if ((mysql_socket_getfd(new_sock) == INVALID_SOCKET) && (socket_errno == EINVAL)) { kill_server(SIGTERM); } #endif - if (mysql_socket_getsd(new_sock) != INVALID_SOCKET || + if (mysql_socket_getfd(new_sock) != INVALID_SOCKET || (socket_errno != SOCKET_EINTR && socket_errno != SOCKET_EAGAIN)) break; MAYBE_BROKEN_SYSCALL; @@ -5506,15 +5506,15 @@ void handle_connections_sockets() if (!(test_flags & TEST_BLOCKING)) { if (retry == MAX_ACCEPT_RETRY - 1) - fcntl(mysql_socket_getsd(sock), F_SETFL, flags); // Try without O_NONBLOCK + fcntl(mysql_socket_getfd(sock), F_SETFL, flags); // Try without O_NONBLOCK } #endif } #if !defined(NO_FCNTL_NONBLOCK) if (!(test_flags & TEST_BLOCKING)) - fcntl(mysql_socket_getsd(sock), F_SETFL, flags); + fcntl(mysql_socket_getfd(sock), F_SETFL, flags); #endif - if (mysql_socket_getsd(new_sock) == INVALID_SOCKET) + if (mysql_socket_getfd(new_sock) == INVALID_SOCKET) { if ((error_count++ & 255) == 0) // This can happen often sql_perror("Error in accept"); @@ -5526,11 +5526,11 @@ void handle_connections_sockets() #ifdef HAVE_LIBWRAP { - if (mysql_socket_getsd(sock) == mysql_socket_getsd(ip_sock)) + if (mysql_socket_getfd(sock) == mysql_socket_getfd(ip_sock)) { struct request_info req; signal(SIGCHLD, SIG_DFL); - request_init(&req, RQ_DAEMON, libwrapName, RQ_FILE, mysql_socket_getsd(new_sock), NULL); //TBD cwp + request_init(&req, RQ_DAEMON, libwrapName, RQ_FILE, mysql_socket_getfd(new_sock), NULL); //TBD cwp my_fromhost(&req); if (!my_hosts_access(&req)) { @@ -5583,10 +5583,10 @@ void handle_connections_sockets() (void) mysql_socket_close(new_sock); continue; } - if (!(vio_tmp=vio_new(mysql_socket_getsd(new_sock), //TBD cwp - mysql_socket_getsd(sock) == mysql_socket_getsd(unix_sock) ? VIO_TYPE_SOCKET : + if (!(vio_tmp=vio_new(mysql_socket_getfd(new_sock), //TBD cwp + mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock) ? VIO_TYPE_SOCKET : VIO_TYPE_TCPIP, - mysql_socket_getsd(sock) == mysql_socket_getsd(unix_sock) ? VIO_LOCALHOST: 0)) || + mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock) ? VIO_LOCALHOST: 0)) || my_net_init(&thd->net,vio_tmp)) { /* @@ -5604,7 +5604,7 @@ void handle_connections_sockets() delete thd; continue; } - if (mysql_socket_getsd(sock) == mysql_socket_getsd(unix_sock)) + if (mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock)) thd->security_ctx->host=(char*) my_localhost; create_new_thread(thd); @@ -7054,7 +7054,7 @@ static int mysql_init_variables(void) character_set_filesystem= &my_charset_bin; opt_specialflag= SPECIAL_ENGLISH; - mysql_socket_getsd(unix_sock)= mysql_socket_getsd(ip_sock)= INVALID_SOCKET; + mysql_socket_getfd(unix_sock)= mysql_socket_getfd(ip_sock)= INVALID_SOCKET; mysql_home_ptr= mysql_home; pidfile_name_ptr= pidfile_name; log_error_file_ptr= log_error_file; @@ -8222,12 +8222,12 @@ static PSI_file_info all_server_files[]= { &key_file_init, "init", 0} }; -PSI_socket_key key_socket_server, key_socket_TBD; +PSI_socket_key key_socket_network_init, key_socket_handle_connection; static PSI_socket_info all_server_sockets[]= { - { &key_socket_server, "server", 0}, - { &key_socket_TBD, "TBD", 0} + { &key_socket_network_init, "network_init", 0}, + { &key_socket_handle_connection, "handle_connection", 0} }; /** === modified file 'sql/mysqld.h' --- a/sql/mysqld.h 2010-06-22 23:15:38 +0000 +++ b/sql/mysqld.h 2010-07-07 19:49:15 +0000 @@ -280,7 +280,7 @@ extern PSI_file_key key_file_binlog, key key_file_pid, key_file_relay_log_info, key_file_send_file, key_file_tclog, key_file_trg, key_file_trn, key_file_init; -extern PSI_socket_key key_socket_server, key_socket_TBD; +extern PSI_socket_key key_socket_network_init, key_socket_handle_connection; void init_server_psi_keys(); #endif /* HAVE_PSI_INTERFACE */ === modified file 'sql/sys_vars.cc' --- a/sql/sys_vars.cc 2010-06-17 16:58:30 +0000 +++ b/sql/sys_vars.cc 2010-07-07 19:49:15 +0000 @@ -133,6 +133,22 @@ static Sys_var_ulong Sys_pfs_max_file_in DEFAULT(PFS_MAX_FILE), BLOCK_SIZE(1), PFS_TRAILING_PROPERTIES); +static Sys_var_ulong Sys_pfs_max_sockets( + "performance_schema_max_sockets", + "Maximum number of opened instrumented sockets.", + READ_ONLY GLOBAL_VAR(pfs_param.m_socket_sizing), + CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 1024*1024), + DEFAULT(PFS_MAX_SOCKETS), + BLOCK_SIZE(1), PFS_TRAILING_PROPERTIES); + +static Sys_var_ulong Sys_pfs_max_socket_classes( + "performance_schema_max_socket_classes", + "Maximum number of socket instruments.", + READ_ONLY GLOBAL_VAR(pfs_param.m_socket_class_sizing), + CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 256), + DEFAULT(PFS_MAX_SOCKET_CLASS), + BLOCK_SIZE(1), PFS_TRAILING_PROPERTIES); + static Sys_var_ulong Sys_pfs_max_mutex_classes( "performance_schema_max_mutex_classes", "Maximum number of mutex instruments.", === modified file 'storage/perfschema/CMakeLists.txt' --- a/storage/perfschema/CMakeLists.txt 2010-04-19 12:26:29 +0000 +++ b/storage/perfschema/CMakeLists.txt 2010-07-07 19:49:15 +0000 @@ -41,6 +41,7 @@ SET(PERFSCHEMA_SOURCES ha_perfschema.h table_events_waits_summary.h table_file_instances.h table_file_summary.h + table_socket_instances.h table_performance_timers.h table_processlist.h table_setup_consumers.h @@ -63,6 +64,7 @@ SET(PERFSCHEMA_SOURCES ha_perfschema.h table_events_waits_summary.cc table_file_instances.cc table_file_summary.cc + table_socket_instances.cc table_performance_timers.cc table_processlist.cc table_setup_consumers.cc === modified file 'storage/perfschema/ha_perfschema.cc' --- a/storage/perfschema/ha_perfschema.cc 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/ha_perfschema.cc 2010-07-07 19:49:15 +0000 @@ -125,6 +125,8 @@ static struct st_mysql_show_var pfs_stat (char*) &file_lost, SHOW_LONG}, {"Performance_schema_file_handles_lost", (char*) &file_handle_lost, SHOW_LONG}, + {"Performance_schema_socket_instances_lost", + (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-06-22 23:15:38 +0000 +++ b/storage/perfschema/pfs.cc 2010-07-07 19:49:15 +0000 @@ -938,7 +938,21 @@ static void destroy_cond_v1(PSI_cond* co static PSI_socket* init_socket_v1(PSI_socket_key key, const void *identity) { - INIT_BODY_V1(socket, key, identity); +// INIT_BODY_V1(socket, key, identity); + PFS_socket_class *klass; + PFS_socket *pfs; + PFS_thread *pfs_thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS); + if (unlikely(pfs_thread == NULL)) + return NULL; + if (! pfs_thread->m_enabled) + return NULL; + klass= find_socket_class(key); + if (unlikely(klass == NULL)) + return NULL; + if (! klass->m_enabled) + return NULL; + pfs= create_socket(klass, identity); + return reinterpret_cast (pfs); } static void destroy_socket_v1(PSI_socket* socket) @@ -1181,10 +1195,12 @@ static PSI_rwlock_locker* get_thread_rwlock_locker_v1(PSI_rwlock *rwlock, PSI_rwlock_operation op) { PFS_rwlock *pfs_rwlock= reinterpret_cast (rwlock); + DBUG_ASSERT(static_cast (op) >= 0); DBUG_ASSERT(static_cast (op) < array_elements(rwlock_operation_map)); DBUG_ASSERT(pfs_rwlock != NULL); DBUG_ASSERT(pfs_rwlock->m_class != NULL); + if (! flag_events_waits_current) return NULL; if (! pfs_rwlock->m_class->m_enabled) @@ -1507,7 +1523,57 @@ get_thread_file_descriptor_locker_v1(Fil static PSI_socket_locker* get_thread_socket_locker_v1(PSI_socket *socket, PSI_socket_operation op) { - return NULL; + PFS_socket *pfs_socket= reinterpret_cast (socket); + + DBUG_ASSERT(static_cast (op) >= 0); + DBUG_ASSERT(static_cast (op) < array_elements(socket_operation_map)); + DBUG_ASSERT(pfs_socket != NULL); + DBUG_ASSERT(pfs_socket->m_class != NULL); + + if (! flag_events_waits_current) + return NULL; + + if (! pfs_socket->m_class->m_enabled) + return NULL; + + PFS_thread *pfs_thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS); + + if (unlikely(pfs_thread == NULL)) + return NULL; + + if (! pfs_thread->m_enabled) + return NULL; + + if (unlikely(pfs_thread->m_wait_locker_count >= LOCKER_STACK_SIZE)) + { + locker_lost++; + return NULL; + } + + PFS_wait_locker *pfs_locker= &pfs_thread->m_wait_locker_stack[pfs_thread->m_wait_locker_count]; + pfs_locker->m_waits_current.m_wait_class= NO_WAIT_CLASS; + + pfs_locker->m_target.m_socket= pfs_socket; + pfs_locker->m_waits_current.m_thread= pfs_thread; + pfs_locker->m_waits_current.m_class= pfs_socket->m_class; + + if (pfs_socket->m_class->m_timed) + { + pfs_locker->m_timer_name= wait_timer; + pfs_locker->m_waits_current.m_timer_state= TIMER_STATE_STARTING; + } + else + pfs_locker->m_waits_current.m_timer_state= TIMER_STATE_UNTIMED; + + pfs_locker->m_waits_current.m_object_instance_addr= pfs_socket; // TBD + 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_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_FILE; + + pfs_thread->m_wait_locker_count++; + return reinterpret_cast (pfs_locker); } static void unlock_mutex_v1(PSI_thread * thread, PSI_mutex *mutex) @@ -2092,10 +2158,10 @@ static void end_socket_wait_v1(PSI_socke PFS_socket *socket= pfs_locker->m_target.m_socket; 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); + 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_socket_class *klass= socket->m_class; === modified file 'storage/perfschema/pfs_engine_table.cc' --- a/storage/perfschema/pfs_engine_table.cc 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/pfs_engine_table.cc 2010-07-07 19:49:15 +0000 @@ -31,6 +31,7 @@ #include "table_sync_instances.h" #include "table_file_instances.h" #include "table_file_summary.h" +#include "table_socket_instances.h" /* For show status */ #include "pfs_column_values.h" @@ -65,6 +66,7 @@ static PFS_engine_table_share *all_share &table_rwlock_instances::m_share, &table_cond_instances::m_share, &table_file_instances::m_share, + &table_socket_instances::m_share, NULL }; @@ -742,11 +744,24 @@ bool pfs_show_status(handlerton *hton, T size= table_max * sizeof(PFS_table); total_memory+= size; break; + case 50: + name= "SOCKET_INSTANCES.ROW_SIZE"; + size= sizeof(PFS_socket); + break; + case 51: + name= "SOCKET_INSTANCES.ROW_COUNT"; + size= socket_max; + break; + case 52: + name= "SOCKET_INSTANCES.MEMORY"; + size= socket_max * sizeof(PFS_socket); + total_memory+= size; + break; /* This case must be last, for aggregation in total_memory. */ - case 50: + case 53: name= "PERFORMANCE_SCHEMA.MEMORY"; size= total_memory; /* This will fail if something is not advertised here */ === modified file 'storage/perfschema/pfs_engine_table.h' --- a/storage/perfschema/pfs_engine_table.h 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/pfs_engine_table.h 2010-07-07 19:49:15 +0000 @@ -299,6 +299,7 @@ struct PFS_instrument_view_constants static const uint VIEW_RWLOCK= 2; static const uint VIEW_COND= 3; static const uint VIEW_FILE= 4; + static const uint VIEW_SOCKET= 5; }; struct PFS_object_view_constants === modified file 'storage/perfschema/pfs_instr.cc' --- a/storage/perfschema/pfs_instr.cc 2010-06-22 23:15:38 +0000 +++ b/storage/perfschema/pfs_instr.cc 2010-07-07 19:49:15 +0000 @@ -136,6 +136,7 @@ static volatile uint32 thread_internal_i static uint per_thread_rwlock_class_start; static uint per_thread_cond_class_start; static uint per_thread_file_class_start; +static uint per_thread_socket_class_start; static uint thread_instr_class_waits_sizing; static PFS_single_stat_chain *thread_instr_class_waits_array= NULL; @@ -174,6 +175,8 @@ int init_instruments(const PFS_global_pa table_lost= 0; thread_max= param->m_thread_sizing; thread_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 @@ -184,9 +187,12 @@ int init_instruments(const PFS_global_pa + param->m_rwlock_class_sizing; per_thread_file_class_start= per_thread_cond_class_start + param->m_cond_class_sizing; - instr_class_per_thread= per_thread_file_class_start + per_thread_socket_class_start= per_thread_file_class_start + param->m_file_class_sizing; + instr_class_per_thread= per_thread_socket_class_start + + param->m_socket_class_sizing; + thread_instr_class_waits_sizing= param->m_thread_sizing * instr_class_per_thread; @@ -195,6 +201,7 @@ int init_instruments(const PFS_global_pa cond_array= NULL; file_array= NULL; file_handle_array= NULL; + socket_array= NULL; table_array= NULL; thread_array= NULL; thread_history_array= NULL; @@ -236,6 +243,13 @@ int init_instruments(const PFS_global_pa return 1; } + if (socket_max > 0) + { + socket_array= PFS_MALLOC_ARRAY(socket_max, PFS_socket, MYF(MY_ZEROFILL)); + if (unlikely(socket_array == NULL)) + return 1; + } + if (table_max > 0) { table_array= PFS_MALLOC_ARRAY(table_max, PFS_table, MYF(MY_ZEROFILL)); @@ -382,6 +396,28 @@ find_per_thread_file_class_wait_stat(PFS return stat; } +/** + Find the per-thread wait statistics for a socket class. + @param thread input thread + @param klass socket class + @return the per thread per socket class wait stat +*/ +PFS_single_stat_chain * +find_per_thread_socket_class_wait_stat(PFS_thread *thread, + PFS_socket_class *klass) +{ + PFS_single_stat_chain *stat; + uint index; + + DBUG_ASSERT(thread != NULL); + DBUG_ASSERT(klass != NULL); + index= klass->m_index; + DBUG_ASSERT(index < socket_class_max); + + stat= &(thread->m_instr_class_wait_stats[per_thread_socket_class_start + index]); + return stat; +} + /** Reset the wait statistics per thread. */ void reset_per_thread_wait_stat(void) { @@ -410,6 +446,9 @@ void cleanup_instruments(void) pfs_free(file_handle_array); file_handle_array= NULL; file_handle_max= 0; + pfs_free(socket_array); + socket_array= NULL; + socket_max= 0; pfs_free(table_array); table_array= NULL; table_max= 0; @@ -1063,7 +1102,7 @@ void destroy_table(PFS_table *pfs) @param identity the socket address @return a socket instance, or NULL */ -PFS_socket* create_socket(PFS_socket_class *klass, const void *identity) // TBD +PFS_socket* create_socket(PFS_socket_class *klass, const void *identity) { PFS_scan scan; uint random= randomized_index(identity, socket_max); === modified file 'storage/perfschema/pfs_instr.h' --- a/storage/perfschema/pfs_instr.h 2010-06-22 23:15:38 +0000 +++ b/storage/perfschema/pfs_instr.h 2010-07-07 19:49:15 +0000 @@ -134,8 +134,10 @@ struct PFS_socket : public PFS_instr { /** Socket identity, typically int */ const void *m_identity; - /** Socket data. */ // TBD - char m_socketaddr[14]; + /** Socket description. */ + char m_socket_desc[14]; // TBD + /** Socket description length in bytes */ + uint m_socket_desc_length; /** Socket class. */ PFS_socket_class *m_class; /** Socket usage statistics. */ @@ -257,6 +259,10 @@ PFS_single_stat_chain* find_per_thread_file_class_wait_stat(PFS_thread *thread, PFS_file_class *klass); +PFS_single_stat_chain* +find_per_thread_socket_class_wait_stat(PFS_thread *thread, + PFS_socket_class *klass); + int init_instruments(const PFS_global_param *param); void cleanup_instruments(); int init_file_hash(); === modified file 'storage/perfschema/pfs_instr_class.cc' --- a/storage/perfschema/pfs_instr_class.cc 2010-06-22 23:15:38 +0000 +++ b/storage/perfschema/pfs_instr_class.cc 2010-07-07 19:49:15 +0000 @@ -353,8 +353,7 @@ int init_socket_class(uint socket_class_ if (socket_class_max > 0) { - socket_class_array= PFS_MALLOC_ARRAY(socket_class_max, PFS_socket_class, - MYF(MY_ZEROFILL)); + socket_class_array= PFS_MALLOC_ARRAY(socket_class_max, PFS_socket_class, MYF(MY_ZEROFILL)); if (unlikely(socket_class_array == NULL)) return 1; } @@ -748,8 +747,18 @@ PFS_socket_key register_socket_class(con uint32 index; PFS_socket_class *entry; - REGISTER_CLASS_BODY_PART(index, socket_class_array, socket_class_max, - name, name_length) +// REGISTER_CLASS_BODY_PART(index, socket_class_array, socket_class_max, name, name_length) + + for (index= 0; index < socket_class_max; index++) + { + entry= &socket_class_array[index]; + if ((entry->m_name_length == name_length) && + (strncmp(entry->m_name, name, name_length) == 0)) + { + DBUG_ASSERT(entry->m_flags == flags); + return (index + 1); + } + } index= PFS_atomic::add_u32(&socket_class_dirty_count, 1); @@ -776,7 +785,10 @@ PFS_socket_key register_socket_class(con */ PFS_socket_class *find_socket_class(PFS_socket_key key) { - FIND_CLASS_BODY(key, socket_class_allocated_count, socket_class_array); +// FIND_CLASS_BODY(key, socket_class_allocated_count, socket_class_array); + if ((key == 0) || (key > socket_class_allocated_count)) + return NULL; + return &socket_class_array[key - 1]; } PFS_socket_class *sanitize_socket_class(PFS_socket_class *unsafe) === modified file 'storage/perfschema/pfs_server.cc' --- a/storage/perfschema/pfs_server.cc 2010-06-04 20:20:13 +0000 +++ b/storage/perfschema/pfs_server.cc 2010-07-07 19:49:15 +0000 @@ -65,6 +65,7 @@ initialize_performance_schema(const PFS_ init_thread_class(param->m_thread_class_sizing) || init_table_share(param->m_table_share_sizing) || init_file_class(param->m_file_class_sizing) || + init_socket_class(param->m_socket_class_sizing) || init_instruments(param) || init_events_waits_history_long( param->m_events_waits_history_long_sizing) || @@ -109,6 +110,7 @@ static void cleanup_performance_schema(v cleanup_thread_class(); cleanup_table_share(); cleanup_file_class(); + cleanup_socket_class(); cleanup_events_waits_history_long(); cleanup_table_share_hash(); cleanup_file_hash(); === modified file 'storage/perfschema/pfs_server.h' --- a/storage/perfschema/pfs_server.h 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/pfs_server.h 2010-07-07 19:49:15 +0000 @@ -54,6 +54,12 @@ #ifndef PFS_MAX_FILE_HANDLE #define PFS_MAX_FILE_HANDLE 32768 #endif +#ifndef PFS_MAX_SOCKETS + #define PFS_MAX_SOCKETS 10000 +#endif +#ifndef PFS_MAX_SOCKET_CLASS + #define PFS_MAX_SOCKET_CLASS 50 +#endif #ifndef PFS_MAX_TABLE_SHARE #define PFS_MAX_TABLE_SHARE 50000 #endif @@ -83,6 +89,8 @@ struct PFS_global_param ulong m_table_sizing; ulong m_file_sizing; ulong m_file_handle_sizing; + ulong m_socket_sizing; + ulong m_socket_class_sizing; ulong m_events_waits_history_sizing; ulong m_events_waits_history_long_sizing; }; === modified file 'storage/perfschema/table_all_instr.cc' --- a/storage/perfschema/table_all_instr.cc 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/table_all_instr.cc 2010-07-07 19:49:15 +0000 @@ -40,6 +40,7 @@ int table_all_instr::rnd_next(void) PFS_rwlock *rwlock; PFS_cond *cond; PFS_file *file; + PFS_socket *socket; for (m_pos.set_at(&m_next_pos); m_pos.has_more_view(); @@ -94,6 +95,18 @@ int table_all_instr::rnd_next(void) } } break; + case pos_all_instr::VIEW_SOCKET: + 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()) + { + make_socket_row(socket); + m_next_pos.set_after(&m_pos); + return 0; + } + } + break; } } @@ -106,6 +119,7 @@ int table_all_instr::rnd_pos(const void PFS_rwlock *rwlock; PFS_cond *cond; PFS_file *file; + PFS_socket *socket; set_position(pos); @@ -146,6 +160,15 @@ int table_all_instr::rnd_pos(const void return 0; } break; + case pos_all_instr::VIEW_SOCKET: + DBUG_ASSERT(m_pos.m_index_2 < socket_max); + socket= &socket_array[m_pos.m_index_2]; + if (socket->m_lock.is_populated()) + { + make_socket_row(socket); + return 0; + } + break; } return HA_ERR_RECORD_DELETED; @@ -169,6 +192,7 @@ int table_all_instr_class::rnd_next(void PFS_rwlock_class *rwlock_class; PFS_cond_class *cond_class; PFS_file_class *file_class; + PFS_socket_class *socket_class; for (m_pos.set_at(&m_next_pos); m_pos.has_more_view(); @@ -211,6 +235,15 @@ int table_all_instr_class::rnd_next(void return 0; } break; + case pos_all_instr_class::VIEW_SOCKET: + socket_class= find_socket_class(m_pos.m_index_2); + if (socket_class) + { + make_instr_row(socket_class); + m_next_pos.set_after(&m_pos); + return 0; + } + break; } } @@ -223,6 +256,7 @@ int table_all_instr_class::rnd_pos(const PFS_rwlock_class *rwlock_class; PFS_cond_class *cond_class; PFS_file_class *file_class; + PFS_socket_class *socket_class; set_position(pos); switch (m_pos.m_index_1) { @@ -258,6 +292,14 @@ int table_all_instr_class::rnd_pos(const return 0; } break; + case pos_all_instr_class::VIEW_SOCKET: + socket_class= find_socket_class(m_pos.m_index_2); + if (socket_class) + { + make_instr_row(socket_class); + return 0; + } + break; } return HA_ERR_RECORD_DELETED; === modified file 'storage/perfschema/table_all_instr.h' --- a/storage/perfschema/table_all_instr.h 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/table_all_instr.h 2010-07-07 19:49:15 +0000 @@ -45,7 +45,7 @@ struct pos_all_instr_class : public PFS_ } inline bool has_more_view(void) - { return (m_index_1 <= VIEW_FILE); } + { return (m_index_1 <= VIEW_SOCKET); } inline void next_view(void) { @@ -105,7 +105,7 @@ struct pos_all_instr : public PFS_double } inline bool has_more_view(void) - { return (m_index_1 <= VIEW_FILE); } + { return (m_index_1 <= VIEW_SOCKET); } inline void next_view(void) { @@ -157,6 +157,11 @@ protected: @param pfs the file instance */ virtual void make_file_row(PFS_file *pfs)= 0; + /** + Build a row in the socket instance view. + @param pfs the socket instance + */ + virtual void make_socket_row(PFS_socket *pfs)= 0; /** Current position. */ pos_all_instr m_pos; === modified file 'storage/perfschema/table_events_waits_summary.cc' --- a/storage/perfschema/table_events_waits_summary.cc 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/table_events_waits_summary.cc 2010-07-07 19:49:15 +0000 @@ -118,6 +118,7 @@ int table_events_waits_summary_by_thread PFS_rwlock_class *rwlock_class; PFS_cond_class *cond_class; PFS_file_class *file_class; + PFS_socket_class *socket_class; for (m_pos.set_at(&m_next_pos); m_pos.has_more_thread(); @@ -165,6 +166,15 @@ int table_events_waits_summary_by_thread return 0; } break; + case pos_events_waits_summary_by_thread_by_event_name::VIEW_SOCKET: + socket_class= find_socket_class(m_pos.m_index_3); + if (socket_class) + { + make_socket_row(thread, socket_class); + m_next_pos.set_after(&m_pos); + return 0; + } + break; } } } @@ -181,6 +191,7 @@ table_events_waits_summary_by_thread_by_ PFS_rwlock_class *rwlock_class; PFS_cond_class *cond_class; PFS_file_class *file_class; + PFS_socket_class *socket_class; set_position(pos); DBUG_ASSERT(m_pos.m_index_1 < thread_max); @@ -222,6 +233,14 @@ table_events_waits_summary_by_thread_by_ return 0; } break; + case pos_events_waits_summary_by_thread_by_event_name::VIEW_SOCKET: + socket_class= find_socket_class(m_pos.m_index_3); + if (socket_class) + { + make_socket_row(thread, socket_class); + return 0; + } + break; } return HA_ERR_RECORD_DELETED; } @@ -290,6 +309,14 @@ void table_events_waits_summary_by_threa make_instr_row(thread, klass, stat); } +void table_events_waits_summary_by_thread_by_event_name +::make_socket_row(PFS_thread *thread, PFS_socket_class *klass) +{ + PFS_single_stat_chain *stat; + stat= find_per_thread_socket_class_wait_stat(thread, klass); + make_instr_row(thread, klass, stat); +} + int table_events_waits_summary_by_thread_by_event_name ::read_row_values(TABLE *table, unsigned char *, Field **fields, bool read_all) @@ -646,6 +673,24 @@ void table_events_waits_summary_by_insta */ make_instr_row(pfs, safe_class, pfs); } + +/** + Build a row, for socket statistics in a thread. + @param pfs the socket this cursor is reading +*/ +void table_events_waits_summary_by_instance::make_socket_row(PFS_socket *pfs) +{ + PFS_socket_class *safe_class; + safe_class= sanitize_socket_class(pfs->m_class); + if (unlikely(safe_class == NULL)) + return; + + /* + Files don't have a in memory structure associated to it, + so we use the address of the PFS_socket buffer as object_instance_begin + */ + make_instr_row(pfs, safe_class, pfs); +} int table_events_waits_summary_by_instance ::read_row_values(TABLE *table, unsigned char *, Field **fields, === modified file 'storage/perfschema/table_events_waits_summary.h' --- a/storage/perfschema/table_events_waits_summary.h 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/table_events_waits_summary.h 2010-07-07 19:49:15 +0000 @@ -78,7 +78,7 @@ struct pos_events_waits_summary_by_threa { return (m_index_1 < thread_max); } inline bool has_more_view(void) - { return (m_index_2 <= VIEW_FILE); } + { return (m_index_2 <= VIEW_SOCKET); } inline void next_thread(void) { @@ -127,6 +127,7 @@ protected: void make_rwlock_row(PFS_thread *thread, PFS_rwlock_class *klass); void make_cond_row(PFS_thread *thread, PFS_cond_class *klass); void make_file_row(PFS_thread *thread, PFS_file_class *klass); + void make_socket_row(PFS_thread *thread, PFS_socket_class *klass); private: /** Table share lock. */ @@ -233,6 +234,7 @@ protected: virtual void make_rwlock_row(PFS_rwlock *pfs); virtual void make_cond_row(PFS_cond *pfs); virtual void make_file_row(PFS_file *pfs); + virtual void make_socket_row(PFS_socket *pfs); virtual int read_row_values(TABLE *table, unsigned char *buf, === modified file 'storage/perfschema/table_setup_instruments.cc' --- a/storage/perfschema/table_setup_instruments.cc 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/table_setup_instruments.cc 2010-07-07 19:49:15 +0000 @@ -88,6 +88,7 @@ int table_setup_instruments::rnd_next(vo PFS_rwlock_class *rwlock_class; PFS_cond_class *cond_class; PFS_file_class *file_class; + PFS_socket_class *socket_class; for (m_pos.set_at(&m_next_pos); m_pos.has_more_view(); @@ -133,6 +134,15 @@ int table_setup_instruments::rnd_next(vo return 0; } break; + case pos_setup_instruments::VIEW_SOCKET: + socket_class= find_socket_class(m_pos.m_index_2); + if (socket_class) + { + make_row(socket_class); + m_next_pos.set_after(&m_pos); + return 0; + } + break; } } @@ -145,6 +155,7 @@ int table_setup_instruments::rnd_pos(con PFS_rwlock_class *rwlock_class; PFS_cond_class *cond_class; PFS_file_class *file_class; + PFS_socket_class *socket_class; set_position(pos); @@ -184,6 +195,14 @@ int table_setup_instruments::rnd_pos(con return 0; } break; + case pos_setup_instruments::VIEW_SOCKET: + socket_class= find_socket_class(m_pos.m_index_2); + if (socket_class) + { + make_row(socket_class); + return 0; + } + break; } return HA_ERR_RECORD_DELETED; === modified file 'storage/perfschema/table_setup_instruments.h' --- a/storage/perfschema/table_setup_instruments.h 2010-06-03 13:30:54 +0000 +++ b/storage/perfschema/table_setup_instruments.h 2010-07-07 19:49:15 +0000 @@ -51,6 +51,7 @@ struct pos_setup_instruments : public PF /** Reverved for WL#4674, PERFORMANCE_SCHEMA Setup For Actors. */ static const uint VIEW_THREAD= 4; static const uint VIEW_FILE= 5; + static const uint VIEW_SOCKET= 6; pos_setup_instruments() : PFS_double_index(VIEW_MUTEX, 1) === added file 'storage/perfschema/table_socket_instances.cc' --- a/storage/perfschema/table_socket_instances.cc 1970-01-01 00:00:00 +0000 +++ b/storage/perfschema/table_socket_instances.cc 2010-07-07 19:49:15 +0000 @@ -0,0 +1,189 @@ +/* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ + +/** + @file storage/perfschema/table_socket_instances.cc + Table SOCKET_INSTANCES (implementation). +*/ + +#include "my_global.h" +#include "my_pthread.h" +#include "pfs_instr.h" +#include "pfs_column_types.h" +#include "pfs_column_values.h" +#include "table_socket_instances.h" +#include "pfs_global.h" + +THR_LOCK table_socket_instances::m_table_lock; + +static const TABLE_FIELD_TYPE field_types[]= +{ + { + { C_STRING_WITH_LEN("SOCKET_DESC") }, + { C_STRING_WITH_LEN("varchar(512)") }, + { NULL, 0} + }, + { + { C_STRING_WITH_LEN("EVENT_NAME") }, + { C_STRING_WITH_LEN("varchar(128)") }, + { NULL, 0} + }, + { + { C_STRING_WITH_LEN("IDENTITY") }, // TBD + { C_STRING_WITH_LEN("bigint(20)") }, + { NULL, 0} + }, + { + { C_STRING_WITH_LEN("OPEN_COUNT") }, + { C_STRING_WITH_LEN("int(10)") }, + { NULL, 0} + } +}; + +TABLE_FIELD_DEF +table_socket_instances::m_field_def= +{ 4, field_types }; + +PFS_engine_table_share +table_socket_instances::m_share= +{ + { C_STRING_WITH_LEN("SOCKET_INSTANCES") }, + &pfs_readonly_acl, + &table_socket_instances::create, + NULL, /* write_row */ + NULL, /* delete_all_rows */ + 1000, /* records */ + sizeof(PFS_simple_index), + &m_table_lock, + &m_field_def, + false /* checked */ +}; + +PFS_engine_table* table_socket_instances::create(void) +{ + return new table_socket_instances(); +} + +table_socket_instances::table_socket_instances() + : PFS_engine_table(&m_share, &m_pos), + m_row_exists(false), m_pos(0), m_next_pos(0) +{} + +void table_socket_instances::reset_position(void) +{ + m_pos.m_index= 0; + m_next_pos.m_index= 0; +} + +int table_socket_instances::rnd_next(void) +{ + PFS_socket *pfs; + + for (m_pos.set_at(&m_next_pos); + m_pos.m_index < socket_max; + m_pos.next()) + { + pfs= &socket_array[m_pos.m_index]; + if (pfs->m_lock.is_populated()) + { + make_row(pfs); + m_next_pos.set_after(&m_pos); + return 0; + } + } + + return HA_ERR_END_OF_FILE; +} + +int table_socket_instances::rnd_pos(const void *pos) +{ + PFS_socket *pfs; + + set_position(pos); + DBUG_ASSERT(m_pos.m_index < socket_max); + pfs= &socket_array[m_pos.m_index]; + + if (! pfs->m_lock.is_populated()) + return HA_ERR_RECORD_DELETED; + + make_row(pfs); + return 0; +} + +void table_socket_instances::make_row(PFS_socket *pfs) +{ + pfs_lock lock; + PFS_socket_class *safe_class; + + m_row_exists= false; + + /* Protect this reader against a socket delete */ + pfs->m_lock.begin_optimistic_lock(&lock); + + safe_class= sanitize_socket_class(pfs->m_class); + if (unlikely(safe_class == NULL)) + return; + + m_row.m_socket_desc= pfs->m_socket_desc; + m_row.m_socket_desc_length= pfs->m_socket_desc_length; + 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_open_count= pfs->m_socket_stat.m_open_count; + + if (pfs->m_lock.end_optimistic_lock(&lock)) + m_row_exists= true; +} + +int table_socket_instances::read_row_values(TABLE *table, + unsigned char *, + Field **fields, + bool read_all) +{ + Field *f; + + if (unlikely(! m_row_exists)) + return HA_ERR_RECORD_DELETED; + + /* Set the null bits */ + DBUG_ASSERT(table->s->null_bytes == 0); + + for (; (f= *fields) ; fields++) + { + if (read_all || bitmap_is_set(table->read_set, f->field_index)) + { + switch(f->field_index) + { + case 0: /* SOCKET_DESC */ + set_field_varchar_utf8(f, m_row.m_socket_desc, m_row.m_socket_desc_length); + break; + case 1: /* EVENT_NAME */ + set_field_varchar_utf8(f, m_row.m_event_name, m_row.m_event_name_length); + break; + case 2: /* IDENTITY */ + set_field_ulonglong(f, (intptr)m_row.m_identity); + break; + case 3: /* OPEN_COUNT */ + set_field_ulong(f, m_row.m_open_count); + break; + default: + DBUG_ASSERT(false); + } + } + } + + return 0; +} + === added file 'storage/perfschema/table_socket_instances.h' --- a/storage/perfschema/table_socket_instances.h 1970-01-01 00:00:00 +0000 +++ b/storage/perfschema/table_socket_instances.h 2010-07-07 19:49:15 +0000 @@ -0,0 +1,92 @@ +/* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ + +#ifndef TABLE_SOCKET_INSTANCES_H +#define TABLE_SOCKET_INSTANCES_H + +/** + @file storage/perfschema/table_socket_instances.h + Table SOCKET_INSTANCES (declarations). +*/ + +#include "pfs_column_types.h" +#include "pfs_engine_table.h" + +/** + @addtogroup Performance_schema_tables + @{ +*/ + +/** A row of PERFORMANCE_SCHEMA.SOCKET_INSTANCES. */ +struct row_socket_instances +{ + /** Column SOCKET_DESC. */ + const char *m_socket_desc; + /** Length in bytes of @c m_socket_desc. */ + uint m_socket_desc_length; + /** Column EVENT_NAME. */ + const char *m_event_name; + /** Length in bytes of @c m_event_name. */ + uint m_event_name_length; + /** IDENTITY TBD */ + const void *m_identity; + /** Column OPEN_COUNT. */ + uint m_open_count; +}; + +/** Table PERFORMANCE_SCHEMA.SOCKET_INSTANCES. */ +class table_socket_instances : public PFS_engine_table +{ +public: + /** Table share */ + static PFS_engine_table_share m_share; + static PFS_engine_table* create(); + + virtual int rnd_next(); + virtual int rnd_pos(const void *pos); + virtual void reset_position(void); + +private: + virtual int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all); + + table_socket_instances(); + +public: + ~table_socket_instances() + {} + +private: + void make_row(PFS_socket *pfs); + + /** Table share lock. */ + static THR_LOCK m_table_lock; + /** Fields definition. */ + static TABLE_FIELD_DEF m_field_def; + + /** Current row. */ + row_socket_instances m_row; + /** True is the current row exists. */ + bool m_row_exists; + /** Current position. */ + PFS_simple_index m_pos; + /** Next position. */ + PFS_simple_index m_next_pos; +}; + +/** @} */ +#endif --===============8879436788859966580== 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: 5c6c68e31d7180a02c400847e2e1e44b7cec55a9 # timestamp: 2010-07-07 14:49:52 -0500 # source_branch: bzr+ssh://cpowers@stripped/bzrroot\ # /server/mysql-next-mr/ # base_revision_id: chris.powers@stripped\ # 8kh2cotw90jo6ifw # # Begin bundle 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 --===============8879436788859966580==--