Browse Source

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>
Jo-Philipp Wich 4 years ago
parent
commit
2ee323c010
1 changed files with 1 additions and 0 deletions
  1. 1 0
      file.c

+ 1 - 0
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);
 	}
 }