Hi Yann,

Thanks for your explanation. I got  the issue.
Actually NonStop has maximum limit of 52KB only for writev. Therefore I was
getting 4022 after 49KB. Because after 49KB, apache is adding 8K more bytes
which leads to 56KB. Therefore, writev was failing.

To solve this, I have changed  THRESHOLD_MAX_BUFFER in core_filter.c to
50000. But again I am seeing that after 49KB, apache is adding 8192 Bytes
in it, which leads to failure of writev again.

Do I need to change in more places or the above fix should work.
Thanks
Hemant

On Sun, Sep 16, 2018 at 4:48 PM Yann Ylavic <ylavic....@gmail.com> wrote:

> Hi Hermant,
>
> On Fri, Sep 14, 2018 at 1:53 PM Hemant Chaudhary
> <hemantdude.chaudh...@gmail.com> wrote:
> >
> > Please don't get confuse with Cygwin(Windows). I am running apache on
> NonStop(Tandem).
>
> Well, isn't the error_log attached to the previous message relevant
> (be it cygwin or not)?
> Btw, LogLevel trace6 would help here.
>
> > I have put breakpoint at apr_poll() but it is not going there.
> >
> > Few Events of writing :
> > 1) apache writes 779 bytes to tomcat from apr_socket_sendv() function
> and writev functions returns success.
> > 2) apache writes 24604 bytes to tomcat from apr_socket_sendv() function
> but writev function returns -1 with EWOULDBLOCK and it has
> timeout=0(because set in writev_nonblocking())
> > 3) apache again tries to write 32796 to tomcat from apr_socket_sendv()
> function but writev function returns -1 with EWOULDBLOCK and it has
> timeout=0(because set in writev_nonblocking()).
> > 4) apache again tries to write 40988 to tomcat from apr_socket_sendv()
> function but writev function returns -1 with EWOULDBLOCK and it has
> timeout=0(because set in writev_nonblocking()).
> > 5) apache again tries to write 49180 to tomcat from apr_socket_sendv()
> function but writev function returns -1 with EWOULDBLOCK and it has
> timeout=0(because set in writev_nonblocking()).
>
> OK, all those EWOULDBLOCK make the core output filter to bufferize the
> "pending" data for the next time it's called.
>
> > 6) After this I am getting 4022 error.
>
> Here the 64K bufferized limit/threshold is reached
> (non_file_bytes_in_brigade >= THRESHOLD_MAX_BUFFER in
> ap_core_output_filter()), so the core output filter can't continue
> nonblocking anymore and enters send_brigade_blocking(), which does
> send_brigade_nonblocking() + apr_poll() until the 64K buffer is sent
> completely.
>
> However it seems that on your system the first call to
> send_brigade_nonblocking() fails (since apr_poll() is never called),
> possibly a limit on apr_socket_sendv() (i.e. writev() syscall), either
> more than 64K total bytes or nvec > 4?
>
> I think you need to debug/gdb in send_brigade_nonblocking() for this
> last call and determine where and why send_brigade_nonblocking() =>
> writev_nonblocking() => apr_socket_send() => writev(vec, nvec) fails.
> Maybe a unit test (a simple standalone main() program) can determine
> the limits for writev() on your system, so that the right values for
> THRESHOLD_MAX_BUFFER and MAX_IOVEC_TO_WRITE (in
> "server/core_filters.c") can be tuned for NonStop(Tandem) ...
>
> Hope that helps,
> Yann.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org
> For additional commands, e-mail: users-h...@httpd.apache.org
>
>

Reply via email to