Here is what I am testing: I am using (currently one) mod_proxy_fcgi member in
a balancer to php-fpm. I have already run into some issues with fcgi:// as a
balancer member as described in
<http://mail-archives.apache.org/mod_mbox/httpd-dev/201109.mbox/%3CB0DADBC2-5154-4C37-93B5-D38B834BE571%40riggs.me%3E>.
So, I have applied a small patch to httpd and php to get around these issues.
Everything has been working perfectly, but we noticed that some uploads fail
with a 503. (We could upload a 181KB file but not 182KB.) I spent considerable
time debugging and tracing the issue. I finally tracked this down to
send_data() in mod_proxy_fcgi. While looping over the calls to
apr_socket_sendv(), it would make 23 successful calls of 8200 bytes followed by
a partial send and then receive EAGAIN. Because this is not APR_SUCCESS, it
breaks the loop in the next line and returns a 503.
Since it received EAGAIN, I just brute-forced it to not break the loop on
EAGAIN, but what is the correct fix? Is there something wrong in my setup? Is
it a bug? Should send_data() be handling EAGAIN and continue the loop up to a
timeout?
Your thoughts are appreciated.
- Jim
My brute-force hack:
--- mod_proxy_fcgi.c.orig 2012-02-03 13:23:09.132232659 -0600
+++ mod_proxy_fcgi.c 2012-02-03 13:25:19.794906516 -0600
@@ -188,7 +188,7 @@
while (to_write) {
apr_size_t n = 0;
rv = apr_socket_sendv(s, vec + offset, nvec - offset, &n);
- if (rv != APR_SUCCESS) {
+ if ((rv != APR_SUCCESS) && !APR_STATUS_IS_EAGAIN(rv)) {
break;
}
if (n > 0) {