]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: hlua: Report to SC when data were consumed on a lua socket
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 18 Jul 2025 14:07:16 +0000 (16:07 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 24 Jul 2025 10:06:48 +0000 (12:06 +0200)
The lua cosocket are quite strange. There is an applet used to handle the
connection and writer and readers subscribed on it to write or read
data. Writers and readers are tasks woken up by the cosocket applet when
data can be consumed or produced, depending on the channels buffers
state. Then the cosocket applet is woken up by writers and readers when read
or write events were performed.

It means the cosocket applet has only few information on what was produced
or consumed. It is the writers and readers responsibility to notify any
blocking. Among other things, the readers must take care to notify the
stream on top of the cosocket applet that some data was consumed. Otherwise,
it may remain blocked, waiting for a write event (a write event from the
stream point of view is a read event from the cosocket point of view).

Thie patch must be backported as far as 2.8, and maybe to 2.6 too.

src/hlua.c

index 7f47884a45347097305650beb842e8baa6907371..c05b42fa548a3fd6389c88207dcb598e9e3b43d0 100644 (file)
@@ -2969,7 +2969,16 @@ __LJMP static int hlua_socket_receive_yield(struct lua_State *L, int status, lua
        }
 
        /* Consume data. */
-       co_skip(oc, len + skip_at_end);
+       if (len + skip_at_end) {
+               co_skip(oc, len + skip_at_end);
+               oc->flags |= CF_WRITE_EVENT | CF_WROTE_DATA;
+               if (s->scb->room_needed < 0 || channel_recv_max(oc) >= s->scb->room_needed)
+                       sc_have_room(s->scb);
+               sc_ep_report_send_activity(s->scf);
+       }
+       else if (!s->scb->room_needed)
+               sc_have_room(s->scb);
+
 
        /* Don't wait anything. */
        applet_will_consume(appctx);