[distcc] Bug in FreeBSD's sys_sendfile()
Allan Saddi
allan at saddi.com
Thu Oct 23 06:40:23 GMT 2003
Hi there,
I just installed distcc 2.11.1 on a FreeBSD 4.9-RC. I
encountered a puzzling problem where distcc would always fail to
distribute jobs with this error:
distcc[28349] (dcc_pump_sendfile) ERROR: sendfile returned 0? can't cope
This was always the case when distcc was run on any FreeBSD
machine. However, the FreeBSD machines could accept jobs fine
from non-FreeBSD machines. (Namely OS X with a FreeBSD cross
compiler.)
Anyway, the problem is in sys_sendfile() for FreeBSD. If
sendfile() returns -1, errno is EAGAIN, and sent_bytes == 0
(generally due to a full send queue), then sys_sendfile() will
return 0 which is an error to dcc_pump_sendfile().
The fix is simply to return -1 in this case, so that
dcc_pump_sendfile() will select() on the socket/pipe.
I've included a patch that does just this. It now seems to work
fine. (Although I've only done a few test compiles...)
--
Allan Saddi "The Earth is the cradle of mankind,
allan at saddi.com but we cannot live in the cradle
http://www.saddi.com/allan/ forever." - K.E. Tsiolkovsky
--- src/sendfile.c.orig Tue Jul 8 22:53:08 2003
+++ src/sendfile.c Wed Oct 22 23:03:12 2003
@@ -94,8 +94,13 @@
if (ret == -1) {
/* http://cvs.apache.org/viewcvs.cgi/apr/network_io/unix/sendrecv.c?rev=1.95&content-type=text/vnd.viewcvs-markup */
if (errno == EAGAIN) {
- *offset += sent_bytes;
- return sent_bytes;
+ if (sent_bytes == 0) {
+ /* Didn't send anything. Return error with errno == EAGAIN. */
+ return -1;
+ } else {
+ *offset += sent_bytes;
+ return sent_bytes;
+ }
} else {
return -1;
}
More information about the distcc
mailing list