Commit 32741794 authored by unknown's avatar unknown
Browse files

BUG#9678: Client library hangs after network communication failure

Socket timeouts in client library were used only on Windows.

The solution is to use socket timeouts in client library on all
systems were they are supported.

No test case is provided because it is impossible to simulate network
failure in current test suit.


sql/net_serv.cc:
  Retry indefinitely only if got EINTR.
vio/viosocket.c:
  Set socket timeouts on POSIX systems as well as on Windows.
parent 04d60b38
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -747,7 +747,7 @@ my_real_read(NET *net, ulong *complen)
#endif /* EXTRA_DEBUG */
	  }
#if defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER)
	  if (vio_should_retry(net->vio))
	  if (vio_errno(net->vio) == SOCKET_EINTR)
	  {
	    DBUG_PRINT("warning",("Interrupted read. Retrying..."));
	    continue;
+22 −8
Original line number Diff line number Diff line
@@ -333,16 +333,30 @@ my_bool vio_poll_read(Vio *vio,uint timeout)
}


void vio_timeout(Vio *vio __attribute__((unused)),
		 uint which __attribute__((unused)),
                 uint timeout __attribute__((unused)))
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)

#ifdef __WIN__
  ulong wait_timeout= (ulong) timeout * 1000;
  (void) setsockopt(vio->sd, SOL_SOCKET, 
	which ? SO_SNDTIMEO : SO_RCVTIMEO, (char*) &wait_timeout,
        sizeof(wait_timeout));
#endif /* __WIN__ */

  /* Windows expects time in milliseconds as int. */
  int wait_timeout= (int) timeout * 1000;

#else  /* ! __WIN__ */

  /* POSIX specifies time as struct timeval. */
  struct timeval wait_timeout;
  wait_timeout.tv_sec= timeout;
  wait_timeout.tv_usec= 0;

#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));

#endif /* defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO) */
}