You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Yann Ylavic <yl...@gmail.com> on 2021/09/03 10:27:42 UTC
Re: svn commit: r1892740 - in /httpd/httpd/trunk: changes-entries/ap_proxy_tunnel_run.txt
modules/proxy/proxy_util.c
On Tue, Aug 31, 2021 at 9:29 AM Ruediger Pluem <rp...@apache.org> wrote:
>
> On 8/30/21 8:04 PM, ylavic@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.
Regards;
Yann.
Re: svn commit: r1892740 - in /httpd/httpd/trunk: changes-entries/ap_proxy_tunnel_run.txt
modules/proxy/proxy_util.c
Posted by Yann Ylavic <yl...@gmail.com>.
On Fri, Sep 3, 2021 at 12:58 PM Ruediger Pluem <rp...@apache.org> wrote:
>
>
>
> On 9/3/21 12:27 PM, Yann Ylavic wrote:
> > On Tue, Aug 31, 2021 at 9:29 AM Ruediger Pluem <rp...@apache.org> wrote:
> >>
> >> On 8/30/21 8:04 PM, ylavic@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!
Re: svn commit: r1892740 - in /httpd/httpd/trunk:
changes-entries/ap_proxy_tunnel_run.txt modules/proxy/proxy_util.c
Posted by Ruediger Pluem <rp...@apache.org>.
On 9/3/21 12:27 PM, Yann Ylavic wrote:
> On Tue, Aug 31, 2021 at 9:29 AM Ruediger Pluem <rp...@apache.org> wrote:
>>
>> On 8/30/21 8:04 PM, ylavic@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.
Regards
RĂ¼diger