On 2013-11-25 22:14, Jeff Trawick wrote:
> On Sun, Nov 24, 2013 at 8:39 PM, Jeff Trawick <traw...@gmail.com> wrote:
> 
>> Let's move this to dev@httpd and omit dev@apr (after this e-mail)...
>>
>>
>> On Sun, Nov 24, 2013 at 8:28 AM, olli hauer <oha...@gmx.de> wrote:
>>
>>> On 2013-11-22 00:08, Jeff Trawick wrote:
>>>> On Thu, Nov 21, 2013 at 5:48 PM, olli hauer <oha...@gmx.de> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> sorry for late response to apr-1.5.0 ...
>>>>>
>>>>> I've done some tests with apr-1.5.0 on FreeBSD 10 (amd64)
>>>>> and it seems there is an issue that breaks apache24.
>>>>>
>>>>> With apr-1.5.0 apache22 works but apache24 is broken.
>>>>> apache starts fine, nothing special in the logs or during
>>>>> start with -X but no response is coming back.
>>>>>
>>>>> apr/apr-util test:
>>>>> ========================================
>>>>> apr-1.5.0:      all tests passed [1]
>>>>> apr-util-1.5.3: all tests passed
>>>>>
>>>>>
>>>>> working configurations (FreeBSD beta3 [1]
>>>>> =========================================
>>>>> apache22-2.2.26 apr-1.4.8 apr-util-1.5.3
>>>>> apache22-2.2.26 apr-1.5.0 apr-util-1.5.3
>>>>> apache24-2.4.6  apr-1.4.8 apr-util-1.5.2
>>>>> apache24-2.4.7  apr-1.4.8 apr-util-1.5.2
>>>>> apache24-2.4.6  apr-1.4.8 apr-util-1.5.3
>>>>> apache24-2.4.7  apr-1.4.8 apr-util-1.5.3
>>>>>
>>>>> broken combinations:
>>>>> =========================================
>>>>> apache24-2.4.6  apr-1.5.0 apr-util-1.5.3
>>>>> apache24-2.4.7  apr-1.5.0 apr-util-1.5.3
>>>>>
>>>>> All tests where done with MPM worker.
>>>>>
>>>>>
>>>>> FreeBSD 8.4 (amd64) seems OK in all combinations
>>>>> FreeBSD 9.2 (amd64) seems OK in all combinations
>>>>>
>>>>> [1] FreeBSD 10 beta3 with iconv UTF7 patch r258316
>>>>> (head/lib/libiconv_modules/UTF7/citrus_utf7.c)
>>>>>
>>>>> Any hints where to start?
>>>>>
>>>>
>>>> Set LogLevel trace8 and compare good vs. bad.
>>>> Start with -X then attach with dtruss and compare good vs. bad.
>>>> Get open fds displayed by lsof and compare good vs. bad.
>>>> Is connection to client held open?  Get backtraces.
>>>>
>>>> I just compared 1.4.8 vs. 1.5.0 and didn't see anything that looked
>>>> remotely likely.
>>>>
>>>
>>> Comparing trace8 outputs showed the request is processed
>>> but the following code snippet in server/core_filters.c
>>> never get TRUE except the client cancels the request.
>>>
>>> To get some better log entries I've used server/core_filters.c
>>> r1510295 from trunk.
>>>
>>>
>>> @@server/core_filters.c (line 510)
>>> if (APR_BUCKET_IS_FLUSH(bucket)
>>>     || non_file_bytes_in_brigade >= THRESHOLD_MAX_BUFFER
>>>     || morphing_bucket_in_brigade
>>>     || eor_buckets_in_brigade > MAX_REQUESTS_IN_PIPELINE) {
>>> ...
>>> }
>>>
>>> [http:trace3] http_filters.c(974):[client x.x.x.x:x] Response sent with
>>> status 200, headers:
>>> [http:trace5] http_filters.c(983):[client x.x.x.x:x]   Date: Sun, 24 Nov
>>> 2013 10:28:37 GMT
>>> [http:trace5] http_filters.c(986):[client x.x.x.x:x]   Server:
>>> Apache/2.4.7 (FreeBSD)
>>> [http:trace4] http_filters.c(804):[client x.x.x.x:x]   Last-Modified:
>>> Sat, 23 Nov 2013 16:51:58 GMT
>>> [http:trace4] http_filters.c(804):[client x.x.x.x:x]   ETag:
>>> \\"be-4ebdaf2ef2780\\"
>>> [http:trace4] http_filters.c(804):[client x.x.x.x:x]   Accept-Ranges:
>>> bytes
>>> [http:trace4] http_filters.c(804):[client x.x.x.x:x]   Content-Length: 190
>>> [http:trace4] http_filters.c(804):[client x.x.x.x:x]   Keep-Alive:
>>> timeout=5, max=100
>>> [http:trace4] http_filters.c(804):[client x.x.x.x:x]   Connection:
>>> Keep-Alive
>>> [http:trace4] http_filters.c(804):[client x.x.x.x:x]   Content-Type:
>>> text/html
>>> [core:trace8] core_filters.c(576):[client x.x.x.x:x] brigade contains:
>>> bytes: 284, non-file bytes: 284, eor buckets: 0, morphing buckets: 0
>>> [core:trace8] core_filters.c(576):[client x.x.x.x:x] brigade contains:
>>> bytes: 474, non-file bytes: 284, eor buckets: 0, morphing buckets: 0
>>> [core:trace8] core_filters.c(576):[client x.x.x.x:x] brigade contains:
>>> bytes: 474, non-file bytes: 284, eor buckets: 1, morphing buckets: 0
>>>
>>>
>>> This following lines are only seen if
>>>   apr-1-5.0 was build without IPv6 support
>>>   or apache24 was build with v4-mapping enabled
>>>   or "Listen $IP:$port" is given in httpd.conf
>>>
>>> [core:trace6] core_filters.c(526):[client x.x.x.x:x] will flush because
>>> of FLUSH bucket
>>> [core:trace8] core_filters.c(528):[client x.x.x.x:x] seen in brigade so
>>> far: bytes: 474, non-file bytes: 284, eor buckets: 1, morphing buckets: 0
>>> [core:trace8] core_filters.c(555):[client x.x.x.x:x] flushing now
>>> [core:trace8] core_filters.c(568):[client x.x.x.x:x] total bytes written:
>>> 474
>>> [core:trace8] core_filters.c(576):[client x.x.x.x:x] brigade contains:
>>> bytes: 0, non-file bytes: 0, eor buckets: 0, morphing buckets: 0
>>>
>>> However a flush is triggered if the client cancels the request, but no
>>> data is sent over the wire ...
>>>
>>>
>>> I've searched if other also have seen a similar issue and found
>>> instead the following interesting article from Nov. 2002 ;)
>>> http://people.apache.org/~trawick/v4mapped.html
>>>
>>>
>> I haven't analyzed the trace messages you showed above.  Here's what I did
>> on FreeBSD 9:
>>
>> Apply this patch to fix the version check for disabling v4mapped addresses:
>>
>> Index: configure.in
>> ===================================================================
>> --- configure.in (revision 1545127)
>> +++ configure.in (working copy)
>> @@ -774,7 +774,10 @@
>>  ],
>>  [
>>      case $host in
>> -    *freebsd5*|*netbsd*|*openbsd*)
>> +    *freebsd[1234].*)
>> +        v4mapped=yes
>> +        ;;
>> +    *freebsd*|*netbsd*|*openbsd*)
>>          v4mapped=no
>>          ;;
>>      *)
>>
>> That gives me
>>
>> $ bin/apachectl -V
>> AH00558: httpd: Could not reliably determine the server's fully qualified
>> domain name, using 127.0.0.1. Set the 'ServerName' directive globally to
>> suppress this message
>> Server version: Apache/2.4.8-dev (Unix)
>> Server built:   Nov 24 2013 20:21:30
>> Server's Module Magic Number: 20120211:27
>> Server loaded:  APR 1.5.1-dev, APR-UTIL 1.5.4-dev
>> Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.4-dev
>> Architecture:   64-bit
>> Server MPM:     worker
>>   threaded:     yes (fixed thread count)
>>     forked:     yes (variable process count)
>> Server compiled with....
>>  -D APR_HAS_SENDFILE
>>  -D APR_HAS_MMAP
>>  -D APR_HAVE_IPV6 (IPv4-mapped addresses disabled)
>>
>> The last line shown indicates that mapped addresses are disabled in this
>> build.
>>
>> The only Listen I have is "Listen 8080".  procstat says I have separate
>> sockets, as expected:
>>
>> 60734 httpd               3 s - rw---n---   9       0 TCP ::.8080 ::.0
>> 60734 httpd               4 s - rw---n---   9       0 TCP 0.0.0.0:8080
>> 0.0.0.0:0
>>
>> From netstat:
>>
>> tcp4       0      0 *.8080                 *.*                    LISTEN
>> tcp6       0      0 *.8080                 *.*                    LISTEN
>>
>> (You had shown sockstat before; this is the same stuff.)
>>
>> --/--
>>
>> Are you able to check for the issue on FreeBSD 9?
>>
>> When it hangs, are you connecting to the IPv4 listener or the IPv6
>> listener?  Does it matter whether you use loopback or the address of a
>> network interface?
>>
>> You're using a regular web browser in the failing case, right?  Have you
>> tried something as simple as netcat for the failing address/port?  Example:
>>
>> $ echo "GET /" | nc 127.0.0.1 8080
>> <html><body><h1>It works!</h1></body></html>
>>
>> --
>> Born in Roswell... married an alien...
>> http://emptyhammock.com/
>>
> 
> I see the hang on FreeBSD 10 Beta 3 using the same sources, though clang is
> installed instead of gcc.
> 
> FWIW, the simple "GET /<EOF>" request works but an HTTP/1.1 request from
> telnet or from Firefox hangs.  I am able to try loopback over IPv4 and IPv6
> and they both hang.
> 
> Now move the gcc binaries from FreeBSD 9 to FreeBSD 10 (along with
> libpcre.0): I don't see the hang with the simple testcases that triggered
> it with the clang builds.
> 
> I wouldn't be surprised if your apr-1.5-as-trigger observation reflects
> "accidents" like code moving around and/or changing in size.  I didn't see
> any interesting changes in the source that would affect the path where the
> hang occurs.  But who really knows :)
> 

Playing with the code (damage included), moving 'flush_upto = next;'
and the page loads. I still have some problems to understand how complete
code is working (or even not).

What is not clear to me why 'if (APR_BUCKET_IS_FLUSH(bucket)' is not triggered?


--- core_filters.c.orig
+++ core_filters.c
@@ -527,13 +527,14 @@
             /*
              * Defer the actual blocking write to avoid doing many writes.
              */
-            flush_upto = next;
+//            flush_upto = next;

             bytes_in_brigade = 0;
             non_file_bytes_in_brigade = 0;
             eor_buckets_in_brigade = 0;
             morphing_bucket_in_brigade = 0;
         }
+            flush_upto = next;
     }

     if (flush_upto != NULL) {

-- 
olli

Reply via email to