file: poke ustream after starting deferred program
authorJo-Philipp Wich <jo@mein.io>
Tue, 11 Feb 2020 07:59:48 +0000 (08:59 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 6 May 2020 17:33:38 +0000 (19:33 +0200)
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>
(cherry picked from commit 2ee323c01079248baa9465969df9e25b5fb68cdf)

file.c

diff --git a/file.c b/file.c
index da680a080ae04336718a4510a4da104bf88c5811..85487f8e14d666cf913e8dae79a7ea3e5e4d35fa 100644 (file)
--- a/file.c
+++ b/file.c
@@ -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);
        }
 }