Here is a better trace of the success and failure scenarios, with messages flushed in the proper order and socket creation and close events included.
The difference in the success and failure is that the second reconnecting client fd=0009 ends up in state en=22 on the success scenario and is eventually re-added to the poll. In the failure scenario, fd=0009 ends up in state en=20 and is never re-polled after its associated server (000b) is connected. Success ======= root@ip-172-31-31-59:/home/admin/src/haproxy-1.6.7# ./haproxy -f /etc/haproxy/haproxy.cfg [WARNING] 201/190425 (32358) : <debug> mode incompatible with <quiet>, <daemon> and <systemd>. Keeping <debug> only. Available polling systems : epoll : pref=300, test result OK poll : pref=200, test result OK select : pref=150, test result FAILED Total: 3 (2 usable), will use epoll. Using epoll() as the polling mechanism. epoll_ctl: op=1, fd=0004 ev=2001, eo=01, en=05 epoll_ctl: op=1, fd=0005 ev=2001, eo=01, en=05 epoll_ctl: op=1, fd=0007 ev=2001, eo=01, en=05 == do_poll == 00000000:test_og_in.accept(0007)=0008 from [10.59.159.20:54316] create_server_socket: fd=0009 epoll_ctl: op=1, fd=0008 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=0009 ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=61, en=25 == do_poll == 00000001:test_og_in.accept(0007)=000a from [10.59.159.20:54317] create_server_socket: fd=000b epoll_ctl: op=1, fd=000a ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=000b ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=2, fd=000b ev=0, eo=63, en=23 == do_poll == epoll_ctl: op=1, fd=000b ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=3, fd=000b ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=000b ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=000b ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=000b ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=2, fd=000b ev=0, eo=26, en=22 epoll_ctl: op=2, fd=0009 ev=0, eo=26, en=22 == do_poll == close: fd=0009 close: fd=0008 00000000:test_og.srvcls[0008:0009] 00000000:test_og.clicls[0008:0009] 00000000:test_og.closed[0008:0009] close: fd=000b close: fd=000a 00000001:test_og.srvcls[000a:000b] 00000001:test_og.clicls[000a:000b] 00000001:test_og.closed[000a:000b] 00000002:test_og_in.accept(0007)=0008 from [10.59.159.20:54319] create_server_socket: fd=0009 epoll_ctl: op=1, fd=0008 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=0009 ev=4, eo=12, en=52 == do_poll == close: fd=0009 00000003:test_og_in.accept(0007)=0009 from [10.59.159.20:54320] create_server_socket: fd=000a epoll_ctl: op=1, fd=0009 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a epoll_ctl: op=2, fd=0009 ev=0, eo=26, en=22 == do_poll == epoll_ctl: op=2, fd=0008 ev=0, eo=26, en=22 == do_poll == create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=1, fd=0008 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=3, fd=000a ev=2005, eo=51, en=55 == do_poll == epoll_ctl: op=3, fd=000a ev=2001, eo=65, en=25 == do_poll == create_server_socket: fd=000b epoll_ctl: op=1, fd=000b ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=1, fd=0009 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=3, fd=000b ev=2005, eo=51, en=55 == do_poll == epoll_ctl: op=3, fd=000b ev=2001, eo=65, en=25 == do_poll == ^C Failure ======== root@ip-172-31-31-59:/home/admin/src/haproxy-1.6.7# ./haproxy -f /etc/haproxy/haproxy.cfg [WARNING] 201/185844 (32353) : <debug> mode incompatible with <quiet>, <daemon> and <systemd>. Keeping <debug> only. Available polling systems : epoll : pref=300, test result OK poll : pref=200, test result OK select : pref=150, test result FAILED Total: 3 (2 usable), will use epoll. Using epoll() as the polling mechanism. epoll_ctl: op=1, fd=0004 ev=2001, eo=01, en=05 epoll_ctl: op=1, fd=0005 ev=2001, eo=01, en=05 epoll_ctl: op=1, fd=0007 ev=2001, eo=01, en=05 == do_poll == 00000000:test_og_in.accept(0007)=0008 from [10.59.159.20:54268] create_server_socket: fd=0009 epoll_ctl: op=1, fd=0008 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=0009 ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=2, fd=0009 ev=0, eo=63, en=23 == do_poll == epoll_ctl: op=1, fd=0009 ev=2001, eo=21, en=25 == do_poll == 00000001:test_og_in.accept(0007)=000a from [10.59.159.20:54269] create_server_socket: fd=000b epoll_ctl: op=1, fd=000a ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=000b ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=3, fd=000b ev=2001, eo=61, en=25 == do_poll == epoll_ctl: op=3, fd=0009 ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=000b ev=2005, eo=15, en=55 == do_poll == epoll_ctl: op=3, fd=0009 ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=3, fd=000b ev=2001, eo=65, en=25 == do_poll == epoll_ctl: op=2, fd=000b ev=0, eo=26, en=22 == do_poll == epoll_ctl: op=2, fd=0009 ev=0, eo=26, en=22 == do_poll == close: fd=0009 close: fd=0008 00000000:test_og.srvcls[0008:0009] 00000000:test_og.clicls[0008:0009] 00000000:test_og.closed[0008:0009] close: fd=000b close: fd=000a 00000001:test_og.srvcls[000a:000b] 00000001:test_og.clicls[000a:000b] 00000001:test_og.closed[000a:000b] 00000002:test_og_in.accept(0007)=0008 from [10.59.159.20:54276] create_server_socket: fd=0009 epoll_ctl: op=1, fd=0008 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=0009 ev=4, eo=12, en=52 == do_poll == close: fd=0009 00000003:test_og_in.accept(0007)=0009 from [10.59.159.20:54277] create_server_socket: fd=000a epoll_ctl: op=1, fd=0009 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a epoll_ctl: op=2, fd=0009 ev=0, eo=24, en=20 == do_poll == epoll_ctl: op=2, fd=0008 ev=0, eo=26, en=22 == do_poll == create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == close: fd=000a create_server_socket: fd=000a epoll_ctl: op=1, fd=000a ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=1, fd=0008 ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=3, fd=000a ev=2005, eo=51, en=55 == do_poll == epoll_ctl: op=3, fd=000a ev=2001, eo=65, en=25 == do_poll == create_server_socket: fd=000b epoll_ctl: op=1, fd=000b ev=4, eo=12, en=52 == do_poll == epoll_ctl: op=2, fd=000b ev=0, eo=63, en=23 == do_poll == epoll_ctl: op=1, fd=000b ev=2001, eo=21, en=25 == do_poll == epoll_ctl: op=2, fd=0008 ev=0, eo=26, en=22 == do_poll == close: fd=000a close: fd=0008 00000002:test_og.srvcls[0008:000a] 00000002:test_og.clicls[0008:000a] 00000002:test_og.closed[0008:000a]