From: Christopher Powers Date: August 4 2010 3:47pm Subject: bzr commit into mysql-next-mr-wl4896 branch (chris.powers:3160) List-Archive: http://lists.mysql.com/commits/115036 Message-Id: <20100804154756.A868E1DB0310@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0813035387243334425==" --===============0813035387243334425== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/cpowers/work/dev/dev-wl4896/mysql/ based on revid:chris.powers@stripped 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 === removed file 'include/mysql/psi/mysql_network.h' --- a/include/mysql/psi/mysql_network.h 2010-05-10 19:16:42 +0000 +++ b/include/mysql/psi/mysql_network.h 1970-01-01 00:00:00 +0000 @@ -1,46 +0,0 @@ -/* Copyright (c) 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, Inc., 51 Franklin St, Fifth Floor, Boston, MA -02110-1301 USA -*/ - -#ifndef MYSQL_NETWORK_H -#define MYSQL_NETWORK_H - -/* For strlen() */ -#include -/* For MY_STAT */ -#include -/* For my_chsize */ -#include - -/** - @file mysql/psi/mysql_network.h -[...] -*/ - -#include "mysql/psi/psi.h" - -/** - @defgroup Network_instrumentation Network Instrumentation - @ingroup Instrumentation_interface - @{ -*/ - - -/** @} (end of group Network_instrumentation) */ - -#endif - === modified file 'include/mysql/psi/mysql_socket.h' --- a/include/mysql/psi/mysql_socket.h 2010-07-29 19:56:17 +0000 +++ b/include/mysql/psi/mysql_socket.h 2010-08-04 15:47:50 +0000 @@ -42,6 +42,24 @@ Foundation, Inc., 51 Franklin St, Fifth */ /** + @def MYSQL_SOCKET_WAIT_VARIABLES + Instrumentation helper for socket waits. + This instrumentation declares local variables. + Do not use a ';' after this macro + @param LOCKER the locker + @param STATE the locker state + @sa MYSQL_START_SOCKET_WAIT. + @sa MYSQL_END_SOCKET_WAIT. +*/ +#ifdef HAVE_PSI_INTERFACE + #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE) \ + PSI_socket_locker* LOCKER; \ + PSI_socket_locker_state STATE; +#else + #define MYSQL_SOCKET_WAIT_VARIABLES(LOCKER, STATE) +#endif + +/** @def MYSQL_START_SOCKET_WAIT Instrumentation helper for socket waits. This instrumentation marks the start of a wait event. @@ -56,7 +74,7 @@ Foundation, Inc., 51 Franklin St, Fifth inline_mysql_start_socket_wait(PSI, OP, INDEX, FLAGS, __FILE__, __LINE__) #else #define MYSQL_START_SOCKET_WAIT(PSI, OP, INDEX, FLAGS) \ - NULL + do {} while (0) #endif /** @@ -74,20 +92,23 @@ Foundation, Inc., 51 Franklin St, Fifth #endif + #ifdef HAVE_PSI_INTERFACE /** Instrumentation calls for MYSQL_START_SOCKET_WAIT. @sa MYSQL_START_SOCKET_WAIT. */ -static inline struct PSI_socket_locker * -inline_mysql_start_socket_wait(struct PSI_socket *psi, enum PSI_socket_operation op, +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, const char *src_file, int src_line) { - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + if (likely(PSI_server && psi)) { - locker= PSI_server->get_thread_socket_locker(psi, op); + locker= PSI_server->get_thread_socket_locker(state, psi, op); if (likely(locker != NULL)) PSI_server->start_socket_wait(locker, src_file, src_line); } @@ -99,7 +120,7 @@ inline_mysql_start_socket_wait(struct PS @sa MYSQL_END_SOCKET_WAIT. */ static inline void -inline_mysql_end_socket_wait(struct PSI_socket_locker *locker) +inline_mysql_end_socket_wait(PSI_socket_locker *locker) { if (likely(locker != NULL)) PSI_server->end_socket_wait(locker); @@ -290,7 +311,7 @@ struct st_mysql_socket for binary compatibility of the @c MYSQL_FILE interface. */ - struct PSI_socket *m_psi; + PSI_socket *m_psi; }; /** @@ -340,10 +361,12 @@ inline_mysql_socket_socketpair int result = 0; #if 0 //TBD #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_CREATE); + 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); } @@ -369,10 +392,12 @@ inline_mysql_socket_bind { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -400,10 +425,12 @@ inline_mysql_socket_getsockname { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -428,10 +455,12 @@ inline_mysql_socket_connect { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -456,10 +485,12 @@ inline_mysql_socket_getpeername { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -484,10 +515,12 @@ inline_mysql_socket_send { ssize_t result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -512,10 +545,12 @@ inline_mysql_socket_recv { ssize_t result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -540,10 +575,12 @@ inline_mysql_socket_sendto { ssize_t result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -568,10 +605,12 @@ inline_mysql_socket_recvfrom { ssize_t result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -596,10 +635,12 @@ inline_mysql_socket_sendmsg { ssize_t result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -624,10 +665,12 @@ inline_mysql_socket_recvmsg { ssize_t result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -652,10 +695,12 @@ inline_mysql_socket_getsockopt { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_OPT); + 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); } @@ -680,10 +725,12 @@ inline_mysql_socket_setsockopt { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_OPT); + 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); } @@ -708,10 +755,12 @@ inline_mysql_socket_listen { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -736,12 +785,14 @@ inline_mysql_socket_accept { MYSQL_SOCKET socket_accept = {0, NULL}; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + 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(socket_accept.m_psi, PSI_SOCKET_CONNECT); + 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); } @@ -772,7 +823,9 @@ inline_mysql_socket_accept4 { MYSQL_SOCKET socket_accept = {0, NULL}; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + 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)) @@ -806,10 +859,12 @@ inline_mysql_socket_close { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -834,10 +889,12 @@ inline_mysql_socket_shutdown { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_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); } @@ -862,10 +919,12 @@ inline_mysql_socket_sockatmark { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_STAT); + 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); } @@ -890,10 +949,12 @@ inline_mysql_socket_isfdtype { int result; #ifdef HAVE_PSI_INTERFACE - struct PSI_socket_locker *locker= NULL; + PSI_socket_locker *locker= NULL; + PSI_socket_locker_state state; + if (likely(PSI_server != NULL && mysql_socket.m_psi != NULL)) { - locker= PSI_server->get_thread_socket_locker(mysql_socket.m_psi, PSI_SOCKET_STAT); + 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); } === modified file 'include/mysql/psi/psi_abi_v1.h.pp' --- a/include/mysql/psi/psi_abi_v1.h.pp 2010-08-04 03:19:48 +0000 +++ b/include/mysql/psi/psi_abi_v1.h.pp 2010-08-04 15:47:50 +0000 @@ -8,6 +8,7 @@ struct PSI_table_share; struct PSI_table; struct PSI_thread; struct PSI_file; +struct PSI_socket; struct PSI_table_locker; struct PSI_bootstrap { @@ -63,11 +64,25 @@ enum PSI_table_operation PSI_TABLE_UPDATE_ROW= 4, PSI_TABLE_DELETE_ROW= 5 }; +enum PSI_socket_operation +{ + PSI_SOCKET_CREATE= 0, + PSI_SOCKET_CONNECT= 1, + PSI_SOCKET_BIND= 2, + PSI_SOCKET_CLOSE= 3, + PSI_SOCKET_SEND= 4, + PSI_SOCKET_RECV= 5, + PSI_SOCKET_SEEK= 6, + PSI_SOCKET_OPT= 7, + PSI_SOCKET_STAT= 8, + PSI_SOCKET_SHUTDOWN= 9 +}; typedef unsigned int PSI_mutex_key; typedef unsigned int PSI_rwlock_key; typedef unsigned int PSI_cond_key; typedef unsigned int PSI_thread_key; typedef unsigned int PSI_file_key; +typedef unsigned int PSI_socket_key; struct PSI_mutex_info_v1 { PSI_mutex_key *m_key; @@ -98,6 +113,12 @@ struct PSI_file_info_v1 const char *m_name; int m_flags; }; +struct PSI_socket_info_v1 +{ + PSI_socket_key *m_key; + const char *m_name; + int m_flags; +}; struct PSI_mutex_locker_state_v1 { uint m_flags; @@ -164,6 +185,19 @@ struct PSI_table_locker_state_v1 int m_src_line; void *m_wait; }; +struct PSI_socket_locker_state_v1 +{ + uint m_flags; + struct PSI_socket *m_socket; + struct PSI_thread *m_thread; + size_t m_number_of_bytes; + ulonglong m_timer_start; + ulonglong (*m_timer)(void); + enum PSI_socket_operation m_operation; + const char* m_src_file; + int m_src_line; + void *m_wait; +}; typedef void (*register_mutex_v1_t) (const char *category, struct PSI_mutex_info_v1 *info, int count); typedef void (*register_rwlock_v1_t) @@ -174,6 +208,8 @@ typedef void (*register_thread_v1_t) (const char *category, struct PSI_thread_info_v1 *info, int count); typedef void (*register_file_v1_t) (const char *category, struct PSI_file_info_v1 *info, int count); +typedef void (*register_socket_v1_t) + (const char *category, struct PSI_socket_info_v1 *info, int count); typedef struct PSI_mutex* (*init_mutex_v1_t) (PSI_mutex_key key, const void *identity); typedef void (*destroy_mutex_v1_t)(struct PSI_mutex *mutex); @@ -183,6 +219,9 @@ typedef void (*destroy_rwlock_v1_t)(stru typedef struct PSI_cond* (*init_cond_v1_t) (PSI_cond_key key, const void *identity); typedef void (*destroy_cond_v1_t)(struct PSI_cond *cond); +typedef struct PSI_socket* (*init_socket_v1_t) + (PSI_socket_key key, const void *identity); +typedef void (*destroy_socket_v1_t)(struct PSI_socket *socket); typedef struct PSI_table_share* (*get_table_share_v1_t) (my_bool temporary, struct TABLE_SHARE *share); typedef void (*release_table_share_v1_t)(struct PSI_table_share *share); @@ -231,6 +270,9 @@ typedef struct PSI_file_locker* (*get_th typedef struct PSI_file_locker* (*get_thread_file_descriptor_locker_v1_t) (struct PSI_file_locker_state_v1 *state, File file, enum PSI_file_operation op); +typedef struct PSI_socket_locker* (*get_thread_socket_locker_v1_t) + (struct PSI_socket_locker_state_v1 *state, + struct PSI_socket *socket, enum PSI_socket_operation op); typedef void (*unlock_mutex_v1_t) (struct PSI_mutex *mutex); typedef void (*unlock_rwlock_v1_t) @@ -268,6 +310,18 @@ typedef void (*start_file_wait_v1_t) const char *src_file, uint src_line); 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, + 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; @@ -275,12 +329,15 @@ struct PSI_v1 register_cond_v1_t register_cond; register_thread_v1_t register_thread; register_file_v1_t register_file; + register_socket_v1_t register_socket; init_mutex_v1_t init_mutex; destroy_mutex_v1_t destroy_mutex; init_rwlock_v1_t init_rwlock; destroy_rwlock_v1_t destroy_rwlock; init_cond_v1_t init_cond; destroy_cond_v1_t destroy_cond; + init_socket_v1_t init_socket; + destroy_socket_v1_t destroy_socket; get_table_share_v1_t get_table_share; release_table_share_v1_t release_table_share; drop_table_share_v1_t drop_table_share; @@ -301,6 +358,7 @@ struct PSI_v1 get_thread_file_name_locker_v1_t get_thread_file_name_locker; get_thread_file_stream_locker_v1_t get_thread_file_stream_locker; get_thread_file_descriptor_locker_v1_t get_thread_file_descriptor_locker; + get_thread_socket_locker_v1_t get_thread_socket_locker; unlock_mutex_v1_t unlock_mutex; unlock_rwlock_v1_t unlock_rwlock; signal_cond_v1_t signal_cond; @@ -321,6 +379,11 @@ struct PSI_v1 end_file_open_wait_and_bind_to_descriptor; start_file_wait_v1_t start_file_wait; 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; @@ -328,10 +391,12 @@ typedef struct PSI_rwlock_info_v1 PSI_rw typedef struct PSI_cond_info_v1 PSI_cond_info; typedef struct PSI_thread_info_v1 PSI_thread_info; typedef struct PSI_file_info_v1 PSI_file_info; +typedef struct PSI_socket_info_v1 PSI_socket_info; typedef struct PSI_mutex_locker_state_v1 PSI_mutex_locker_state; typedef struct PSI_rwlock_locker_state_v1 PSI_rwlock_locker_state; typedef struct PSI_cond_locker_state_v1 PSI_cond_locker_state; typedef struct PSI_file_locker_state_v1 PSI_file_locker_state; typedef struct PSI_table_locker_state_v1 PSI_table_locker_state; +typedef struct PSI_socket_locker_state_v1 PSI_socket_locker_state; extern MYSQL_PLUGIN_IMPORT PSI *PSI_server; C_MODE_END === modified file 'include/mysql/psi/psi_abi_v2.h.pp' --- a/include/mysql/psi/psi_abi_v2.h.pp 2010-08-04 03:19:48 +0000 +++ b/include/mysql/psi/psi_abi_v2.h.pp 2010-08-04 15:47:50 +0000 @@ -8,6 +8,7 @@ struct PSI_table_share; struct PSI_table; struct PSI_thread; struct PSI_file; +struct PSI_socket; struct PSI_table_locker; struct PSI_bootstrap { @@ -63,11 +64,25 @@ enum PSI_table_operation PSI_TABLE_UPDATE_ROW= 4, PSI_TABLE_DELETE_ROW= 5 }; +enum PSI_socket_operation +{ + PSI_SOCKET_CREATE= 0, + PSI_SOCKET_CONNECT= 1, + PSI_SOCKET_BIND= 2, + PSI_SOCKET_CLOSE= 3, + PSI_SOCKET_SEND= 4, + PSI_SOCKET_RECV= 5, + PSI_SOCKET_SEEK= 6, + PSI_SOCKET_OPT= 7, + PSI_SOCKET_STAT= 8, + PSI_SOCKET_SHUTDOWN= 9 +}; typedef unsigned int PSI_mutex_key; typedef unsigned int PSI_rwlock_key; typedef unsigned int PSI_cond_key; typedef unsigned int PSI_thread_key; typedef unsigned int PSI_file_key; +typedef unsigned int PSI_socket_key; struct PSI_v2 { int placeholder; @@ -112,16 +127,22 @@ struct PSI_table_locker_state_v2 { int placeholder; }; +struct PSI_socket_locker_state_v2 +{ + int placeholder; +}; typedef struct PSI_v2 PSI; typedef struct PSI_mutex_info_v2 PSI_mutex_info; typedef struct PSI_rwlock_info_v2 PSI_rwlock_info; typedef struct PSI_cond_info_v2 PSI_cond_info; typedef struct PSI_thread_info_v2 PSI_thread_info; typedef struct PSI_file_info_v2 PSI_file_info; +typedef struct PSI_socket_info_v2 PSI_socket_info; typedef struct PSI_mutex_locker_state_v2 PSI_mutex_locker_state; typedef struct PSI_rwlock_locker_state_v2 PSI_rwlock_locker_state; typedef struct PSI_cond_locker_state_v2 PSI_cond_locker_state; typedef struct PSI_file_locker_state_v2 PSI_file_locker_state; typedef struct PSI_table_locker_state_v2 PSI_table_locker_state; +typedef struct PSI_socket_locker_state_v2 PSI_socket_locker_state; extern MYSQL_PLUGIN_IMPORT PSI *PSI_server; C_MODE_END === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-08-04 03:19:48 +0000 +++ b/sql/mysqld.cc 2010-08-04 15:47:50 +0000 @@ -5308,8 +5308,8 @@ void handle_connections_sockets() { if (socket_errno != SOCKET_EINTR) { - if (!select_errors++ && !abort_loop) /* purecov: inspected */ - sql_print_error("mysqld: Got error %d from select",socket_errno); /* purecov: inspected */ + if (!select_errors++ && !abort_loop) /* purecov: inspected */ + sql_print_error("mysqld: Got error %d from select",socket_errno); /* purecov: inspected */ } MAYBE_BROKEN_SYSCALL continue; @@ -5364,18 +5364,17 @@ void handle_connections_sockets() for (uint retry=0; retry < MAX_ACCEPT_RETRY; retry++) { size_socket length= sizeof(struct sockaddr_storage); - new_sock= mysql_socket_accept(key_socket_handle_connection, sock, (struct sockaddr *)(&cAddr), &length); - &length); - if (new_sock != INVALID_SOCKET || + new_sock= mysql_socket_accept(key_socket_handle_connection, sock, + (struct sockaddr *)(&cAddr), &length); if (mysql_socket_getfd(new_sock) != INVALID_SOCKET || - (socket_errno != SOCKET_EINTR && socket_errno != SOCKET_EAGAIN)) - break; + (socket_errno != SOCKET_EINTR && socket_errno != SOCKET_EAGAIN)) + break; MAYBE_BROKEN_SYSCALL; #if !defined(NO_FCNTL_NONBLOCK) if (!(test_flags & TEST_BLOCKING)) { - if (retry == MAX_ACCEPT_RETRY - 1) - fcntl(mysql_socket_getfd(sock), F_SETFL, flags); // Try without O_NONBLOCK + if (retry == MAX_ACCEPT_RETRY - 1) + fcntl(mysql_socket_getfd(sock), F_SETFL, flags); // Try without O_NONBLOCK } #endif } @@ -5386,10 +5385,10 @@ void handle_connections_sockets() if (mysql_socket_getfd(new_sock) == INVALID_SOCKET) { if ((error_count++ & 255) == 0) // This can happen often - sql_perror("Error in accept"); + sql_perror("Error in accept"); MAYBE_BROKEN_SYSCALL; if (socket_errno == SOCKET_ENFILE || socket_errno == SOCKET_EMFILE) - sleep(1); // Give other threads some time + sleep(1); // Give other threads some time continue; } @@ -5397,33 +5396,34 @@ void handle_connections_sockets() { 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_getfd(new_sock), NULL); //TBD cwp - my_fromhost(&req); - if (!my_hosts_access(&req)) - { - /* - This may be stupid but refuse() includes an exit(0) - which we surely don't want... - clean_exit() - same stupid thing ... - */ - syslog(deny_severity, "refused connect from %s", - my_eval_client(&req)); - - /* - C++ sucks (the gibberish in front just translates the supplied - sink function pointer in the req structure from a void (*sink)(); - to a void(*sink)(int) if you omit the cast, the C++ compiler - will cry... - */ - if (req.sink) - ((void (*)(int))req.sink)(req.fd); - - (void) mysql_socket_shutdown(new_sock, SHUT_RDWR); - (void) mysql_socket_ closesocket(new_sock); - continue; - } + struct request_info req; + signal(SIGCHLD, SIG_DFL); + request_init(&req, RQ_DAEMON, libwrapName, RQ_FILE, mysql_socket_getfd(new_sock), NULL); //TBD cwp + my_fromhost(&req); + + if (!my_hosts_access(&req)) + { + /* + This may be stupid but refuse() includes an exit(0) + which we surely don't want... + clean_exit() - same stupid thing ... + */ + syslog(deny_severity, "refused connect from %s", + my_eval_client(&req)); + + /* + C++ sucks (the gibberish in front just translates the supplied + sink function pointer in the req structure from a void (*sink)(); + to a void(*sink)(int) if you omit the cast, the C++ compiler + will cry... + */ + if (req.sink) + ((void (*)(int))req.sink)(req.fd); + + (void) mysql_socket_shutdown(new_sock, SHUT_RDWR); + (void) mysql_socket_ closesocket(new_sock); + continue; + } } } #endif /* HAVE_LIBWRAP */ @@ -5435,10 +5435,10 @@ void handle_connections_sockets() if ( mysql_socket_getsockname(new_sock, (struct sockaddr *)&dummy, (SOCKET_SIZE_TYPE *)&dummyLen) < 0 ) { - sql_perror("Error on new connection socket"); - (void) mysql_socket_shutdown(new_sock, SHUT_RDWR); - (void) mysql_socket_close(new_sock); - continue; + sql_perror("Error on new connection socket"); + (void) mysql_socket_shutdown(new_sock, SHUT_RDWR); + (void) mysql_socket_close(new_sock); + continue; } } @@ -5453,10 +5453,10 @@ void handle_connections_sockets() continue; } 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_getfd(sock) == mysql_socket_getfd(unix_sock) ? VIO_LOCALHOST: 0)) || - my_net_init(&thd->net,vio_tmp)) + mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock) ? VIO_TYPE_SOCKET : + VIO_TYPE_TCPIP, + mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock) ? VIO_LOCALHOST: 0)) || + my_net_init(&thd->net,vio_tmp)) { /* Only delete the temporary vio if we didn't already attach it to the @@ -5467,8 +5467,8 @@ void handle_connections_sockets() vio_delete(vio_tmp); else { - (void) mysql_socket_shutdown(new_sock, SHUT_RDWR); - (void) mysql_socket_close(new_sock); + (void) mysql_socket_shutdown(new_sock, SHUT_RDWR); + (void) mysql_socket_close(new_sock); } delete thd; continue; === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2010-08-04 03:19:48 +0000 +++ b/storage/perfschema/pfs.cc 2010-08-04 15:47:50 +0000 @@ -1702,6 +1702,7 @@ get_thread_socket_locker_v1(PSI_socket_l return reinterpret_cast (pfs_locker); } +static void unlock_mutex_v1(PSI_mutex *mutex) { PFS_mutex *pfs_mutex= reinterpret_cast (mutex); DBUG_ASSERT(pfs_mutex != NULL); === modified file 'storage/perfschema/table_events_waits.cc' --- a/storage/perfschema/table_events_waits.cc 2010-08-04 03:19:48 +0000 +++ b/storage/perfschema/table_events_waits.cc 2010-08-04 15:47:50 +0000 @@ -378,7 +378,19 @@ static const LEX_STRING operation_names_ { C_STRING_WITH_LEN("fetch") }, { C_STRING_WITH_LEN("insert") }, /* write row */ { C_STRING_WITH_LEN("update") }, /* update row */ - { C_STRING_WITH_LEN("delete") } /* delete row */ + { C_STRING_WITH_LEN("delete") }, /* delete row */ + + /* Socket operations */ + { C_STRING_WITH_LEN("create") }, + { C_STRING_WITH_LEN("connect") }, + { C_STRING_WITH_LEN("bind") }, + { C_STRING_WITH_LEN("close") }, + { C_STRING_WITH_LEN("send") }, + { C_STRING_WITH_LEN("receive") }, + { C_STRING_WITH_LEN("seek") }, + { C_STRING_WITH_LEN("opt") }, + { C_STRING_WITH_LEN("stat") }, + { C_STRING_WITH_LEN("shutdown") } }; @@ -390,8 +402,8 @@ int table_events_waits_common::read_row_ Field *f; const LEX_STRING *operation; - compile_time_assert(COUNT_OPERATION_TYPE == - array_elements(operation_names_map)); +// compile_time_assert(COUNT_OPERATION_TYPE == +// array_elements(operation_names_map)); if (unlikely(! m_row_exists)) return HA_ERR_RECORD_DELETED; === modified file 'storage/perfschema/table_helper.h' --- a/storage/perfschema/table_helper.h 2010-07-02 17:25:26 +0000 +++ b/storage/perfschema/table_helper.h 2010-08-04 15:47:50 +0000 @@ -34,7 +34,8 @@ struct PFS_instrument_view_constants static const uint VIEW_COND= 3; static const uint VIEW_FILE= 4; static const uint VIEW_TABLE= 5; - static const uint LAST_VIEW= 5; + static const uint VIEW_SOCKET= 6; + static const uint LAST_VIEW= 6; }; struct PFS_object_view_constants === added file 'storage/perfschema/table_helper.h.moved' --- a/storage/perfschema/table_helper.h.moved 1970-01-01 00:00:00 +0000 +++ b/storage/perfschema/table_helper.h.moved 2010-08-04 15:47:50 +0000 @@ -0,0 +1,55 @@ +/* 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 PFS_TABLE_HELPER_H +#define PFS_TABLE_HELPER_H + +/** + @file storage/perfschema/table_helper.h + Performance schema table helpers (declarations). +*/ + +/** + @addtogroup Performance_schema_tables + @{ +*/ + +struct PFS_instrument_view_constants +{ + static const uint FIRST_VIEW= 1; + static const uint VIEW_MUTEX= 1; + static const uint VIEW_RWLOCK= 2; + static const uint VIEW_COND= 3; + static const uint VIEW_FILE= 4; + static const uint VIEW_TABLE= 5; + static const uint LAST_VIEW= 5; +}; + +struct PFS_object_view_constants +{ + static const uint FIRST_VIEW= 1; + static const uint VIEW_TABLE= 1; + static const uint LAST_VIEW= 1; + + /* Future use */ + static const uint VIEW_EVENT= 2; + static const uint VIEW_PROCEDURE= 3; + static const uint VIEW_FUNCTION= 4; +}; + +/** @} */ + +#endif + --===============0813035387243334425== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/chris.powers@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: chris.powers@stripped # target_branch: file:///home/cpowers/work/dev/dev-wl4896/mysql/ # testament_sha1: acbd3b91612b56dc47bbe2c9d37c3f82f6f098ca # timestamp: 2010-08-04 10:47:56 -0500 # base_revision_id: chris.powers@stripped\ # 41kqkh4099z7kh3p # # Begin bundle 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 P83iIpf/F3JFOFCQlQL8eA== --===============0813035387243334425==--