Commit c746c08a authored by kroki/tomash@moonlight.intranet's avatar kroki/tomash@moonlight.intranet
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.
parent 01f5bc3a
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) */
}