httpd-bugs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bugzi...@apache.org
Subject [Bug 61616] mod_proxy_connect: stall and connection loss on bi-directional traffic
Date Sat, 21 Oct 2017 14:39:45 GMT
https://bz.apache.org/bugzilla/show_bug.cgi?id=61616

--- Comment #21 from Carsten Wolff <carsten@wolffcarsten.de> ---
(In reply to Yann Ylavic from comment #19)
> Thanks for the patch Carsten, but there can't be an exception for
> send_brigade_blocking() to block when the conditions are met, the core
> output filter must control the memory buckets in flight (set aside).

Sure, using the timeout value as a criterion in send_brigade_blocking is ugly.
I see there's a APR_NONBLOCK_READ flag one can pass to ap_get_brigade(). Maybe
there should be a APR_NONBLOCK_WRITE flag one could pass to ap_pass_brigade()
(and further down to send_brigade_blocking) to absolutely make sure, the poll()
there is never hit?

(In reply to Yann Ylavic from comment #20)
> Created attachment 35446 [details]
> Handle POLLOUT in proxy_connect (v6)
> 
> This new patch gives more control (flags) to the caller of
> ap_proxy_transfer_between_connections(), which can now stop its loop when
> the output filter chain starts buffering data.
>
> It also refactors proxy_connect_handler() to have a symetric loop because
> the logic had to be duplicated on both sides (the more we add logic, the
> less it becomes readable).

Much nicer indeed, you also choose the right socket on POLLOUT now, which was
wrong in v5.

> I made more testing with it and it seems to work as expected here..

It gives me a hard time to reproduce the original issue. :-) But, it now blocks
at the end of the transfer in mod_proxy_connect's poll() for 300 seconds before
finishing successfully. See backtrace and log below.

> I also have an update for attachment 35427 [details] but this patch is
> actually barely related (the above patch should work on its own for the
> proxy connect case).
> 
> I can provide it here too if you wish because it allows to transfer more
> than 8K bytes at a time (a current limitation in mod_proxy_connect).

This might be interesting for performance of connections on loopback, where the
segment size is 64k.

Current backtrace:
Thread 2 (Thread 0x7ffa5f0b9700 (LWP 5797)):
#0  0x00007ffa63d180f3 in epoll_wait () at
../sysdeps/unix/syscall-template.S:84
#1  0x00007ffa6420e201 in impl_pollset_poll (pollset=0x7ffa64990f78,
timeout=<optimized out>, num=0x7ffa5f0b6a94, descriptors=0x7ffa5f0b6aa0) at
./poll/unix/epoll.c:266
#2  0x00007ffa60b263b7 in proxy_connect_handler (r=0x7ffa6498f0a0,
worker=<optimized out>, conf=<optimized out>, url=<optimized out>,
proxyname=<optimized out>, 
    proxyport=<optimized out>) at mod_proxy_connect.c:442


Log tail of the end of the transfer:
[Sat Oct 21 16:28:29.475904 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:28:29.476140 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [client ::1:33340] writev_nonblocking: 8192/8192 bytes
[Sat Oct 21 16:28:29.476241 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:28:29.476510 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [client ::1:33340] writev_nonblocking: 8192/8192 bytes
[Sat Oct 21 16:28:29.476685 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:28:29.476985 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [client ::1:33340] writev_nonblocking: 8192/8192 bytes
[Sat Oct 21 16:33:46.176810 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.178932 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.179110 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [remote ::1:873] writev_nonblocking: 4/4 bytes
[Sat Oct 21 16:33:46.186064 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [client ::1:33340] writev_nonblocking: 4272/4272 bytes
[Sat Oct 21 16:33:46.199852 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.200032 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [remote ::1:873] writev_nonblocking: 5/5 bytes
[Sat Oct 21 16:33:46.200317 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.200365 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [client ::1:33340] writev_nonblocking: 5/5 bytes
[Sat Oct 21 16:33:46.200793 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.200898 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [remote ::1:873] writev_nonblocking: 7/7 bytes
[Sat Oct 21 16:33:46.200920 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.200952 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [client ::1:33340] writev_nonblocking: 6/6 bytes
[Sat Oct 21 16:33:46.242005 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.242141 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [client ::1:33340] writev_nonblocking: 25/25 bytes
[Sat Oct 21 16:33:46.242524 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.244044 2017] [core:trace6] [pid 5795:tid 140713313146624]
core_filters.c(878): [remote ::1:873] writev_nonblocking: 5/5 bytes
[Sat Oct 21 16:33:46.256132 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.256195 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): (70014)End of file found: [client ::1:33340]
ap_proxy_transfer_between_connections complete
[Sat Oct 21 16:33:46.256236 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): [client ::1:33340] ap_proxy_transfer_between_connections
complete
[Sat Oct 21 16:33:46.256245 2017] [proxy:trace2] [pid 5795:tid 140713313146624]
proxy_util.c(3845): (70014)End of file found: [client ::1:33340]
ap_proxy_transfer_between_connections complete
[Sat Oct 21 16:33:46.256368 2017] [proxy_connect:trace2] [pid 5795:tid
140713313146624] mod_proxy_connect.c(558): [client ::1:33340] finished with
poll() - cleaning up

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


Mime
View raw message