diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-02-11 08:59:48 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-02-11 15:48:59 +0100 |
commit | 2ee323c01079248baa9465969df9e25b5fb68cdf (patch) | |
tree | 615cc4129ef6565270b56cb06ae9ec17a5fe6ff2 | |
parent | 5f9ae5738372aaa3a6be2f0a278933563d3f191a (diff) |
file: poke ustream after starting deferred program
When we're starting a deferred request, the related input ustream might
have gone into read_blocked mode because incoming client request data
exhausted the ustreams internal buffer space. When this happens, edge
triggered uloop read events are "lost" and never re-triggered causing
the script input to never complete.
In order to avoid that deadlock situation, manually poke the input
ustream using ustream_poll() after invoking client_poll_post_data()
which should have drained (some) of the buffered input ustream contents.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | file.c | 1 |
1 files changed, 1 insertions, 0 deletions
@@ -753,6 +753,7 @@ static void uh_complete_request(struct client *cl) cl->dispatch.data_blocked = false; uh_invoke_script(cl, dr->d, dr->path ? &dr->pi : NULL); client_poll_post_data(cl); + ustream_poll(cl->us); } } |