Allowed up to two EBUSY errors from sendfile().

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.
This commit is contained in:
Maxim Dounin 2014-01-04 03:31:58 +04:00
parent 2539ce036f
commit 9a72030c25
2 changed files with 5 additions and 2 deletions

View File

@ -177,6 +177,7 @@ struct ngx_connection_s {
#if (NGX_HAVE_AIO_SENDFILE)
unsigned aio_sendfile:1;
unsigned busy_count:2;
ngx_buf_t *busy_sendfile;
#endif

View File

@ -169,13 +169,15 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
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;
}
}