On Sun, 8 Jul 2001, Brian Pane wrote:

> So I guess the ideal algorithm for retrieving the initial request
> from a client is:
>
>   OS with working TCP_DEFER_ACCEPT or equivalent: select first, then read
>   OS without working TCP_DEFER_ACCEPT or equivalent: read first

isn't it the other way around?

if TCP_DEFER_ACCEPT exists, then you don't get an accept() event until the
first data packet has arrived -- so you can (should) assume that a read()
will succeed.

if TCP_DEFER_ACCEPT doesn't exist, then you're probably (as long as modem
users still exist) going to get EAGAIN on the first read().  but i dunno.
maybe someone wants to hack up a production server with some debugging
code to measure if this happens?

maybe you were right to begin with and i should just set
APR_INCOMPLETE_READ by default so we always try read() first :)

> It's probably worth the complexity to support TCP_DEFER_ACCEPT on
> platforms where it's available.  My rationale for this is that if
> some idiot decides to open a thousand connections to your httpd and
> never send anything, it's more lightweight to buffer each one in
> a node in a kernel list while awaiting a timeout than to buffer it
> in a connection_rec in the httpd.

oh yeah it's definitely a win.  i'm just not sure what the APR API should
be given that freebsd and linux's implementations differ so much.  it
should also be a run time config option.

-dean

Reply via email to