comments below...

On Wed, Apr 24, 2002 at 05:09:59PM -0000, [EMAIL PROTECTED] wrote:
> aaron       02/04/24 10:09:59
> 
>   Modified:    support  ab.c
>   Log:
>   Major improvement in concurrent processing for AB:
>   - Enable non-blocking connects.
>   - Prevent quasi-blocking mode apr_recv (which would prevent AB from
>     multiplexing over the entire descriptor set).
>   - Catch other fatal apr_recv() errors.
>   
>   [This patch is slightly different than the one posted to the dev list,
>   but regardless thanks to the many people who reviewed this.]
...
>   @@ -941,16 +945,21 @@
>        char respcode[4];              /* 3 digits and null */
>    
>        r = sizeof(buffer);
>   -    apr_setsocketopt(c->aprsock, APR_SO_TIMEOUT, aprtimeout);
>        status = apr_recv(c->aprsock, buffer, &r);
>   -    if (r == 0 || (status != APR_SUCCESS && !APR_STATUS_IS_EAGAIN(status))) {
>   +    if (APR_STATUS_IS_EAGAIN(status))
>   +   return;
>   +    else if (r == 0 && APR_STATUS_IS_EOF(status)) {

This is the part that changed from yesterday's patch. Now we distinguish
between EOF and EAGAIN, and if there is another non-SUCCESS status then
we treat that as fatal. In my tests I ran against the worker MPM and hit
restart and graceful a few times, which didn't trigger an error here. As
soon as I hit stop AB would error out with:

apr_recv: Connection reset by peer (104)

This seems to be the correct behavior to me. Please test this
and make sure it works on all our quirky systems.

>       good++;
>       close_connection(c);
>       return;
>        }
>   -
>   -    if (APR_STATUS_IS_EAGAIN(status))
>   -   return;
>   +    /* catch legitimate fatal apr_recv errors */
>   +    else if (status != APR_SUCCESS) {
>   +        err_except++; /* XXX: is this the right error counter? */
>   +        /* XXX: Should errors here be fatal, or should we allow a
>   +         * certain number of them before completely failing? -aaron */
>   +        apr_err("apr_recv", status);
>   +    }
>    
>        totalread += r;
>        if (c->read == 0) {

This is a question for the previous ab developers. How lenient should
we be with a single apr_recv error? I tend to think it should be fatal,
but could be persuaded otherwise.

-aaron

Reply via email to