Commit 945f3c2c authored by unknown's avatar unknown

Bug#26664 test suite times out on OS X 64bit

 - The "mysql client in mysqld"(which is used by
   replication and federated) should use alarms instead of setting
   socket timeout value if the rest of the server uses alarm. By
   always calling 'my_net_set_write_timeout'
   or 'my_net_set_read_timeout' when changing the timeout value(s), the
   selection whether to use alarms or timeouts will be handled by
   ifdef's in those two functions. 
 - Move declaration of 'vio_timeout' into "vio_priv.h"


include/mysql_com.h:
  Move the net_set_*_timeout function declarations to mysql_com.h and
  rename to my_net_set_*_timeout to avoid name clashes
include/violite.h:
  Move declaration of 'vio_timeout' to vio_priv.h (to make
  the function as private as possible)
libmysql/libmysql.c:
  Use my_net_read_timeout or my_net_write_timeout when setting
  the timeouts. Move the global variables for my_net_read/my_write_timeout
  into the only place where they are used. Thus removing them...
server-tools/instance-manager/mysql_connection.cc:
  Use my_net_read_timeout or my_net_write_timeout when setting the timeouts
sql-common/client.c:
  Use my_net_read_timeout or my_net_write_timeout when setting the timeouts
sql/mysql_priv.h:
  Move the net_set_*_timeout function declarations to mysql_com.h
sql/net_serv.cc:
  No need to cast the net->write_timeout value from "uint" to "uint"
sql/set_var.cc:
  Rename net_set_*_timeout to my_net_set_*_timeout
sql/sql_client.cc:
  Use my_net_read_timeout or my_net_write_timeout when setting the timeouts
sql/sql_parse.cc:
  Rename net_set_*_timeout to my_net_set_*_timeout
sql/sql_repl.cc:
  Rename net_set_*_timeout to my_net_set_*_timeout
vio/vio_priv.h:
  Move declaration of 'vio_timeout' to vio_priv.h
vio/viosocket.c:
  Cleanup 'vio_timeout'
   - Use "const void*" on POSIX and "const char*" on windows for
     setsockopt
   - Add DBUG_PRINT's
   - Add comment about why we don't have an implementation of
    vio_timeout for platforms not supporting SO_SNDTIMEO or SO_RCVTIMEO
parent 0ab74abc
...@@ -345,6 +345,9 @@ my_bool net_write_command(NET *net,unsigned char command, ...@@ -345,6 +345,9 @@ my_bool net_write_command(NET *net,unsigned char command,
int net_real_write(NET *net,const char *packet,unsigned long len); int net_real_write(NET *net,const char *packet,unsigned long len);
unsigned long my_net_read(NET *net); unsigned long my_net_read(NET *net);
void my_net_set_write_timeout(NET *net, uint timeout);
void my_net_set_read_timeout(NET *net, uint timeout);
/* /*
The following function is not meant for normal usage The following function is not meant for normal usage
Currently it's used internally by manager.c Currently it's used internally by manager.c
......
...@@ -88,7 +88,6 @@ my_bool vio_peer_addr(Vio* vio, char *buf, uint16 *port); ...@@ -88,7 +88,6 @@ my_bool vio_peer_addr(Vio* vio, char *buf, uint16 *port);
/* Remotes in_addr */ /* Remotes in_addr */
void vio_in_addr(Vio *vio, struct in_addr *in); void vio_in_addr(Vio *vio, struct in_addr *in);
my_bool vio_poll_read(Vio *vio,uint timeout); my_bool vio_poll_read(Vio *vio,uint timeout);
void vio_timeout(Vio *vio,uint which, uint timeout);
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
#include <openssl/opensslv.h> #include <openssl/opensslv.h>
......
...@@ -67,8 +67,6 @@ ...@@ -67,8 +67,6 @@
ulong net_buffer_length=8192; ulong net_buffer_length=8192;
ulong max_allowed_packet= 1024L*1024L*1024L; ulong max_allowed_packet= 1024L*1024L*1024L;
ulong net_read_timeout= CLIENT_NET_READ_TIMEOUT;
ulong net_write_timeout= CLIENT_NET_WRITE_TIMEOUT;
#ifdef EMBEDDED_LIBRARY #ifdef EMBEDDED_LIBRARY
...@@ -1528,8 +1526,8 @@ my_bool STDCALL mysql_embedded(void) ...@@ -1528,8 +1526,8 @@ my_bool STDCALL mysql_embedded(void)
void my_net_local_init(NET *net) void my_net_local_init(NET *net)
{ {
net->max_packet= (uint) net_buffer_length; net->max_packet= (uint) net_buffer_length;
net->read_timeout= (uint) net_read_timeout; my_net_set_read_timeout(net, CLIENT_NET_READ_TIMEOUT);
net->write_timeout=(uint) net_write_timeout; my_net_set_write_timeout(net, CLIENT_NET_WRITE_TIMEOUT);
net->retry_count= 1; net->retry_count= 1;
net->max_packet_size= max(net_buffer_length, max_allowed_packet); net->max_packet_size= max(net_buffer_length, max_allowed_packet);
} }
......
...@@ -112,8 +112,8 @@ C_MODE_START ...@@ -112,8 +112,8 @@ C_MODE_START
void my_net_local_init(NET *net) void my_net_local_init(NET *net)
{ {
net->max_packet= net_buffer_length; net->max_packet= net_buffer_length;
net->read_timeout= net_read_timeout; my_net_set_read_timeout(net, (uint)net_read_timeout);
net->write_timeout= net_write_timeout; my_net_set_write_timeout(net, (uint)net_write_timeout);
net->retry_count= net_retry_count; net->retry_count= net_retry_count;
net->max_packet_size= max_allowed_packet; net->max_packet_size= max_allowed_packet;
} }
......
...@@ -2047,13 +2047,11 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, ...@@ -2047,13 +2047,11 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
/* If user set read_timeout, let it override the default */ /* If user set read_timeout, let it override the default */
if (mysql->options.read_timeout) if (mysql->options.read_timeout)
net->read_timeout= mysql->options.read_timeout; my_net_set_read_timeout(net, mysql->options.read_timeout);
vio_timeout(net->vio, 0, net->read_timeout);
/* If user set write_timeout, let it override the default */ /* If user set write_timeout, let it override the default */
if (mysql->options.write_timeout) if (mysql->options.write_timeout)
net->write_timeout= mysql->options.write_timeout; my_net_set_write_timeout(net, mysql->options.write_timeout);
vio_timeout(net->vio, 1, net->write_timeout);
if (mysql->options.max_allowed_packet) if (mysql->options.max_allowed_packet)
net->max_packet_size= mysql->options.max_allowed_packet; net->max_packet_size= mysql->options.max_allowed_packet;
......
...@@ -89,9 +89,6 @@ void kill_one_thread(THD *thd, ulong id, bool only_kill_query); ...@@ -89,9 +89,6 @@ void kill_one_thread(THD *thd, ulong id, bool only_kill_query);
bool net_request_file(NET* net, const char* fname); bool net_request_file(NET* net, const char* fname);
char* query_table_status(THD *thd,const char *db,const char *table_name); char* query_table_status(THD *thd,const char *db,const char *table_name);
void net_set_write_timeout(NET *net, uint timeout);
void net_set_read_timeout(NET *net, uint timeout);
#define x_free(A) { my_free((gptr) (A),MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR)); } #define x_free(A) { my_free((gptr) (A),MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR)); }
#define safeFree(x) { if(x) { my_free((gptr) x,MYF(0)); x = NULL; } } #define safeFree(x) { if(x) { my_free((gptr) x,MYF(0)); x = NULL; } }
#define PREV_BITS(type,A) ((type) (((type) 1 << (A)) -1)) #define PREV_BITS(type,A) ((type) (((type) 1 << (A)) -1))
......
...@@ -609,10 +609,10 @@ net_real_write(NET *net,const char *packet,ulong len) ...@@ -609,10 +609,10 @@ net_real_write(NET *net,const char *packet,ulong len)
#ifndef NO_ALARM #ifndef NO_ALARM
thr_alarm_init(&alarmed); thr_alarm_init(&alarmed);
if (net_blocking) if (net_blocking)
thr_alarm(&alarmed,(uint) net->write_timeout,&alarm_buff); thr_alarm(&alarmed, net->write_timeout, &alarm_buff);
#else #else
alarmed=0; alarmed=0;
/* Write timeout is set in net_set_write_timeout */ /* Write timeout is set in my_net_set_write_timeout */
#endif /* NO_ALARM */ #endif /* NO_ALARM */
pos=(char*) packet; end=pos+len; pos=(char*) packet; end=pos+len;
...@@ -624,7 +624,7 @@ net_real_write(NET *net,const char *packet,ulong len) ...@@ -624,7 +624,7 @@ net_real_write(NET *net,const char *packet,ulong len)
#if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2)) #if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2))
if ((interrupted || length==0) && !thr_alarm_in_use(&alarmed)) if ((interrupted || length==0) && !thr_alarm_in_use(&alarmed))
{ {
if (!thr_alarm(&alarmed,(uint) net->write_timeout,&alarm_buff)) if (!thr_alarm(&alarmed, net->write_timeout, &alarm_buff))
{ /* Always true for client */ { /* Always true for client */
my_bool old_mode; my_bool old_mode;
while (vio_blocking(net->vio, TRUE, &old_mode) < 0) while (vio_blocking(net->vio, TRUE, &old_mode) < 0)
...@@ -805,7 +805,7 @@ my_real_read(NET *net, ulong *complen) ...@@ -805,7 +805,7 @@ my_real_read(NET *net, ulong *complen)
if (net_blocking) if (net_blocking)
thr_alarm(&alarmed,net->read_timeout,&alarm_buff); thr_alarm(&alarmed,net->read_timeout,&alarm_buff);
#else #else
/* Read timeout is set in net_set_read_timeout */ /* Read timeout is set in my_net_set_read_timeout */
#endif /* NO_ALARM */ #endif /* NO_ALARM */
pos = net->buff + net->where_b; /* net->packet -4 */ pos = net->buff + net->where_b; /* net->packet -4 */
...@@ -1117,9 +1117,9 @@ my_net_read(NET *net) ...@@ -1117,9 +1117,9 @@ my_net_read(NET *net)
} }
void net_set_read_timeout(NET *net, uint timeout) void my_net_set_read_timeout(NET *net, uint timeout)
{ {
DBUG_ENTER("net_set_read_timeout"); DBUG_ENTER("my_net_set_read_timeout");
DBUG_PRINT("enter", ("timeout: %d", timeout)); DBUG_PRINT("enter", ("timeout: %d", timeout));
net->read_timeout= timeout; net->read_timeout= timeout;
#ifdef NO_ALARM #ifdef NO_ALARM
...@@ -1129,9 +1129,9 @@ void net_set_read_timeout(NET *net, uint timeout) ...@@ -1129,9 +1129,9 @@ void net_set_read_timeout(NET *net, uint timeout)
} }
void net_set_write_timeout(NET *net, uint timeout) void my_net_set_write_timeout(NET *net, uint timeout)
{ {
DBUG_ENTER("net_set_write_timeout"); DBUG_ENTER("my_net_set_write_timeout");
DBUG_PRINT("enter", ("timeout: %d", timeout)); DBUG_PRINT("enter", ("timeout: %d", timeout));
net->write_timeout= timeout; net->write_timeout= timeout;
#ifdef NO_ALARM #ifdef NO_ALARM
......
...@@ -1282,14 +1282,14 @@ static int check_completion_type(THD *thd, set_var *var) ...@@ -1282,14 +1282,14 @@ static int check_completion_type(THD *thd, set_var *var)
static void fix_net_read_timeout(THD *thd, enum_var_type type) static void fix_net_read_timeout(THD *thd, enum_var_type type)
{ {
if (type != OPT_GLOBAL) if (type != OPT_GLOBAL)
net_set_read_timeout(&thd->net, thd->variables.net_read_timeout); my_net_set_read_timeout(&thd->net, thd->variables.net_read_timeout);
} }
static void fix_net_write_timeout(THD *thd, enum_var_type type) static void fix_net_write_timeout(THD *thd, enum_var_type type)
{ {
if (type != OPT_GLOBAL) if (type != OPT_GLOBAL)
net_set_write_timeout(&thd->net, thd->variables.net_write_timeout); my_net_set_write_timeout(&thd->net, thd->variables.net_write_timeout);
} }
static void fix_net_retry_count(THD *thd, enum_var_type type) static void fix_net_retry_count(THD *thd, enum_var_type type)
......
...@@ -28,8 +28,11 @@ void my_net_local_init(NET *net) ...@@ -28,8 +28,11 @@ void my_net_local_init(NET *net)
{ {
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
net->max_packet= (uint) global_system_variables.net_buffer_length; net->max_packet= (uint) global_system_variables.net_buffer_length;
net->read_timeout= (uint) global_system_variables.net_read_timeout;
net->write_timeout=(uint) global_system_variables.net_write_timeout; my_net_set_read_timeout(net, (uint)global_system_variables.net_read_timeout);
my_net_set_write_timeout(net,
(uint)global_system_variables.net_write_timeout);
net->retry_count= (uint) global_system_variables.net_retry_count; net->retry_count= (uint) global_system_variables.net_retry_count;
net->max_packet_size= max(global_system_variables.net_buffer_length, net->max_packet_size= max(global_system_variables.net_buffer_length,
global_system_variables.max_allowed_packet); global_system_variables.max_allowed_packet);
......
...@@ -1137,8 +1137,8 @@ pthread_handler_t handle_one_connection(void *arg) ...@@ -1137,8 +1137,8 @@ pthread_handler_t handle_one_connection(void *arg)
net->no_send_error= 0; net->no_send_error= 0;
/* Use "connect_timeout" value during connection phase */ /* Use "connect_timeout" value during connection phase */
net_set_read_timeout(net, connect_timeout); my_net_set_read_timeout(net, connect_timeout);
net_set_write_timeout(net, connect_timeout); my_net_set_write_timeout(net, connect_timeout);
if ((error=check_connection(thd))) if ((error=check_connection(thd)))
{ // Wrong permissions { // Wrong permissions
...@@ -1181,8 +1181,8 @@ pthread_handler_t handle_one_connection(void *arg) ...@@ -1181,8 +1181,8 @@ pthread_handler_t handle_one_connection(void *arg)
} }
/* Connect completed, set read/write timeouts back to tdefault */ /* Connect completed, set read/write timeouts back to tdefault */
net_set_read_timeout(net, thd->variables.net_read_timeout); my_net_set_read_timeout(net, thd->variables.net_read_timeout);
net_set_write_timeout(net, thd->variables.net_write_timeout); my_net_set_write_timeout(net, thd->variables.net_write_timeout);
while (!net->error && net->vio != 0 && while (!net->error && net->vio != 0 &&
!(thd->killed == THD::KILL_CONNECTION)) !(thd->killed == THD::KILL_CONNECTION))
...@@ -1531,7 +1531,7 @@ bool do_command(THD *thd) ...@@ -1531,7 +1531,7 @@ bool do_command(THD *thd)
the client, the connection is closed or "net_wait_timeout" the client, the connection is closed or "net_wait_timeout"
number of seconds has passed number of seconds has passed
*/ */
net_set_read_timeout(net, thd->variables.net_wait_timeout); my_net_set_read_timeout(net, thd->variables.net_wait_timeout);
thd->clear_error(); // Clear error message thd->clear_error(); // Clear error message
...@@ -1563,7 +1563,7 @@ bool do_command(THD *thd) ...@@ -1563,7 +1563,7 @@ bool do_command(THD *thd)
} }
/* Restore read timeout value */ /* Restore read timeout value */
net_set_read_timeout(net, thd->variables.net_read_timeout); my_net_set_read_timeout(net, thd->variables.net_read_timeout);
/* /*
packet_length contains length of data, as it was stored in packet packet_length contains length of data, as it was stored in packet
......
...@@ -94,7 +94,7 @@ static int send_file(THD *thd) ...@@ -94,7 +94,7 @@ static int send_file(THD *thd)
the job the job
*/ */
old_timeout= net->read_timeout; old_timeout= net->read_timeout;
net_set_read_timeout(net, thd->variables.net_wait_timeout); my_net_set_read_timeout(net, thd->variables.net_wait_timeout);
/* /*
We need net_flush here because the client will not know it needs to send We need net_flush here because the client will not know it needs to send
...@@ -138,7 +138,7 @@ static int send_file(THD *thd) ...@@ -138,7 +138,7 @@ static int send_file(THD *thd)
error = 0; error = 0;
err: err:
net_set_read_timeout(net, old_timeout); my_net_set_read_timeout(net, old_timeout);
if (fd >= 0) if (fd >= 0)
(void) my_close(fd, MYF(0)); (void) my_close(fd, MYF(0));
if (errmsg) if (errmsg)
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <violite.h> #include <violite.h>
void vio_ignore_timeout(Vio *vio, uint which, uint timeout); void vio_ignore_timeout(Vio *vio, uint which, uint timeout);
void vio_timeout(Vio *vio,uint which, uint timeout);
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
#include "my_net.h" /* needed because of struct in_addr */ #include "my_net.h" /* needed because of struct in_addr */
......
...@@ -204,13 +204,14 @@ int vio_fastsend(Vio * vio __attribute__((unused))) ...@@ -204,13 +204,14 @@ int vio_fastsend(Vio * vio __attribute__((unused)))
{ {
#ifdef __WIN__ #ifdef __WIN__
BOOL nodelay= 1; BOOL nodelay= 1;
r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (const char*) &nodelay,
sizeof(nodelay));
#else #else
int nodelay = 1; int nodelay = 1;
r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (void*) &nodelay, #endif
r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY,
IF_WIN(const char*, void*) &nodelay,
sizeof(nodelay)); sizeof(nodelay));
#endif /* __WIN__ */
} }
if (r) if (r)
{ {
...@@ -380,28 +381,39 @@ my_bool vio_poll_read(Vio *vio,uint timeout) ...@@ -380,28 +381,39 @@ my_bool vio_poll_read(Vio *vio,uint timeout)
void vio_timeout(Vio *vio, uint which, uint timeout) void vio_timeout(Vio *vio, uint which, uint timeout)
{ {
/* TODO: some action should be taken if socket timeouts are not supported. */
#if defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO) #if defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO)
int r;
DBUG_ENTER("vio_timeout");
{
#ifdef __WIN__ #ifdef __WIN__
/* Windows expects time in milliseconds as int */
/* Windows expects time in milliseconds as int. */
int wait_timeout= (int) timeout * 1000; int wait_timeout= (int) timeout * 1000;
#else
#else /* ! __WIN__ */
/* POSIX specifies time as struct timeval. */ /* POSIX specifies time as struct timeval. */
struct timeval wait_timeout; struct timeval wait_timeout;
wait_timeout.tv_sec= timeout; wait_timeout.tv_sec= timeout;
wait_timeout.tv_usec= 0; wait_timeout.tv_usec= 0;
#endif
r= setsockopt(vio->sd, SOL_SOCKET, which ? SO_SNDTIMEO : SO_RCVTIMEO,
IF_WIN(const char*, const void*)&wait_timeout,
sizeof(wait_timeout));
#endif /* ! __WIN__ */ }
/* TODO: return value should be checked. */ #ifndef DBUG_OFF
(void) setsockopt(vio->sd, SOL_SOCKET, which ? SO_SNDTIMEO : SO_RCVTIMEO, if (r != 0)
(char*) &wait_timeout, sizeof(wait_timeout)); DBUG_PRINT("error", ("setsockopt failed: %d, errno: %d", r, socket_errno));
#endif
#endif /* defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO) */ DBUG_VOID_RETURN;
#else
/*
Platforms not suporting setting of socket timeout should either use
thr_alarm or just run without read/write timeout(s)
*/
#endif
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment