mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 14:21:25 +02:00
Since commit 6b66f3e ([MAJOR] implement autonomous inter-socket forwarding) introduced in 1.3.16-rc1, we've been relying on a stupid mechanism to wake up the task after a write, which was an exact copy-paste of the reader side. The principle was that if we empty a buffer and there's no forwarding scheduled or if the *producer* is not in a connected state, then we wake the task up. That does not make any sense. It happens to wake up too late sometimes (eg, when the request analyser waits for some room in the buffer to start to work), and leads to unneeded wakeups in client-side keep-alive, because the task is woken up when the response is sent, while the analysers are simply waiting for a new request. In order to fix this, we introduce a new channel flag : CF_WAKE_WRITE. It is designed so that an analyser can explicitly request being notified when some data were written. It is used only when the HTTP request or response analysers need to wait for more room in the buffers. It is automatically cleared upon wake up. The flag is also automatically set by the functions which try to write into a buffer from an applet when they fail (bi_putblk() etc...). That allows us to remove the stupid condition above and avoid some wakeups. In http-server-close and in http-keep-alive modes, this reduces from 4 to 3 the average number of wakeups per request, and increases the overall performance by about 1.5%.