I can verify that apache2-mpm-worker is indeed having this problem when
serving static files from a CIFS mount on a modern lenny system.

Each HTTP fetch is capable of pulling some smallish amount of bytes
(~10K for some connections i've tried) before the TCP connection
abruptly terminates.

On such a pull, an strace shows:

> sendfile(9, 11, [0], 85678) = -1 EOVERFLOW (Value too large for defined data 
> type)

at the time of the send, and if LogLevel is set to debug, apache only
logs the following single line to error.log  (client IP has been
anonymized):

> [Wed Mar 25 02:30:01 2009] [info] [client www.xxx.yyy.zzz] (75)Value too 
> large for defined data type: core_output_filter: writing data to the network

I agree with Bastian Blank that it seems like Apache is misbehaving
here.  If sendfile(2) fails, shouldn't apache gracefully fall back to
non-sendfile behavior (based on the number of bytes transferred, which
should be in the *offset parameter).

sendfile(2) even says:

       Applications  may  wish  to  fall  back to read(2)/write(2) in
       the case where sendfile() fails with EINVAL or ENOSYS.

Interestingly, when i tried experimenting with this by doing sendfile
from a CIFS-mounted file through a local UNIX-domain socket [0],
sendfile(2) returned EOVERFLOW, but the entire file transferred cleanly,
even for a ~5MB file.

Regards,

        --dkg

[0] http://cmrg.fifthhorseman.net/browser/trunk/test/sendfile

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to