On Fri, Sep 3, 2021 at 12:58 PM Ruediger Pluem <rpl...@apache.org> wrote:
>
>
>
> On 9/3/21 12:27 PM, Yann Ylavic wrote:
> > On Tue, Aug 31, 2021 at 9:29 AM Ruediger Pluem <rpl...@apache.org> wrote:
> >>
> >> On 8/30/21 8:04 PM, yla...@apache.org wrote:
> >>> +
> >>> +                    /* Flush any pending input data now, we don't know 
> >>> when
> >>> +                     * the next POLLIN will trigger and retaining data 
> >>> might
> >>> +                     * deadlock the underlying protocol. We don't check 
> >>> for
> >>> +                     * pending data first with ap_filter_input_pending() 
> >>> since
> >>> +                     * the read from proxy_tunnel_forward() is 
> >>> nonblocking
> >>> +                     * anyway and returning OK if there's no data.
> >>> +                     */
> >>> +                    rc = proxy_tunnel_forward(tunnel, in);
> >>> +                    if (rc != OK) {
> >>> +                        return rc;
> >>> +                    }
> >>
> >> Don't we do all of this already a few lines above if 
> >> ap_filter_input_pending(in->c) == OK?
> >> Why doing it again?
> >
> > With whatever tc (client or origin connection), here on tc->rtnevents
> > & POLLOUT we have out == tc and in == tc->other, so we forward
> > potential pending input data from tc->other to tc (without waiting
> > tc->other to become readable).
> >
> > Below with the same tc (same loop), if tc->rtnevents & POLLIN we
> > forward from tc to tc->other, thus the opposite direction.
>
> I still don't get it. Starting at line 4941 in proxy_util.c we have
>
>
>
>                     /* Flush any pending input data now, we don't know when
>                      * the next POLLIN will trigger and retaining data might
>                      * block the protocol.
>                      */
>                     if (ap_filter_input_pending(in->c) == OK) {
>                         rc = proxy_tunnel_forward(tunnel, in);
>                         if (rc != OK) {
>                             return rc;
>                         }
>                     }
>
>                     /* Flush any pending input data now, we don't know when
>                      * the next POLLIN will trigger and retaining data might
>                      * deadlock the underlying protocol. We don't check for
>                      * pending data first with ap_filter_input_pending() since
>                      * the read from proxy_tunnel_forward() is nonblocking
>                      * anyway and returning OK if there's no data.
>                      */
>                     rc = proxy_tunnel_forward(tunnel, in);
>                     if (rc != OK) {
>                         return rc;
>                     }
>
>
> We execute the same code
>
>
>                         rc = proxy_tunnel_forward(tunnel, in);
>                         if (rc != OK) {
>                             return rc;
>                         }
>
> twice if ap_filter_input_pending(in->c) == OK. Even the comments above these 
> two executions
> start with the same wording. I still ask me why we need to do it twice.

Argh sorry, I thought you were talking about the
proxy_tunnel_forward() in the POLLIN case, because I didn't see that I
had left the old code in (not visible in the diff..).

I think I got it in r1892851 :)

Thanks!

Reply via email to