Commit ccec6f3e authored by unknown's avatar unknown

Merge neptunus.(none):/home/msvensson/mysql/bug2845/my50-bug2845

into  neptunus.(none):/home/msvensson/mysql/mysql-5.0

parents 682decc0 d430e247
......@@ -6,3 +6,11 @@ ERROR HY000: MySQL server has gone away
select 3;
3
3
select 1;
1
1
select 2;
ERROR HY000: MySQL server has gone away
select 3;
3
3
......@@ -3,9 +3,25 @@
#
--disable_reconnect
select 1;
# wait_timeout is 2, so we should get disconnected now
--sleep 5
# wait_timeout is 1, so we should get disconnected now
--sleep 2
# When the connection is closed in this way, the error code should
# be consistent see bug#2845 for an explanation
--error 2006
select 2;
--enable_reconnect
select 3;
# Do the same test as above on a TCP connection
connect (con1,127.0.0.1,root,,test,$MASTER_MYPORT,);
--disable_reconnect
select 1;
# wait_timeout is 1, so we should get disconnected now
--sleep 2
# When the connection is closed in this way, the error code should
# be consistent see bug#2845 for an explanation
--error 2006
select 2;
--enable_reconnect
select 3;
disconnect con1;
......@@ -194,30 +194,93 @@ my_bool net_realloc(NET *net, ulong length)
DBUG_RETURN(0);
}
/* Remove unwanted characters from connection */
/*
Check if there is any data to be read from the socket
SYNOPSIS
net_data_is_ready()
sd socket descriptor
DESCRIPTION
Check if there is any data to be read from the socket.
RETURN VALUES
0 No data to read
1 Data or EOF to read
*/
static my_bool net_data_is_ready(my_socket sd)
{
fd_set sfds;
struct timeval tv;
int res;
FD_ZERO(&sfds);
FD_SET(sd, &sfds);
tv.tv_sec= tv.tv_usec= 0;
if ((res= select(sd+1, &sfds, NULL, NULL, &tv)) < 0)
return FALSE;
else
return test(res ? FD_ISSET(sd, &sfds) : 0);
}
/*
Remove unwanted characters from connection
and check if disconnected
SYNOPSIS
net_clear()
net NET handler
DESCRIPTION
Read from socket until there is nothing more to read. Discard
what is read.
If there is anything when to read 'net_clear' is called this
normally indicates an error in the protocol.
When connection is properly closed (for TCP it means with
a FIN packet), then select() considers a socket "ready to read",
in the sense that there's EOF to read, but read() returns 0.
*/
void net_clear(NET *net)
{
int count;
DBUG_ENTER("net_clear");
#if !defined(EXTRA_DEBUG) && !defined(EMBEDDED_LIBRARY)
#if !defined(EMBEDDED_LIBRARY)
while(net_data_is_ready(net->vio->sd))
{
int count; /* One may get 'unused' warn */
my_bool old_mode;
if (!vio_blocking(net->vio, FALSE, &old_mode))
{
while ((count = vio_read(net->vio, (char*) (net->buff),
/* The socket is ready */
if ((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);
#ifdef EXTRA_DEBUG
fprintf(stderr,"skipped %d bytes from file: %s\n",
count, vio_description(net->vio));
#endif
}
else
{
DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
net->error= 2;
break;
}
}
#endif /* EXTRA_DEBUG */
#endif
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
net->write_pos=net->buff;
DBUG_VOID_RETURN;
}
/* Flush write_buffer if not empty. */
my_bool net_flush(NET *net)
......
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