haproxy/src
Willy Tarreau c54aef3180 [BUG] fix random pauses on last segment of a series
During a direct data transfer from the server to the client, if the
system did not have enough buffers anymore, haproxy would not enable
write polling again if it could write at least one data chunk. Under
normal conditions, this would remain undetected because the remaining
data would be pushed by next data chunks.

However, when this happens on the last chunk of a session, or the last
in a series in an interactive bidirectional TCP transfer, haproxy would
only start sending again when the read timeout was reached on the side
it stopped writing, causing long pauses on some protocols such as SQL.

This bug was reported by an Exceliance customer who generously offered
to help us by sending large amounts of traces and running various tests
on production systems.

It is quite hard to trigger it but it becomes easier with a ping-pong
TCP service which transfers random data sizes, with a modified version
of send() able to send packets smaller than the average transfer size.

A cleaner fix would imply only updating the write timeout when data
transfers are *attempted*, not succeeded, but that requires more
sensible code changes without fixing the result. It is a candidate
for a later patch though.
2009-07-27 20:08:06 +02:00
..
acl.c [MINOR] acl: detect and report potential mistakes in ACLs 2009-07-26 19:40:40 +02:00
appsession.c [MINOR] task: keep a task count and clean up task creators 2009-03-21 18:13:21 +01:00
backend.c [MEDIUM] add support for RDP cookie load-balancing 2009-07-14 12:50:39 +02:00
base64.c [BUILD] change declaration of base64tab to fix build with Intel C++ 2008-06-29 17:17:38 +02:00
buffers.c [OPTIM] buffer: replace rlim by max_len 2009-01-09 11:14:39 +01:00
cfgparse.c [MINOR] config: improve error reporting when checking configuration 2009-07-26 17:30:43 +02:00
checks.c [MINOR] apply tcp-smart-connect option for the checks too 2009-07-15 07:16:31 +02:00
client.c [MINOR] acl: add HTTP protocol detection (req_proto_http) 2009-07-12 08:06:20 +02:00
cttproxy.c [CLEANUP] remove many #include <types/xxx> from C files 2008-07-16 10:30:42 +02:00
dumpstats.c [MINOR] stats: better displaying in MSIE 2009-07-15 10:07:05 +02:00
eb32tree.c [MINOR] update ebtree to version 4.1 2009-03-21 10:23:36 +01:00
eb64tree.c [MINOR] merge ebtree version 3.0 2007-11-28 14:20:44 +01:00
ebpttree.c [MINOR] merge ebtree version 3.0 2007-11-28 14:20:44 +01:00
ebtree.c [MINOR] merge ebtree version 3.0 2007-11-28 14:20:44 +01:00
ev_epoll.c [BUG] O(1) pollers should check their FD before closing it 2009-05-10 10:18:54 +02:00
ev_kqueue.c [BUG] O(1) pollers should check their FD before closing it 2009-05-10 10:18:54 +02:00
ev_poll.c [MEDIUM] pollers: don't wait if a signal is pending 2009-05-10 09:57:21 +02:00
ev_select.c [MEDIUM] pollers: don't wait if a signal is pending 2009-05-10 09:57:21 +02:00
ev_sepoll.c [BUG] O(1) pollers should check their FD before closing it 2009-05-10 10:18:54 +02:00
fd.c [MEDIUM] add support for binding to source port ranges during connect 2009-06-10 12:23:32 +02:00
freq_ctr.c [OPTIM] freq_ctr: do not rotate the counters when reading 2009-03-06 14:29:25 +01:00
haproxy.c [BUILD] fix incorrect printf arg count with tcp_splice 2009-07-26 20:40:05 +02:00
hdr_idx.c [CLEANUP] remove many #include <types/xxx> from C files 2008-07-16 10:30:42 +02:00
log.c [MINOR] implement per-logger log level limitation 2009-05-10 17:20:05 +02:00
memory.c [MEDIUM] ensure we don't recursively call pool_gc2() 2009-04-21 02:17:45 +02:00
pipe.c [MEDIUM] introduce pipe pools 2009-01-25 13:49:53 +01:00
proto_http.c [MINOR] add a new CLF log format 2009-07-14 12:50:40 +02:00
proto_tcp.c [BUG] config: tcp-request content only accepts "if" or "unless" 2009-07-14 21:17:05 +02:00
proto_uxst.c [MINOR] print usage on the stats sockets upon invalid commands 2009-07-26 18:16:43 +02:00
protocols.c [CLEANUP] remove many #include <types/xxx> from C files 2008-07-16 10:30:42 +02:00
proxy.c [MEDIUM] add support for RDP cookie persistence 2009-07-14 12:50:40 +02:00
queue.c [BUG] do not dequeue the backend's pending connections on a dead server 2008-12-07 23:51:12 +01:00
rbtree.c [MINOR] imported the rbtree function from Linux kernel 2007-01-07 02:12:57 +01:00
regex.c [CLEANUP] shut warnings 'is*' macros from ctype.h on solaris 2007-06-17 21:51:38 +02:00
server.c [CLEANUP] remove many #include <types/xxx> from C files 2008-07-16 10:30:42 +02:00
session.c [MEDIUM] add support for RDP cookie persistence 2009-07-14 12:50:40 +02:00
sessionhash.c [PATCH] appsessions: cleanup DEBUG_HASH and initialize request_counter 2008-08-13 23:43:26 +02:00
signal.c [BUILD] fix a minor build warning on AIX 2009-07-26 17:32:11 +02:00
standard.c [MEDIUM] add support for binding to source port ranges during connect 2009-06-10 12:23:32 +02:00
stream_interface.c [CLEANUP] buffer_flush() was misleading, rename it as buffer_erase 2009-03-08 20:33:29 +01:00
stream_sock.c [BUG] fix random pauses on last segment of a series 2009-07-27 20:08:06 +02:00
task.c [BUG] task: fix possible timer drift after update 2009-07-14 23:48:55 +02:00
time.c [MINOR] add curr_sec_ms and curr_sec_ms_scaled for current second. 2009-03-05 16:56:16 +01:00
uri_auth.c [CLEANUP] remove 65 useless NULL checks before free 2008-08-03 20:48:50 +02:00