[CONC-130] Initial wait on connect is wrong direction Created: 2015-06-09  Updated: 2020-11-16  Resolved: 2015-09-08

Status: Closed
Project: MariaDB Connector/C
Component/s: None
Affects Version/s: 2.1
Fix Version/s: 2.2.0

Type: Bug Priority: Minor
Reporter: Matt Fagan Assignee: Georg Richter
Resolution: Fixed Votes: 0
Labels: None
Environment:

All



 Description   

This is the block of code from libmariadb.c:

  if (mysql->options.connect_timeout >= 0 &&
      vio_wait_or_timeout(net->vio, FALSE, mysql->options.connect_timeout * 1000) < 1)
  {
    my_set_error(mysql, CR_SERVER_LOST, SQLSTATE_UNKNOWN,
                 ER(CR_SERVER_LOST_EXTENDED),
                 "handshake: waiting for inital communication packet",
                 errno);
    goto error;
  }

The second option of vio_wait_or_timeout() is "my_bool is_read". If set to true, it waits for a read. If set to false, it waits for a write. The code above is waiting to read a packet from the server, so it should be TRUE. However, it is false, so it waits for a write instead. Since this happens immediately after it has already waited for the connection, this always returns immediately. However, on async it passes the wrong flags (i.e. WAIT_WRITE instead of WAIT_READ) to the async caller, which messes up edge-triggered event handling. It also means that it does not actually wait for the timeout that it is supposed to be waiting for.



 Comments   
Comment by Georg Richter [ 2015-09-08 ]

Fixed in C/C 2.2: commit 7b59e09cf5eecda2029295db10fdc98dfb5dacc3

Comment by Henrik Grubbström [ 2015-09-21 ]

Seems this patch also slipped in a change to switch the socket to non-blocking mode:

{{- else if (socket_block(sock, 1) == SOCKET_ERROR)
+ else if (socket_block(sock, 0) == SOCKET_ERROR)
}}
This causes mysql_real_connect() to fail with "Lost connection to MySQL server at 'handshake: reading inital communication packet', system error: 11" for some remote connections.
Errno 11 is EAGAIN.

Generated at Thu Feb 08 03:03:06 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.