Commit 69012c75 authored by unknown's avatar unknown
Browse files

Bug#2845 client fails to reconnect if using TCP/IP

 - Change to use non blocking read to empty channel in case of too large sd number
 - Don't check for too large socket number on Windows.


sql/net_serv.cc:
  Windows does not need protection from sd >= FD_SETSIZE, it uses an array to store the sd's it should read from.
  Change the handler for when "net_data_is_ready" returns -1 to perform nonblocking read to empty the net.
  Only include that handler if HAVE_POLL is not defined  and not windows
parent 742549c5
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -229,8 +229,12 @@ static int net_data_is_ready(my_socket sd)
  struct timeval tv;
  int res;

#ifndef __WIN__
  /* Windows uses an _array_ of 64 fd's as default, so it's safe */
  if (sd >= FD_SETSIZE)
    return -1;
  #define NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
#endif

  FD_ZERO(&sfds);
  FD_SET(sd, &sfds);
@@ -271,7 +275,7 @@ void net_clear(NET *net)
  int count, ready;
  DBUG_ENTER("net_clear");
#if !defined(EMBEDDED_LIBRARY)
  while((ready= net_data_is_ready(net->vio->sd)) != 0)
  while((ready= net_data_is_ready(net->vio->sd)) > 0)
  {
    /* The socket is ready */
    if ((count= vio_read(net->vio, (char*) (net->buff),
@@ -286,15 +290,27 @@ void net_clear(NET *net)
    }
    else
    {
      /* No data to read and 'net_data_is_ready' returned "don't know" */
      if (ready == -1)
        break;

      DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
      net->error= 2;
      break;
    }
  }
#ifdef NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
  /* 'net_data_is_ready' returned "don't know" */
  if (ready == -1)
  {
    /* Read unblocking to clear net */
    my_bool old_mode;
    if (!vio_blocking(net->vio, FALSE, &old_mode))
    {
      while ((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);
    }
  }
#endif
#endif
  net->pkt_nr=net->compress_pkt_nr=0;		/* Ready for new command */
  net->write_pos=net->buff;