diff options
-rw-r--r-- | include/mysql_com.h | 3 | ||||
-rw-r--r-- | include/violite.h | 1 | ||||
-rw-r--r-- | libmysql/libmysql.c | 6 | ||||
-rw-r--r-- | server-tools/instance-manager/mysql_connection.cc | 4 | ||||
-rw-r--r-- | sql-common/client.c | 6 | ||||
-rw-r--r-- | sql/mysql_priv.h | 3 | ||||
-rw-r--r-- | sql/net_serv.cc | 16 | ||||
-rw-r--r-- | sql/set_var.cc | 4 | ||||
-rw-r--r-- | sql/sql_client.cc | 7 | ||||
-rw-r--r-- | sql/sql_parse.cc | 12 | ||||
-rw-r--r-- | sql/sql_repl.cc | 4 | ||||
-rw-r--r-- | vio/vio_priv.h | 1 | ||||
-rw-r--r-- | vio/viosocket.c | 42 |
13 files changed, 60 insertions, 49 deletions
diff --git a/include/mysql_com.h b/include/mysql_com.h index 93409b2ea1d..cea3a0739e3 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -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); 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 Currently it's used internally by manager.c diff --git a/include/violite.h b/include/violite.h index 63388c170c9..e0172008565 100644 --- a/include/violite.h +++ b/include/violite.h @@ -88,7 +88,6 @@ my_bool vio_peer_addr(Vio* vio, char *buf, uint16 *port); /* Remotes in_addr */ void vio_in_addr(Vio *vio, struct in_addr *in); my_bool vio_poll_read(Vio *vio,uint timeout); -void vio_timeout(Vio *vio,uint which, uint timeout); #ifdef HAVE_OPENSSL #include <openssl/opensslv.h> diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index e80684a1b1e..e426d2c549e 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -67,8 +67,6 @@ ulong net_buffer_length=8192; 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 @@ -1528,8 +1526,8 @@ my_bool STDCALL mysql_embedded(void) void my_net_local_init(NET *net) { net->max_packet= (uint) net_buffer_length; - net->read_timeout= (uint) net_read_timeout; - net->write_timeout=(uint) net_write_timeout; + my_net_set_read_timeout(net, CLIENT_NET_READ_TIMEOUT); + my_net_set_write_timeout(net, CLIENT_NET_WRITE_TIMEOUT); net->retry_count= 1; net->max_packet_size= max(net_buffer_length, max_allowed_packet); } diff --git a/server-tools/instance-manager/mysql_connection.cc b/server-tools/instance-manager/mysql_connection.cc index 3e1694e24ee..2b377d60ad0 100644 --- a/server-tools/instance-manager/mysql_connection.cc +++ b/server-tools/instance-manager/mysql_connection.cc @@ -112,8 +112,8 @@ C_MODE_START void my_net_local_init(NET *net) { net->max_packet= net_buffer_length; - net->read_timeout= net_read_timeout; - net->write_timeout= net_write_timeout; + my_net_set_read_timeout(net, (uint)net_read_timeout); + my_net_set_write_timeout(net, (uint)net_write_timeout); net->retry_count= net_retry_count; net->max_packet_size= max_allowed_packet; } diff --git a/sql-common/client.c b/sql-common/client.c index 3342db4bcfe..40512da0492 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -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 (mysql->options.read_timeout) - net->read_timeout= mysql->options.read_timeout; - vio_timeout(net->vio, 0, net->read_timeout); + my_net_set_read_timeout(net, mysql->options.read_timeout); /* If user set write_timeout, let it override the default */ if (mysql->options.write_timeout) - net->write_timeout= mysql->options.write_timeout; - vio_timeout(net->vio, 1, net->write_timeout); + my_net_set_write_timeout(net, mysql->options.write_timeout); if (mysql->options.max_allowed_packet) net->max_packet_size= mysql->options.max_allowed_packet; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 39f115f6fd5..b5bab84343d 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -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); 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 safeFree(x) { if(x) { my_free((gptr) x,MYF(0)); x = NULL; } } #define PREV_BITS(type,A) ((type) (((type) 1 << (A)) -1)) diff --git a/sql/net_serv.cc b/sql/net_serv.cc index ef929bc67f0..4b79e411a53 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -609,10 +609,10 @@ net_real_write(NET *net,const char *packet,ulong len) #ifndef NO_ALARM thr_alarm_init(&alarmed); if (net_blocking) - thr_alarm(&alarmed,(uint) net->write_timeout,&alarm_buff); + thr_alarm(&alarmed, net->write_timeout, &alarm_buff); #else alarmed=0; - /* Write timeout is set in net_set_write_timeout */ + /* Write timeout is set in my_net_set_write_timeout */ #endif /* NO_ALARM */ pos=(char*) packet; end=pos+len; @@ -624,7 +624,7 @@ net_real_write(NET *net,const char *packet,ulong len) #if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2)) 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 */ my_bool old_mode; while (vio_blocking(net->vio, TRUE, &old_mode) < 0) @@ -805,7 +805,7 @@ my_real_read(NET *net, ulong *complen) if (net_blocking) thr_alarm(&alarmed,net->read_timeout,&alarm_buff); #else - /* Read timeout is set in net_set_read_timeout */ + /* Read timeout is set in my_net_set_read_timeout */ #endif /* NO_ALARM */ pos = net->buff + net->where_b; /* net->packet -4 */ @@ -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)); net->read_timeout= timeout; #ifdef NO_ALARM @@ -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)); net->write_timeout= timeout; #ifdef NO_ALARM diff --git a/sql/set_var.cc b/sql/set_var.cc index 46c2a775d8a..bc3cc7b0688 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -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) { 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) { 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) diff --git a/sql/sql_client.cc b/sql/sql_client.cc index d6f1183806e..032a2e26e3a 100644 --- a/sql/sql_client.cc +++ b/sql/sql_client.cc @@ -28,8 +28,11 @@ void my_net_local_init(NET *net) { #ifndef EMBEDDED_LIBRARY 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->max_packet_size= max(global_system_variables.net_buffer_length, global_system_variables.max_allowed_packet); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 1b8bfd38fc4..8077adab452 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1137,8 +1137,8 @@ pthread_handler_t handle_one_connection(void *arg) net->no_send_error= 0; /* Use "connect_timeout" value during connection phase */ - net_set_read_timeout(net, connect_timeout); - net_set_write_timeout(net, connect_timeout); + my_net_set_read_timeout(net, connect_timeout); + my_net_set_write_timeout(net, connect_timeout); if ((error=check_connection(thd))) { // Wrong permissions @@ -1181,8 +1181,8 @@ pthread_handler_t handle_one_connection(void *arg) } /* Connect completed, set read/write timeouts back to tdefault */ - net_set_read_timeout(net, thd->variables.net_read_timeout); - net_set_write_timeout(net, thd->variables.net_write_timeout); + my_net_set_read_timeout(net, thd->variables.net_read_timeout); + my_net_set_write_timeout(net, thd->variables.net_write_timeout); while (!net->error && net->vio != 0 && !(thd->killed == THD::KILL_CONNECTION)) @@ -1531,7 +1531,7 @@ bool do_command(THD *thd) the client, the connection is closed or "net_wait_timeout" 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 @@ -1563,7 +1563,7 @@ bool do_command(THD *thd) } /* 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 diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index b451c612398..86ededd5587 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -94,7 +94,7 @@ static int send_file(THD *thd) the job */ 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 @@ -138,7 +138,7 @@ static int send_file(THD *thd) error = 0; err: - net_set_read_timeout(net, old_timeout); + my_net_set_read_timeout(net, old_timeout); if (fd >= 0) (void) my_close(fd, MYF(0)); if (errmsg) diff --git a/vio/vio_priv.h b/vio/vio_priv.h index 4a272e519a3..9036952d575 100644 --- a/vio/vio_priv.h +++ b/vio/vio_priv.h @@ -23,6 +23,7 @@ #include <violite.h> void vio_ignore_timeout(Vio *vio, uint which, uint timeout); +void vio_timeout(Vio *vio,uint which, uint timeout); #ifdef HAVE_OPENSSL #include "my_net.h" /* needed because of struct in_addr */ diff --git a/vio/viosocket.c b/vio/viosocket.c index 01abde6e0f7..84fdd6f57e4 100644 --- a/vio/viosocket.c +++ b/vio/viosocket.c @@ -204,13 +204,14 @@ int vio_fastsend(Vio * vio __attribute__((unused))) { #ifdef __WIN__ BOOL nodelay= 1; - r= setsockopt(vio->sd, IPPROTO_TCP, TCP_NODELAY, (const char*) &nodelay, - sizeof(nodelay)); #else 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)); -#endif /* __WIN__ */ + } if (r) { @@ -380,28 +381,39 @@ my_bool vio_poll_read(Vio *vio,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) + int r; + DBUG_ENTER("vio_timeout"); + { #ifdef __WIN__ - - /* Windows expects time in milliseconds as int. */ + /* Windows expects time in milliseconds as int */ int wait_timeout= (int) timeout * 1000; - -#else /* ! __WIN__ */ - +#else /* POSIX specifies time as struct timeval. */ struct timeval wait_timeout; wait_timeout.tv_sec= timeout; 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. */ - (void) setsockopt(vio->sd, SOL_SOCKET, which ? SO_SNDTIMEO : SO_RCVTIMEO, - (char*) &wait_timeout, sizeof(wait_timeout)); +#ifndef DBUG_OFF + if (r != 0) + 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 } |