Fallback to synchronous sendfile() now only done on 3rd EBUSY without
any progress in a row. Not falling back is believed to be better
in case of occasional EBUSY, though protection is still needed to
make sure there will be no infinite loop.
#if (NGX_HAVE_AIO_SENDFILE)
unsigned aio_sendfile:1;
+ unsigned busy_count:2;
ngx_buf_t *busy_sendfile;
#endif
offset = c->busy_sendfile->file_pos;
if (file->aio) {
- c->aio_sendfile = (offset != file->aio->last_offset);
+ c->busy_count = (offset == file->aio->last_offset) ?
+ c->busy_count + 1 : 0;
file->aio->last_offset = offset;
- if (c->aio_sendfile == 0) {
+ if (c->busy_count > 2) {
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
"sendfile(%V) returned busy again",
&file->name);
+ c->aio_sendfile = 0;
}
}