mirror of
				https://git.haproxy.org/git/haproxy.git/
				synced 2025-10-31 16:41:01 +01:00 
			
		
		
		
	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.
 | |
| 
 | |
| 
 |