Hi all,

Continuing on from the discussion about how we might support write completion 
in mod_ssl, I have come up with the following patch below.

I started by changing the event MPM to call all protocol filters instead of 
just the hard coded write filter:

        rv = ap_pass_brigade(c->output_filters, cs->bb);

The first thing that this revealed was that we need to pass a non-empty brigade 
down the stack. I needed a metadata bucket to pass down the stack to make the 
brigade not-empty, and so chose to create a metadata bucket for this purpose 
(more on this below).

The second thing that we needed to support for mod_ssl to have any hope of 
taking advantage of write completion was non-blocking writes to the core output 
filter. This would give mod_ssl the option to setaside any large buckets 
(example: file buckets) and allow the core to enter write completion as soon as 
it saw EAGAIN.

We can't change the API for ap_pass_brigade() to add a nonblock flag like an 
input filter, but we can pass a NONBLOCK metadata bucket down the stack, and 
this dovetails nicely with our need for a metadata bucket above.

So, this patch does the following:

- Takes out the "pass NULL to the core output filter" hack that supported write 
completion previously in the event MPM (other MPMs to follow).
- Add the nonblock bucket, and pass this bucket down the protocol stack during 
write completion.
- Teach the core output filter how to react to the NONBLOCK bucket, returning 
APR_EAGAIN appropriately when the NONBLOCK bucket is present (and APR_SUCCESS 
when not, as per previous behaviour).

In theory, this opens the door for us to support asynchronous filters that know 
about NONBLOCK buckets and nonblocking behaviour. In the case of naive filters, 
we may end up with existing blocking behaviour during write completion, but 
this is no worse than we have now.

Also in theory, all of this can be backported to v2.4.

Regards,
Graham
--

Attachment: httpd-core-nonblocking.patch
Description: Binary data

Reply via email to