Commit a8a5e98e authored by unknown's avatar unknown
Browse files

Fixes bug #5588. vio_was_interrupted() function was added to detect

read timeout properly on win32.


include/my_global.h:
  Added win32 specific socket timeout error code.
include/violite.h:
  Added vio_was_interrupted function that returns true if operation was
  not completed due to timeout.
sql/mini_client.cc:
  added a check that replication read was not completed due to timeout.
sql/net_serv.cc:
  net->last_errno should be equal to ER_NET_READ_INTERRUPTED in case if read
  operation was not completed due to timeout.
vio/vio.c:
  added initialization code for vio_was_interrupted() function.
vio/viosocket.c:
  Added vio_was_interrupted function that returns true if operation was
  not completed due to timeout.
parent f658a7a7
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -760,6 +760,7 @@ typedef off_t os_off_t;
#define socket_errno	WSAGetLastError()
#define SOCKET_EINTR	WSAEINTR
#define SOCKET_EAGAIN	WSAEINPROGRESS
#define SOCKET_ETIMEDOUT WSAETIMEDOUT
#define SOCKET_EWOULDBLOCK WSAEINPROGRESS
#define SOCKET_ENFILE	ENFILE
#define SOCKET_EMFILE	EMFILE
@@ -767,6 +768,7 @@ typedef off_t os_off_t;
#define socket_errno	sock_errno()
#define SOCKET_EINTR	SOCEINTR
#define SOCKET_EAGAIN	SOCEINPROGRESS
#define SOCKET_ETIMEDOUT SOCKET_EINTR
#define SOCKET_EWOULDBLOCK SOCEWOULDBLOCK
#define SOCKET_ENFILE	SOCENFILE
#define SOCKET_EMFILE	SOCEMFILE
@@ -776,6 +778,7 @@ typedef off_t os_off_t;
#define closesocket(A)	close(A)
#define SOCKET_EINTR	EINTR
#define SOCKET_EAGAIN	EAGAIN
#define SOCKET_ETIMEDOUT SOCKET_EINTR
#define SOCKET_EWOULDBLOCK EWOULDBLOCK
#define SOCKET_ENFILE	ENFILE
#define SOCKET_EMFILE	EMFILE
+4 −0
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@ int vio_fastsend(Vio *vio);
int	vio_keepalive(Vio *vio, my_bool	onoff);
/* Whenever we should retry the last read/write operation. */
my_bool	vio_should_retry(Vio *vio);
/* Check that operation was timed out */
my_bool	vio_was_interrupted(Vio *vio);
/* Short text description of the socket for those, who are curious.. */
const char* vio_description(Vio *vio);
/* Return the type of the connection */
@@ -134,6 +136,7 @@ Vio *new_VioSSL(struct st_VioSSLAcceptorFd *fd, Vio *sd, int state);
#define vio_fastsend(vio)			(vio)->fastsend(vio)
#define vio_keepalive(vio, set_keep_alive)	(vio)->viokeepalive(vio, set_keep_alive)
#define vio_should_retry(vio) 			(vio)->should_retry(vio)
#define vio_was_interrupted(vio) 		(vio)->was_interrupted(vio)
#define vio_close(vio)				((vio)->vioclose)(vio)
#define vio_peer_addr(vio, buf, prt)		(vio)->peer_addr(vio, buf, prt)
#define vio_in_addr(vio, in)			(vio)->in_addr(vio, in)
@@ -175,6 +178,7 @@ struct st_vio
  my_bool (*peer_addr)(Vio*, char *, uint16*);
  void    (*in_addr)(Vio*, struct in_addr*);
  my_bool (*should_retry)(Vio*);
  my_bool (*was_interrupted)(Vio*);
  int     (*vioclose)(Vio*);
  void	  (*timeout)(Vio*, unsigned int timeout);
  void	  *ssl_arg;
+1 −1
Original line number Diff line number Diff line
@@ -399,7 +399,7 @@ mc_net_safe_read(MYSQL *mysql)
  {
    DBUG_PRINT("error",("Wrong connection or packet. fd: %s  len: %d",
			vio_description(net->vio),len));
    if (socket_errno != SOCKET_EINTR)
    if (!vio_was_interrupted(net->vio))
    {
      mc_end_server(mysql);
      if (net->last_errno != ER_NET_PACKET_TOO_LARGE)
+1 −1
Original line number Diff line number Diff line
@@ -700,7 +700,7 @@ my_real_read(NET *net, ulong *complen)
	  len= packet_error;
	  net->error=2;				/* Close socket */
#ifdef MYSQL_SERVER
	  net->last_errno= (interrupted ? ER_NET_READ_INTERRUPTED :
	  net->last_errno= (vio_was_interrupted(net->vio) ? ER_NET_READ_INTERRUPTED :
			    ER_NET_READ_ERROR);
#endif
	  goto end;
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ void vio_reset(Vio* vio, enum enum_vio_type type,
    vio->fastsend	=vio_ssl_fastsend;
    vio->viokeepalive	=vio_ssl_keepalive;
    vio->should_retry	=vio_ssl_should_retry;
    vio->was_interrupted=vio_was_interrupted;
    vio->vioclose	=vio_ssl_close;
    vio->peer_addr	=vio_ssl_peer_addr;
    vio->in_addr	=vio_ssl_in_addr;
@@ -67,6 +68,7 @@ void vio_reset(Vio* vio, enum enum_vio_type type,
    vio->fastsend	=vio_fastsend;
    vio->viokeepalive	=vio_keepalive;
    vio->should_retry	=vio_should_retry;
    vio->was_interrupted=vio_was_interrupted;
    vio->vioclose	=vio_close;
    vio->peer_addr	=vio_peer_addr;
    vio->in_addr	=vio_in_addr;
Loading