Hello,

I was struggling to get connection reuse working when check_reuse_pool was 
enabled. My patch addresses what I had to do to get see TCP connections being 
reused with my haproxy configuration below.

I had very simplistic haproxy.cfg. The IPs and hostnames have been redacted.

global
    log stdout format raw local0
    daemon

    stats socket /tmp/stats

frontend main
    bind *:8080
    mode http
    option httplog
    option http-keep-alive
    log global

    use_backend https:example.com

backend https:example.com
    mode http
    option httpchk GET /ready HTTP/1.1
    http-check send hdr Connection keep-alive hdr Host example.com hdr 
User-Agent "Health-Check"
    http-reuse always
    default-server maxconn 2000 check-reuse-pool inter 3000 pool-purge-delay 
60s check ssl verify none
    server servara  10.0.0.1:443
    server serverb 10.0.0.2:443
    server serverc 10.0.0.3:443


The tcpcheck_use_nondefault_connect() function was considering SSL as a none 
default connection. If your backed servers were using SSL, then you couldn’t 
reuse connections. In terms of http/https, only http backends were eligible for 
connection reuse.

When looking at the code, I was health check connections were being marked 
private, so it didn’t allow for connection to be reused. In my patch, I check 
if  check-reuse-pool is enabled and make sure the connection is not private. I 
also set the hash key.

There is potentially another bug that this patch doesn’t address. If the 
intention was for health checks to reuse the same connections from regular 
traffic, then that is not currently occurring. Regular traffic and health 
checks generate different hash keys. My patch at least makes that health checks 
will reuse an existing TCP connection that was initially created for health 
checking.

The last part of the patch is to ensure that all the data is read for http 
health checks when check-reuse-pool  is set. This ensures that connection reuse 
can be safely reused for the next health checks. The health check I was working 
with was sending a very large json, so the read() system didn’t always read the 
entire message at the time. So, the connection would get closed as there were 
still more bytes to be read from the socket.



Attachment: 0001-BUG-MINOR-checks-Fix-connection-reuse-for-http.patch
Description: 0001-BUG-MINOR-checks-Fix-connection-reuse-for-http.patch

Reply via email to