mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-27 23:22:09 +00:00
6996e15e16
Since the introduction of speculative I/O, it was not always possible to correctly detect a connection establishment. Particularly, in TCP mode, there is no data to send and getsockopt() returns no error. The solution consists in trying a connect() again to get its diagnostic.
29 lines
1.2 KiB
Plaintext
29 lines
1.2 KiB
Plaintext
Normally, we should use getsockopt(fd, SOL_SOCKET, SO_ERROR) on a pending
|
|
connect() to detect whether the connection correctly established or not.
|
|
|
|
Unfortunately, getsockopt() does not report the status of a pending connection,
|
|
which means that it returns 0 if the connection is still pending. This has to
|
|
be expected, because as the name implies it, it only returns errors.
|
|
|
|
With the speculative I/O, a new problem was introduced : if we pretend the
|
|
socket was indicated as ready and we go to the socket's write() function,
|
|
a pending connection will then inevitably be identified as established.
|
|
|
|
In fact, there are solutions to this issue :
|
|
|
|
- send() returns -EAGAIN if it cannot write, so that as long as there are
|
|
pending data in the buffer, we'll be informed about the status of the
|
|
connection
|
|
|
|
- connect() on an already pending connection will return -1 with errno set to
|
|
one of the following values :
|
|
- EALREADY : connection already in progress
|
|
- EISCONN : connection already established
|
|
- anything else will indicate an error.
|
|
|
|
=> So instead of using getsockopt() on a pending connection with no data, we
|
|
will switch to connect(). This implies that the connection address must be
|
|
known within the socket's write() function.
|
|
|
|
|