Merge neptunus.(none):/home/msvensson/mysql/bug2845/my50-bug2845
into neptunus.(none):/home/msvensson/mysql/mysql-5.0
This commit is contained in:
commit
674ee5987c
@ -6,3 +6,11 @@ ERROR HY000: MySQL server has gone away
|
|||||||
select 3;
|
select 3;
|
||||||
3
|
3
|
||||||
3
|
3
|
||||||
|
select 1;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
select 2;
|
||||||
|
ERROR HY000: MySQL server has gone away
|
||||||
|
select 3;
|
||||||
|
3
|
||||||
|
3
|
||||||
|
@ -1 +1 @@
|
|||||||
--wait-timeout=2
|
--wait-timeout=1
|
||||||
|
@ -3,9 +3,25 @@
|
|||||||
#
|
#
|
||||||
--disable_reconnect
|
--disable_reconnect
|
||||||
select 1;
|
select 1;
|
||||||
# wait_timeout is 2, so we should get disconnected now
|
# wait_timeout is 1, so we should get disconnected now
|
||||||
--sleep 5
|
--sleep 2
|
||||||
|
# When the connection is closed in this way, the error code should
|
||||||
|
# be consistent see bug#2845 for an explanation
|
||||||
--error 2006
|
--error 2006
|
||||||
select 2;
|
select 2;
|
||||||
--enable_reconnect
|
--enable_reconnect
|
||||||
select 3;
|
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);
|
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)
|
void net_clear(NET *net)
|
||||||
{
|
{
|
||||||
|
int count;
|
||||||
DBUG_ENTER("net_clear");
|
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 */
|
/* The socket is ready */
|
||||||
my_bool old_mode;
|
if ((count= vio_read(net->vio, (char*) (net->buff),
|
||||||
if (!vio_blocking(net->vio, FALSE, &old_mode))
|
|
||||||
{
|
|
||||||
while ((count = vio_read(net->vio, (char*) (net->buff),
|
|
||||||
(uint32) net->max_packet)) > 0)
|
(uint32) net->max_packet)) > 0)
|
||||||
|
{
|
||||||
DBUG_PRINT("info",("skipped %d bytes from file: %s",
|
DBUG_PRINT("info",("skipped %d bytes from file: %s",
|
||||||
count, vio_description(net->vio)));
|
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->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
|
||||||
net->write_pos=net->buff;
|
net->write_pos=net->buff;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Flush write_buffer if not empty. */
|
/* Flush write_buffer if not empty. */
|
||||||
|
|
||||||
my_bool net_flush(NET *net)
|
my_bool net_flush(NET *net)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user