Bug#2845 client fails to reconnect if using TCP/IP
- Change to use non blocking read to empty channel in case of too large sd number - Don't check for too large socket number on Windows. sql/net_serv.cc: Windows does not need protection from sd >= FD_SETSIZE, it uses an array to store the sd's it should read from. Change the handler for when "net_data_is_ready" returns -1 to perform nonblocking read to empty the net. Only include that handler if HAVE_POLL is not defined and not windows
This commit is contained in:
parent
742549c50b
commit
69012c7524
@ -229,8 +229,12 @@ static int net_data_is_ready(my_socket sd)
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
#ifndef __WIN__
|
||||||
|
/* Windows uses an _array_ of 64 fd's as default, so it's safe */
|
||||||
if (sd >= FD_SETSIZE)
|
if (sd >= FD_SETSIZE)
|
||||||
return -1;
|
return -1;
|
||||||
|
#define NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
|
||||||
|
#endif
|
||||||
|
|
||||||
FD_ZERO(&sfds);
|
FD_ZERO(&sfds);
|
||||||
FD_SET(sd, &sfds);
|
FD_SET(sd, &sfds);
|
||||||
@ -271,7 +275,7 @@ void net_clear(NET *net)
|
|||||||
int count, ready;
|
int count, ready;
|
||||||
DBUG_ENTER("net_clear");
|
DBUG_ENTER("net_clear");
|
||||||
#if !defined(EMBEDDED_LIBRARY)
|
#if !defined(EMBEDDED_LIBRARY)
|
||||||
while((ready= net_data_is_ready(net->vio->sd)) != 0)
|
while((ready= net_data_is_ready(net->vio->sd)) > 0)
|
||||||
{
|
{
|
||||||
/* The socket is ready */
|
/* The socket is ready */
|
||||||
if ((count= vio_read(net->vio, (char*) (net->buff),
|
if ((count= vio_read(net->vio, (char*) (net->buff),
|
||||||
@ -286,15 +290,27 @@ void net_clear(NET *net)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* No data to read and 'net_data_is_ready' returned "don't know" */
|
|
||||||
if (ready == -1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
|
DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
|
||||||
net->error= 2;
|
net->error= 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
|
||||||
|
/* 'net_data_is_ready' returned "don't know" */
|
||||||
|
if (ready == -1)
|
||||||
|
{
|
||||||
|
/* Read unblocking to clear net */
|
||||||
|
my_bool old_mode;
|
||||||
|
if (!vio_blocking(net->vio, FALSE, &old_mode))
|
||||||
|
{
|
||||||
|
while ((count= vio_read(net->vio, (char*) (net->buff),
|
||||||
|
(uint32) net->max_packet)) > 0)
|
||||||
|
DBUG_PRINT("info",("skipped %d bytes from file: %s",
|
||||||
|
count, vio_description(net->vio)));
|
||||||
|
vio_blocking(net->vio, TRUE, &old_mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
|
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
|
||||||
net->write_pos=net->buff;
|
net->write_pos=net->buff;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user