Justin Erenkrantz <justin_at_erenkrantz.com> writes:
> On Wed, Nov 5, 2014 at 9:24 AM, Philip Martin <philip_at_codematters.co.uk> wrote:
>> Configure a server with both mod_ssl (HTTPS) and mod_deflate (HTTP
>> compression).  Start a checkout and the kill the server.  The client
>> goes into an infinite loop in libsvn_ra_serf/update.c:handle_fetch
>>
>> (gdb) n
>> 1147          svn_txdelta_window_t delta_window = { 0 };
>> (gdb) n
>> 1151          status = serf_bucket_read(response, 8000, &data, &len);
>> (gdb) n
>> 1152          if (SERF_BUCKET_READ_ERROR(status))
>
> What's the status code from serf_bucket_read() on line 1151?  I would
> expect that the socket read should be generating a ECONNABORTED
> somewhere?  -- justin
handle_fetch (request=0x7ffff3e56038, response=0x7ffff3e918b8, 
    handler_baton=0x7ffff3e611e0, pool=0x7ffff3e6d028)
    at ../src/subversion/libsvn_ra_serf/update.c:1152
1152	      if (SERF_BUCKET_READ_ERROR(status))
(gdb) p status
$13 = 0
At the lowest level there is an APR_EOF:
326	    status = read_aggregate(bucket, requested, 1, &vec, &vecs_used);
(gdb) s
read_aggregate (bucket=0x7ffff3e92438, requested=8000, vecs_size=1, 
    vecs=0x7fffffffd2b0, vecs_used=0x7fffffffd2ac)
    at buckets/aggregate_buckets.c:229
229	    aggregate_context_t *ctx = bucket->data;
(gdb) n
233	    *vecs_used = 0;
(gdb) 
235	    if (!ctx->list) {
(gdb) 
236	        if (ctx->hold_open) {
(gdb) 
240	            return APR_EOF;
(gdb) 
In the deflate code this is ignored to "flush the zlib buffer":
serf_deflate_read (bucket=0x7ffff3e924b8, requested=8000, data=0x7fffffffd430, 
    len=0x7fffffffd428) at buckets/deflate_buckets.c:226
226	            if (SERF_BUCKET_READ_ERROR(status)) {
(gdb) p status
$8 = 70014
(gdb) n
230	            if (APR_STATUS_IS_EOF(status)) {
(gdb) n
231	                status = ctx->stream_status;
(gdb) 
232	                if (APR_STATUS_IS_EOF(status)) {
(gdb) p status
$9 = 70014
(gdb) n
237	                    status = APR_SUCCESS;
and later in the same function it's again ignored because the "inflation
wasn't finished":
352	            status = serf_bucket_read(ctx->inflate_stream, requested, data,
(gdb) n
355	            if (APR_STATUS_IS_EOF(status)) {
(gdb) p status
$10 = 70014
(gdb) n
356	                status = ctx->stream_status;
(gdb) 
359	                if (zRC != Z_STREAM_END)
(gdb) 
360	                    return APR_SUCCESS;
-- 
Philip Martin | Subversion Committer
WANdisco // *Non-Stop Data*
Received on 2014-11-11 13:42:20 CET