diff options
| author | Maxim Dounin <mdounin@mdounin.ru> | 2014-01-04 03:31:58 +0400 |
|---|---|---|
| committer | Maxim Dounin <mdounin@mdounin.ru> | 2014-01-04 03:31:58 +0400 |
| commit | 9a72030c2507a635d9c17a76a992cec21067dbcf (patch) | |
| tree | 4a7f1b70800631b40f3b9dc6707fc135551ab207 | |
| parent | 2539ce036f6f9d9c2f0e9d6e723d1f0785b9dc0a (diff) | |
| download | nginx-9a72030c2507a635d9c17a76a992cec21067dbcf.tar.gz nginx-9a72030c2507a635d9c17a76a992cec21067dbcf.tar.bz2 | |
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.
| -rw-r--r-- | src/core/ngx_connection.h | 1 | ||||
| -rw-r--r-- | src/http/ngx_http_copy_filter_module.c | 6 |
2 files changed, 5 insertions, 2 deletions
diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h index c7b3b315c..05b1ad4ce 100644 --- a/src/core/ngx_connection.h +++ b/src/core/ngx_connection.h @@ -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 diff --git a/src/http/ngx_http_copy_filter_module.c b/src/http/ngx_http_copy_filter_module.c index 95bc0b835..3ad27b042 100644 --- a/src/http/ngx_http_copy_filter_module.c +++ b/src/http/ngx_http_copy_filter_module.c @@ -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; } } |
